[프로그래머스(Programmers)] 2021 KAKAO BLIND RECRUITMENT:: 신규 아이디 추천 (java)

2
post-thumbnail

안녕하세요. 오늘은 프로그래머스의 신규 아이디 추천 문제를 풀어보려고 합니다. 이 문제는 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 이런것도 변수선언 없이 그냥 썼었다)
그리고 변수에 제대로 된 이름을 안붙이고 사용했다.
그랬더니 코드가 지저분해지고, 나중에 코드를 해석하기가 어려웠다. (분명 내가 짠 코드임에도 불구하고 의도를 파악하기 어려웠다..)
변수를 선언하고, 변수에 제대로 된 이름을 붙이니 코드의 의도를 파악하기 쉬워지고 보기도 깔끔하며 로직을 짤 때 햇갈리는 부분이 줄어들었다.

0개의 댓글