프로그래머스 | 신규 아이디 추천 (Java)

mul·2023년 2월 14일
0

알고리즘

목록 보기
20/65
post-custom-banner

🔒 문제

프로그래머스 Lv.1 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천

🔑 해결

신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return하는 solution함수를 작성하는 문제이다.

String에 쓸 수 있는 함수를 적재적소에 사용하는 것이 중요한 문제라고 생각하였다.

🪄 toLowerCase() : 대문자를 소문자로
String str = new_id.toLowerCase();
🪄 replaceAll(String regex, String replacement)
[^s] : 특정 문자(s)를 제외한 문자 치환
String str = new_id.replace("[^a]", "b"); // a를 제외한 문자를 b로 치환

s{2,} : 연속되는 특정 문자(s) 치환
String str = new_id.replace("a{2,}", "b"); // a가 2이상 연속되는 부분을 b로 치환

^s: 처음에 위치하는 특정 문자(s) 치환
String str = new_id.replace("^a", "b"); // a가 처음에 위치한다면 b로 치환

s$: 끝에 위치하는 특정 문자(s) 치환
String str = new_id.replace("a$", "b"); // a가 끝에 위치한다면 b로 치환
🪄 substring(int begin, int end) : begin ~ end-1 범위의 문자열
String str = "slamdunk";
String s = str.substring(0, 5); // s를 print하면 "slam"
  1. toLowerCase() 메서드를 사용하여 new_id의 모든 대문자를 소문자로 치환
  2. replaceAll() 메서드를 사용하여 알파벳(a-z), 숫자(0-9), 빼기(-), 밑줄(_), 마침표(.)를 제외([^])한 모든 문자를 ""로 치환
  3. replaceAll() 메서드를 사용하여 마침표(.)가 2번 이상 연속({2,})된 부분을 하나의 마침표로 치환. 마침표(.)와 같은 메타문자를 사용할 때 "\\"를 써준다.
  4. 마침표(.)가 처음(^)이나 끝($)에 위치한다면 ""로 치환
  5. new_id가 빈 문자열("")이라면, new_id에 "a"를 대입
  6. new_id의 길이(length())가 16자 이상(15자 초과)이면, 첫 15개의 문자(substring(0,15))만 자른다. 마침표(.)가 new_id의 끝($)에 위치한다면 ""로 치환
  7. new_id의 길이가 2자 이하(3자 미만)라면, new_id의 마지막 문자(new_id.charAt(new_id.length()-1)를 new_id의 길이가 3미만인 동안 반복해서 끝에 붙인다.

🔓 코드

class Solution {
    public String solution(String new_id) {
        String answer = "";
        
        // 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환
        new_id = new_id.toLowerCase();
        
        // 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
        new_id = new_id.replaceAll("[^0-9a-z-_.]", "");
        
        // 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
        new_id = new_id.replaceAll("\\.{2,}", ".");
        
        // 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거
        new_id = new_id.replaceAll("^\\.", "");
        new_id = new_id.replaceAll("\\.$", "");
        
        // 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입
        if ("".equals(new_id))
        	new_id = "a";
        
        // 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
        // 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.)를 제거
        if (new_id.length() > 15) {
        	new_id = new_id.substring(0, 15);
        	new_id = new_id.replaceAll("\\.$", "");
        }
        
        // 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙이
        if (new_id.length() < 3) {
        	String last = String.valueOf(new_id.charAt(new_id.length()-1));
        	while (new_id.length() < 3) {
        		new_id = new_id + last;
        	}
        }
        
        answer = new_id;
        
        return answer;
    }
}
post-custom-banner

0개의 댓글