본문 바로가기
Algorithm/프로그래머스 코딩테스트 문제풀이전략

[프로그래머스] Lv.2 신규 아이디 추천

by 미네구스 2024. 4. 18.

https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

class Solution {
    public String solution(String new_id) {
        String answer = "";
        new_id = new_id.toLowerCase();
        new_id = level2(new_id);
        new_id = level3(new_id);
        new_id = level4(new_id);
        new_id = level5(new_id);
        new_id = level6(new_id);
        new_id = level7(new_id);
        return new_id;
    }
    
    private String level2(String new_id) {
        StringBuilder sb = new StringBuilder();
        for (char c : new_id.toCharArray()){
            if (Character.isAlphabetic(c) || Character.isDigit(c) || c == '-' || c == '_' || c == '.') {
                sb.append(c);
            }
            
            else {
                continue;
            }
        }
        return sb.toString();
    }
    
    private String level3(String new_id) {
        StringBuilder sb = new StringBuilder();
        boolean lastDot = false;  // 이전 문자가 마침표인지 여부

        for (char c : new_id.toCharArray()) {
            if (c == '.') {
                if (!lastDot) {  // 이전 문자가 마침표가 아닌 경우에만 추가
                    sb.append(c);
                }
                lastDot = true;
            } else {
                sb.append(c);
                lastDot = false;
            }
        }

        return sb.toString();
    }
    
    private String level4 (String new_id) {
        if (new_id.charAt(0) == '.') {
            new_id = new_id.substring(1);
        }
        
        if (new_id.length() >= 1 && new_id.charAt(new_id.length() - 1) == '.') {
            new_id = new_id.substring(0, new_id.length() - 1);
        }
        return new_id;
    }
    
    private String level5(String new_id) {
        if (new_id.isEmpty()) {
            new_id += "a";
        }
        return new_id;
    }
    
    private String level6(String new_id) {
        if (new_id.length() >= 16) {
            new_id = new_id.substring(0,15);
            
            if (new_id.charAt(new_id.length() - 1) == '.') {
                new_id = new_id.substring(0, new_id.length() - 1);
            }
        }
        return new_id;
    }
    
    private String level7(String new_id) {
        if (new_id.length() <= 2) {
            while (new_id.length() < 3) {
                new_id += new_id.charAt(new_id.length() - 1);
            }
        }
        return new_id;
    }
}

 

풀이 회고

 

딱히 아이디어라기 보단 노가다성이 짙은 문제였다. 정규식을 활용하면 된다지만 인터넷을 사용 못하는 환경에선 무용지물 이므로 노가다했다. 

 

level3 같은 경우, 처음에 어떻게 해야할지 헷갈려서 답안을 참고했다.

 

연속된 "."을 체크하는 변수를 만들고, 순회하면서 이전 문자가 "."가 아닌 경우에만 추가하도록 했다.

 

new_id.length() - 1을 static한 변수로 선언했으면 가독성이 더 좋았을 것 같다.