자두의 데브로그

[자바] 프로그래머스 신규 아이디 추천 본문

코딩테스트/Java

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

왕자두 2024. 9. 27. 21:12

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

 

프로그래머스

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

programmers.co.kr

 

7단계를 거쳐서 문자열을 바꾸면 되는 문제였는데 ... 처음 볼 때는 음 뭐 쉽네 ^^ 하고 시작했지만 결국 구글링 엔딩이 되어버렸다.

일단 내가 이 문제를 풀 때 몰랐던 사실

 

1. 정규표현식 ... 어떻게 표현하는지 모르겠음..

2. char이나 String을 각각 사용했을 때 어떤 함수나 기호를 사용할 수 있고, 또 없는지 모름

3. 라이브러리에 내장된 함수? 시의적절하게 쓸 줄 모름...

 

총체적 난국이라 이 문제를 내 힘으로 온전히 풀진 못했다. 그치만 2단계를 제외하고 3-7단계는 내 힘으로 풀어보려고 했다.

 

2~7단계에서 내가 마주했던 오류들은 아래와 같다.

1. String.charAt()을 사용하면 char가 되지만 String으로 쪼개지는 줄 알고 냅다 equals 함수 사용했다.

2. String이 >=, <= 등의 산술기호로 비교 가능한 줄 알았다.

3. char 배열로 받아서 하나씩 확인하는데 equals 함수 사용 가능한 줄 알았다.

4. "" 는 String이고, ''가 char인데 비교할 때 문자 선언은 char로 해두고 "."랑 비교했다.

5. String에 remove() 메서드가 없었나요...? 하하; replace() 함수를 사용해서 해당 위치에 대해서 빈칸을 만들어야 되는 걸 몰랐다.

6. replace로 도출된 결과 값은 다시 문자열에 저장해둬야한다.

 

가장 헷갈렸던 건 2, 3, 6단계 였는데 2단계는 위에서 언급한 것처럼 String이랑 char를 혼동해서 사용해서 오류가 많이 발생했고, 3단계의 경우에는 .이 "2번 이상 연속되면" 이었는데 2번만 연속된 걸 앞에서부터 한 번만 발견해서 .으로 치환하도록 수정해서 오류가 발생했었다. while문으로 .. 이 없을 때까지 돌게 하여 문제를 해결할 수 있었다. 6단계는 16자 이상인 경우에 대해서 첫 15개의 문자로 자르는 것까지는 했는데 .이 있는 경우에 대해서는 처리를 하지 않아서 틀렸었지만 이는 조건을 잘못봐서 생긴 문제로 바로 수정할 수 있었다.

 

다 해결하고 푼 문제는 아래와 같다.

import java.util.*;

class Solution {
    public String solution(String new_id) {
        String answer = "";
        String step1 = "";
        String step2 = "";
        // 1단계
        step1 = new_id.toLowerCase();
        // 2단계
        char[] step1_arr = step1.toCharArray();
        
        for(char c : step1_arr){
            if((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.'){
                step2 += String.valueOf(c);
            }
        }
        
        // 3단계
        while (step2.contains("..")) {
            step2 = step2.replace("..", ".");
        }
        
        String step4 = step2;
        
        // 4단계
        if(step4.length() > 0 && step4.charAt(0) == '.'){
            step4 = step4.substring(1, step4.length());
        }
        if(step4.length() > 0 && step4.charAt(step4.length()-1) == '.'){
            step4 = step4.substring(0, step4.length()-1);
        }
        
        // 5단계
        if(step4.length() == 0){
            step4 = "a";
        }
        // 6단계
        if(step4.length() >= 16){
            step4 = step4.substring(0, 15);
        }
        if(step4.charAt(step4.length() - 1) == '.'){
            step4 = step4.substring(0, step4.length() - 1);
        }
        // 7단계
        if(step4.length() <= 2){
            String tmp = String.valueOf(step4.charAt(step4.length()-1));
            while(step4.length() != 3){
                step4 += tmp;
            }
        }
        answer = step4;
        return answer;
    }
}

정규 표현식으로 매우매우*100 간단하게 풀 수 있는 방법이 있지만 내가 아는 방법과 메서드를 유연하게 사용하면서 풀 수 있는 방법이 내가 푼 방법 같아서 이 방법을 공유한다.