본문 바로가기
프로그래밍/알고리즘 문제풀이

[pg] 프로그래머스 신규아이디 추천

by 노잼인간이라불립니다 2023. 8. 1.

1. 문제 정의

 유저가 신규아이디를 만들 때 회사에서 정한 규칙에 맞지 않는다면 그 규칙에 맞게 수정해주어야 하는 문제.

처음에 String값이 매개변수로 넘어오며, 규칙은 총 7단계이다.

1. 소문자로 통일

2. 소문자, 숫자, 빼기, 언더바, 마침표를 제외한 모든 문자 제거

3. ..으로 연속된 부분있으면 .으로 치환

4. 마침표가 처음이나 끝에 존재하면 둘다 제거

5. 이 때 빈문자열이면 a 대입

6. 현재 16자 이상이면 15자까지만 남기고 나머지 제거

7. 현재 2자 이하라면 3자까지 반복해서 맨 마지막 글자를 추가

 

2. 나의 시도

 처음에는 문제에 있는 순서를 바꿔서 풀려고 진행했는데, 잘 풀리지 않아서, 다시 문제가 요구하는 단계별로 로직을 구성하였더니, 모든 테스트케이스가 통과되었다. 문제에서 제공한 순서대로 푸는게 핵심이었다.

 또한 replace에 대한 조건에 대한 정규표현식을 작성할 수 있는가가 이 문제의 핵심이 아니었나 싶다. (정규표현식은 chatGPT의 도움을 받았다.) 

 

3. code

public String solution(String new_id) {
        String answer = "";

        // 모든 대문자를 소문자로 치환
        answer = new_id.toLowerCase();

        // 소문자, 숫자, -, _, .를 제외한 모든 문자를 제거
        String regex = "[^a-z0-9\\-_.]";
        answer = answer.replaceAll(regex, "");

        // .가 2번이상 연속된 부분을 . 로 치환
        while (answer.contains("..")) {
            answer = answer.replaceAll("\\.{2}", ".");
        }

        // .가 처음이나 끝에 위치한다면 제거
        if (answer.length()>0 && answer.charAt(0) == '.') {
            answer = answer.substring(1);
        }
        if (answer.length()>0 && answer.charAt(answer.length() - 1) == '.') {
            answer = answer.substring(0, answer.length() - 1);
        }
        
        // 빈 문자열이라면, new_id에 "a"를 대입
        if (answer.length() < 1) {
            answer = "a";
        }

        // 길이가 16자 이상이면 15개 문자를 제외한 나머지 문자들을 제거, 뒤에 .이 들어가 있다면 .을 제거
        if (answer.length() > 15) {
            answer = answer.substring(0, 15);
            if (answer.charAt(14) == '.') {
                answer = answer.substring(0, 14);
            }
        }

        // 길이가 2자 이하라면 마지막 문자를 길이가 3이 될 때까지 반복.
        if (answer.length() < 3) {
            while (answer.length() < 3) {
                answer += answer.charAt(answer.length() - 1);
            }
        }

        return answer;
    }

 

4. 깨닫거나 새로 알게 된 점.

 문자열을 다루는 메서드는 이제 그럭저럭 익숙한 편이지만, 아직 정규표현식이 서툰편인 것 같다. 역시 문법을 머릿속에 외우는 것은 자주쓰는것이 아니라면 너무나도 어려운 일인 것 같다. chatGPT가 없었을 때에는 코딩테스트 시간에 검색을 하면서 검색시간이 소모되었던 기억이 있다. GPT 덕분에 서칭시간을 아낄 수 있어 좋았다.

 

참조

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