안녕하세요. 오늘은 프로그래머스의 신규 아이디 추천 문제를 풀어보려고 합니다. 이 문제는 2021 KAKAO BLIND RECRUITMENT에서 출제되었습니다.
https://programmers.co.kr/learn/courses/30/lessons/72410
1단계부터 7단계까지 차례대로 수행합니다. 아래의 테스트케이스를 추가하여 코드의 잘못된 부분을 발견할 수 있었습니다.
테스트케이스 | 결과 |
---|---|
"a.b.c.d.e.f.g.*.&.^.%.$.#.k" | "a.b.c.d.e.f.g.k" |
"" | "aaa" |
"...." | "aaa" |
class Solution {
public String solution(String new_id) {
StringBuilder makeNewId = new StringBuilder();
String now = "";
//1,2,3단계 수행
for(String s : new_id.split("")) {
if(!s.equals("")) {
now = levelTwoProcess(s.toLowerCase().charAt(0));
}
makeNewId.append(now);
int size = makeNewId.length();
if(size >= 2) {
if(makeNewId.charAt(size-1) == '.' && makeNewId.charAt(size-2) == '.') {
makeNewId.deleteCharAt(size-1);
}
}
}
//4단계 수행
if(makeNewId.length() != 0) {
makeNewId = deletePeriod(makeNewId, 0);
}
if(makeNewId.length() != 0) {
makeNewId = deletePeriod(makeNewId, makeNewId.length()-1);
}
//5단계 수행
if(makeNewId.length() == 0) {
makeNewId.append("a");
}
//6단계 수행
if(makeNewId.length() > 15) {
makeNewId.delete(15, makeNewId.length());
}
makeNewId = deletePeriod(makeNewId, makeNewId.length() -1);
//7단계 수행
if(makeNewId.length() < 3) {
while(makeNewId.length() < 3) {
char str = makeNewId.charAt(makeNewId.length() -1);
makeNewId.append(str);
}
}
return makeNewId.toString();
}
private String levelTwoProcess(char c) {
int ascii = (int) c;
if(ascii >= 97 && ascii <= 122) {
return Character.toString(c);
} else if(ascii >= 48 && ascii <= 57) {
return Character.toString(c);
} else if(c == '.' || c == '-' || c == '_') {
return Character.toString(c);
} else {
return "";
}
}
private StringBuilder deletePeriod(StringBuilder sb, int num) {
if(sb.charAt(num) == '.') {
sb.deleteCharAt(num);
}
return sb;
}
}
예전에 두 번 정도 풀어보려고 하다가 포기했던 문제다. 당시에는 주어진 테스트케이스를 모두 맞춰도 채점하면 계속 틀렸었는데, 예외 케이스를 찾지 못해 포기했었다. 이번에는 예외 케이스를 한 번에 찾아서 기분이 좋다.
예전에 풀다가 포기했던 이유를 알 듯 하다. 함수화하지 않아서, 풀다가 중간에 햇갈려져서 잘못된 부분을 찾기 어려웠다. 함수를 만들지 않아 for문 속 로직의 길이가 길어지면 점점 다른 길로 새는 것 같다. 그러면서 빠트리는 case가 생기고, 오류를 찾기 어려워지는 것 같다. 함수를 만들어서 코드를 간결하게 만들자!
나는 항상 알고리즘 문제를 풀면서 변수 선언하기를 싫어했다. (이전에는 levelTwoProcess함수 속 (int) c 이런것도 변수선언 없이 그냥 썼었다)
그리고 변수에 제대로 된 이름을 안붙이고 사용했다.
그랬더니 코드가 지저분해지고, 나중에 코드를 해석하기가 어려웠다. (분명 내가 짠 코드임에도 불구하고 의도를 파악하기 어려웠다..)
변수를 선언하고, 변수에 제대로 된 이름을 붙이니 코드의 의도를 파악하기 쉬워지고 보기도 깔끔하며 로직을 짤 때 햇갈리는 부분이 줄어들었다.