반응형
https://school.programmers.co.kr/learn/courses/30/lessons/72410?language=java
1. 정규표현식 없는 풀이
/**
* 신규 아이디 추천 (카카오 2021 코딩테스트)
* https://school.programmers.co.kr/learn/courses/30/lessons/72410
*/
public class Solution {
public String solution(String new_id) {
System.out.println("[주어진 값]"+new_id);
String answer = "";
//[1단계] new_id의 모든 대문자를 대응되는 소문자로 치환
// => String.toLowerCase() : 소문자로 치환
// => String.toUpperCase() : 대문자로 치환
new_id = new_id.toLowerCase();
System.out.println("[1단계]"+new_id);
//[2단계] new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
// => String.charAt(int Index) : 주어진 문자열 위치의 값을 문자로 반환 [output] char
// => Character.isAlphabetic(int codePoint) : 알파벳인지 판단 [output] true / false
// => Character.isDigit(int codePoint / char ch) : 숫자인지 판단 [output] true / false
// => Character.isLetter(int codePoint / char ch) : 문자인지 판단 [output] true / false
//[boxing] Integer num = Integer.valueOf("100");
//[unboxing] int n1 = num1.intValue();
//[autoUnboxing] int n2 = num;
for(int i=0; i<new_id.length(); i++) {
char ch = new_id.charAt(i);
if(Character.isAlphabetic(ch) || Character.isDigit(ch) ||
ch == '-' || ch == '_' || ch== '.' ) {
answer += ch;
}
}
System.out.println("[2단계]"+answer);
//[3단계] new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
// => String.indexOf(String str) - 문자위치의 인덱스로 반환, 없으면 -1 [output] int
// => String.replace(String regEX, String replacement) - 주어진 문자열을 치환해 반환 [output] String
// => while : 명령에 대한 반복횟수가 불확실할 때 이용
// => while(조건식){} : 조건식이 false가 될 때까지 반복
while(answer.indexOf("..") != -1){
answer = answer.replace("..",".");
}
System.out.println("[3단계]"+answer);
//[4단계] new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거
// => String.subString(int beginIndex) - 원하는 곳만 분리 [output](시작첨자)부터 (끝)까지
// => String.subString(int beginIndex, int endIndex) - 원하는 곳만 분리 [output](시작첨자)부터 (마지막첨자-1) 까지
if(!answer.isEmpty() && answer.charAt(0) == '.') { //마침표 맨 앞
answer = answer.substring(1);
}
if(!answer.isEmpty() && answer.charAt(answer.length()-1) == '.') { //마침표 맨 끝
answer = answer.substring(0,answer.length()-1);
}
System.out.println("[4단계]"+answer);
//[5단계] new_id가 빈 문자열이라면, new_id에 "a"를 대입
if(answer.isEmpty()) answer = "a";
System.out.println("[5단계]"+answer);
//[6단계] new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
if(answer.length() > 15){
answer = answer.substring(0,15); //첨자 0~14까지 = 총 15자
if(answer.charAt(answer.length()-1) == '.'){
answer = answer.substring(0,answer.length()-1);
}
}
System.out.println("[6단계]"+answer);
//[7단계] new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
// => 조건이 참이 될때까지 무한반복 실행해야 하므로 if문이 아닌 while문으로 작성하기
while(answer.length() < 3){
answer += answer.charAt(answer.length()-1); //마지막 문자를 계속 붙이기
}
System.out.println("[7단계]"+answer);
return answer;
}
public static void main(String[] args){
Solution sol = new Solution();
System.out.println("정답은 : "+sol.solution("...!@BaT#*..y.abcdefghijklm"));
System.out.println("정답은 : "+sol.solution("z-+.^."));
System.out.println("정답은 : "+sol.solution("=.="));
System.out.println("정답은 : "+sol.solution("123_.def"));
System.out.println("정답은 : "+sol.solution("abcdefghijklmn.p"));
}
}
/*
[주어진 값]...!@BaT#*..y.abcdefghijklm
[1단계]...!@bat#*..y.abcdefghijklm
[2단계]...bat..y.abcdefghijklm
[3단계].bat.y.abcdefghijklm
[4단계]bat.y.abcdefghijklm
[5단계]bat.y.abcdefghijklm
[6단계]bat.y.abcdefghi
[7단계]bat.y.abcdefghi
정답은 : bat.y.abcdefghi
[주어진 값]z-+.^.
[1단계]z-+.^.
[2단계]z-..
[3단계]z-.
[4단계]z-
[5단계]z-
[6단계]z-
[7단계]z--
정답은 : z--
[주어진 값]=.=
[1단계]=.=
[2단계].
[3단계].
[4단계]
[5단계]a
[6단계]a
[7단계]aaa
정답은 : aaa
[주어진 값]123_.def
[1단계]123_.def
[2단계]123_.def
[3단계]123_.def
[4단계]123_.def
[5단계]123_.def
[6단계]123_.def
[7단계]123_.def
정답은 : 123_.def
[주어진 값]abcdefghijklmn.p
[1단계]abcdefghijklmn.p
[2단계]abcdefghijklmn.p
[3단계]abcdefghijklmn.p
[4단계]abcdefghijklmn.p
[5단계]abcdefghijklmn.p
[6단계]abcdefghijklmn
[7단계]abcdefghijklmn
정답은 : abcdefghijklmn
*/
2. 정규표현식 있는 풀이
/**
* 신규 아이디 추천 (카카오 2021 코딩테스트)
* https://school.programmers.co.kr/learn/courses/30/lessons/72410
*/
public class Solution2 {
//1. solution 메소드
public String solution(String new_id) {
String s = new KAKAOID(new_id)
.replaceToLowerCase()
.filter()
.toSingleDot()
.noStartEndDot()
.noBlank()
.noGreaterThan16()
.noLessThan2()
.getResult();
return s;
}
//2. 메인 메소드
public static void main(String[] args){
Solution2 sol = new Solution2();
System.out.println("정답은 : "+sol.solution("...!@BaT#*..y.abcdefghijklm"));
System.out.println("정답은 : "+sol.solution("z-+.^."));
System.out.println("정답은 : "+sol.solution("=.="));
System.out.println("정답은 : "+sol.solution("123_.def"));
System.out.println("정답은 : "+sol.solution("abcdefghijklmn.p"));
}
/**
* KAKAOID 클래스 (중첩 내부 클래스)
*/
private static class KAKAOID {
private String s;
KAKAOID(String s) {
this.s = s;
}
private KAKAOID replaceToLowerCase() {
s = s.toLowerCase();
return this;
}
private KAKAOID filter() {
// 정규표현식
// => [^a-z0-9._-] >>> "" : ^(부정), a~z , 0~9, ., _, - 을 제외한 값들은 빈값으로 변경하시오
// => [.]{2,} >>> "." : 마침표가 2개 이상 연속된 부분은 .을 변경하시오
// => . : 임의의 문자
// => [.]대괄호 안의 마침표(.) : "마침표" 그 자체
// => {2,} : 최소 2개 이상을 의미하는 반복 연산자
// => ^[.]|[.]$ >>> "" : 마침표로 시작하거나 마침표로 끝날 경우 빈값으로 변경하시오
// => ^ : 문자열의 시작
// => $ : 문자열의 끝
s = s.replaceAll("[^a-z0-9._-]", "");
return this;
}
private KAKAOID toSingleDot() {
s = s.replaceAll("[.]{2,}", ".");
return this;
}
private KAKAOID noStartEndDot() {
s = s.replaceAll("^[.]|[.]$", "");
return this;
}
private KAKAOID noBlank() {
s = s.isEmpty() ? "a" : s;
return this;
}
private KAKAOID noGreaterThan16() {
if (s.length() >= 16) {
s = s.substring(0, 15);
}
s = s.replaceAll("[.]$", ""); //마침표로 끝날 경우 빈값으로 변경
return this;
}
private KAKAOID noLessThan2() {
StringBuilder sBuilder = new StringBuilder(s);
while (sBuilder.length() <= 2) {
sBuilder.append(sBuilder.charAt(sBuilder.length() - 1));
}
s = sBuilder.toString();
return this;
}
private String getResult() {
return s;
}
}
}
반응형
'coding_test' 카테고리의 다른 글
[99클럽 4기 코테 스터디 TIL 2일차] 크기가 작은 부분 문자열 (0) | 2024.10.30 |
---|---|
[99클럽 4기 코테 스터디 TIL 1일차] 문자열 내 p와 y의 개수 (1) | 2024.10.28 |
[코딩테스트] 4. 프로그래머스 코딩테스트입문 (Day5, Day6) 코딩 기초 트레이닝 (Day1, Day2) (0) | 2024.10.18 |
[코딩테스트] 3. 프로그래머스 코딩테스트입문 (Day1 ~ Day4) (1) | 2024.10.17 |
[코딩테스트] 2. 약수의 갯수와 덧셈 (with 자바) (0) | 2024.10.17 |