본문 바로가기
99클럽/6기

99클럽 코테 스터디 16일차 TIL - 프로그래머스 신규 아이디 추천

by nowjin 2025. 4. 21.

오늘의 학습 키워드

  • 문자열 처리
  • 정규 표현식(Regex)
  • 조건 분기
  • 예외처리
  • 시뮬레이션
  • 구현

공부한 내용 정리

이번 문제는 7단계로 문자열을 변형하여 규칙에 맞는 아이디를 만드는 작업이었습니다.
각 단계마다 정해진 조건에 따라 new_id를 조작해야 했기 때문에 꼼꼼한 구현이 필요했습니다.

문제를 읽느라 시간이 좀 걸렸습니다. 한 단계씩 구현하며 실행하면서 풀었습니다.

주요 처리 흐름은 다음과 같았습니다:

  1. 모든 대문자를 소문자로 변환 (toLowerCase)
  2. 허용된 문자(소문자, 숫자, -, _, .)만 남기기 (정규식 사용)
  3. 연속된 마침표를 하나로 합치기 (정규식 사용)
  4. 문자열 앞뒤에 위치한 마침표 제거 (substring)
  5. 빈 문자열이면 "a" 추가
  6. 길이가 16자 이상이면 15자까지만 남기고, 끝에 마침표 있으면 제거
  7. 길이가 2자 이하라면 마지막 문자를 반복해서 길이를 3자로 맞추기

특히 2단계, 3단계에서는 **정규표현식(Regex)**을 적극 활용하여 코드를 간결하게 만들 수 있었습니다.


소스코드

/*
프로그래머스 신규 아이디 추천
입력: new_id
조건: 아이디 길이 length 3~15
    아이디는 소문자 , - _ . 사용가능
    .는 처음과 끝 사용 불가 연속사용 불가
    
로직: 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
    2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
    6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
출력: 새로운 규칙에 맞는 아이디 
*/

class Solution {
    public String solution(String new_id) {
        StringBuilder sb = new StringBuilder();
        // 1단계
        new_id = new_id.toLowerCase();
        
        // 2단계
        new_id = new_id.replaceAll("[^a-z0-9-_.]", "");
        
        // 3단계
        new_id = new_id.replaceAll("\\.{2,}", ".");
        
        // 4단계
        if(new_id.length() > 0 && new_id.charAt(0) == '.')
            new_id = new_id.substring(1);
        if(new_id.length() > 0 && new_id.charAt(new_id.length() - 1) == '.')
            new_id = new_id.substring(0, new_id.length() - 1);
            
        // 5단계
        if(new_id.length() == 0)
            new_id = "a";
        
        // 6단계
        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);
        }

        // 7단계
        while(new_id.length() < 3) {
            new_id += new_id.charAt(new_id.length() - 1);
        }
        
        return new_id;
    }
}

오늘의 회고

• 어떤 문제가 있었고, 나는 어떤 시도를 했는지

2단계에서 처음에는 if-else로만 처리하려 했지만, 문자의 필터링이나 마침표 연속 처리처럼 복잡한 조건에서는 정규표현식이 훨씬 깔끔하고 빠르다는 것을 깨달았습니다.

 

• 어떻게 해결했는지

 

  • 정규식을 통해 불필요한 문자를 제거하거나 패턴을 변형했습니다.
  • substring과 charAt을 이용해 문자열의 처음과 끝을 다루었습니다.
  • while문을 이용해 짧은 아이디를 규칙에 맞게 확장했습니다.

 

 

• 무엇을 새롭게 알았는지

 

  • 문자열 문제는 명확한 규칙을 단계별로 차근차근 처리하는 것이 중요하다는 것을 느꼈습니다.
  • 특히 문자열의 첫 글자와 마지막 글자를 다룰 때는 빈 문자열 예외 처리를 반드시 신경 써야 한다는 것도 다시 확인했습니다.

 

 

• 내일 학습할 것은 무엇인지

정규표현식을 조금 더 깊게 공부하고, 다양한 패턴 매칭 문제에 대해 익숙해져야겠습니다.