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

2025. 7. 29. 19:22·CodingTest/Programmers

사진을 클릭하면 해당 문제로 이동

💡풀이 1

class Solution {
    public String solution(String new_id) {

        String id = new_id;

        // 1. 모두 소문자로 변환
        id = id.toLowerCase();

        // 2. 소문자 숫자 - _ . 제외 모두 제거
        id = id.replaceAll("[^a-z0-9-_.]", "");

        // 3. .. 을 모두 . 으로 변경
        while(id.contains("..")) {
            id = id.replace("..", ".");
        }

        // 4. .으로 시작 혹은 종료한다면 제거
        id = deleteStartOrEndPeriod(id);

        // 5. 빈문자열이면 "a" 대입
        if(id.isEmpty()) {
            id = "a";
        }

        // 6. 16자가 넘어가면 15까지만 냅두고 제거, .이 끝에 위치하면 제거
        if(id.length() > 15) {
            id = deleteStartOrEndPeriod(id.substring(0, 15));
        }

        // 7. 2자보다 작다면 마지막문자를 길이3이 될때까지 반복
        if(id.length() < 3) {
            int length = id.length();
            int index = 3 - length;
            char c = id.charAt(length - 1);
            id = id + String.valueOf(c)
                    .repeat(index);
        }

        return id;
    }

    private String deleteStartOrEndPeriod(String str) {
        int start = 0;
        if(str.startsWith(".")) {
            for(int i = 0; i < str.length(); i++) {
                if(str.charAt(i) == '.') {
                    start++;
                } else {
                    break;
                }
            }
        }
        str = str.substring(start);

        int end = str.length();
        if(str.endsWith(".")) {
            for(int i = str.length() - 1; i >= 0; i--) {
                if(str.charAt(i) == '.') {
                    end--;
                } else {
                    break;
                }
            }
        }

        return str.substring(0, end);
    }
}

💡풀이 2

- 정규표현식 적극 활용해보기

class Solution2 {
    public String solution(String new_id) {
        // 1. 모두 소문자로 변환
        String id = new_id.toLowerCase();

        // 2. 소문자 숫자 - _ . 제외 모두 제거
        id = id.replaceAll("[^a-z0-9-_.]", "");

        // 3. .. 을 모두 . 으로 변경
        id = id.replaceAll("[.]{2,}", ".");

        // 4. .으로 시작 혹은 종료한다면 제거
        id = id.replaceAll("^[.]|[.]$", "");

        // 5. 빈문자열이면 "a" 대입
        if(id.isEmpty()) {
            id = "a";
        }

        // 6. 16자가 넘어가면 15까지만 냅두고 제거, .이 끝에 위치하면 제거
        if(id.length() >= 16) {
            id = id.substring(0, 15);
            id = id.replaceAll("[.]$", "");
        }

        // 7. 2자보다 작다면 마지막문자를 길이3이 될때까지 반복
        while(id.length() < 3) {
            id += id.charAt(id.length() - 1);
        }

        return id;
    }
}

📖사용했던 정규표현식 정리해보기

1️⃣허용 문자만 남기기

  • id = id.replaceAll("[^a-z0-9-_.]", ""); : 
    • a-z : 소문자
    • 0-9 : 숫자
    • -_. : 나머지 허용 문자
    • ^ : 뒤의 문자들을 제외한 나머지를 뜻함
[^abc] : 괄호 안에서 사용된 ^는 뒤의 문자들과 일치하지 않는 부정의 의미로 사용 됨
^abc : 괄호 밖에서 사용될 경우 ^abc → "abc"로 시작하는 문자열. 즉, 문자열의 시작 위치를 뜻함

 

2️⃣연속 마침표 처리

  • id = id.replaceAll("[.]{2,}", "."); :
    • 마침표가 2개 이상 연속되면 "."으로 바꾸기
      • {n,} -> 앞 문자가 n번 이상 반복된다는 뜻
      • ex)  a{2,} → aa, aaa, aaaa 등

 

3️⃣앞뒤 마침표 제거

  • id = id.replaceAll("^[.]|[.]$", ""); :
    • 시작(^)이나 끝($)의 마침표 제거하기
      • $ -> 문자열 종료 위치
      • ex)  end$ → "end"로 끝나는 문자열

참고

정규 표현식 관련하여 블로그 글로 정리해보았습니다 😊

 

[Java] 자바 정규 표현식(Regular Expression) 정리

정규표현식(Regex)이란?정규표현식은 문자열에서 일정한 규칙을 가진 텍스트 패턴을 표현하는 식입니다.특정 단어나 문자를 찾거나문자열을 원하는 형식으로 바꾸거나데이터 검증, 파싱 등에 폭

devoks.tistory.com


 

GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.

프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.

github.com

 

'CodingTest > Programmers' 카테고리의 다른 글

[프로그래머스, Java] 개인정보 수집 유효기간  (0) 2025.07.29
[프로그래머스, Java] 바탕화면 정리  (0) 2025.07.29
[프로그래머스, Java] 성격 유형 검사하기  (0) 2025.07.21
[프로그래머스, Java][카카오 인턴] 키패드 누르기  (0) 2025.07.21
[프로그래머스, Java][PCCE 기출문제] 10번 / 데이터 분석  (0) 2025.07.21
'CodingTest/Programmers' 카테고리의 다른 글
  • [프로그래머스, Java] 개인정보 수집 유효기간
  • [프로그래머스, Java] 바탕화면 정리
  • [프로그래머스, Java] 성격 유형 검사하기
  • [프로그래머스, Java][카카오 인턴] 키패드 누르기
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (110) N
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (17) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (78)
        • Programmers (78)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    switch
    effectivejava
    java
    codingtest
    CS
    BufferedReader
    programmers
    BufferedWriter
    json
    StringTokenizer
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[프로그래머스, Java] 신규 아이디 추천
상단으로

티스토리툴바