문제 설명
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.
다음은 카카오 아이디의 규칙입니다.
- 아이디의 길이는 3자 이상 15자 이하여야 합니다.
- 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
- 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.
"네오"는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다.
신규 유저가 입력한 아이디가 new_id 라고 한다면,
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이 될 때까지 반복해서 끝에 붙입니다.
신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.
제한사항
- new_id는 길이 1 이상 1,000 이하인 문자열입니다.
- new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
- new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.
입출력 예
| no | new_id | result |
| 예1 | "...!@BaT#*..y.abcdefghijklm" | "bat.y.abcdefghi" |
| 예2 | "z-+.^." | "z--" |
| 예3 | "=.=" | "aaa" |
| 예4 | "123_.def" | "123_.def" |
| 예5 | "abcdefghijklmn.p" | "abcdefghijklmn" |
코드 설명
단계에 따라 주어진 문자열 new_id를 다루어보겠습니다.
1. 대문자를 소문자로 변경 : toLowerCase() 메소드를 통해 new_id에 대문자가 포함되어있다면 소문자로 변경합니다.
2. 불필요한 특수기호 제거(- _ . 제외) : replaceAll을 활용하여 특수기호 - _ .과 알파벳 소문자, 숫자를 제외한 다른 문자를 제거합니다. 정규표현식에서 [^]은 '^ 뒤에 나오는 문자열 빼고'라는 의미를 가집니다.
3. 마침표가 연속으로 나온다면 하나로 변경 : indexOf("..")가 -1이 될때까지 replace() 메소드로 ".."을 "."로 변경합니다. 마침표가 3개 이상 나올 수도 있기 때문에 반복문을 사용했습니다.
4. 아이디의 처음 혹은 끝에 있는 마침표가 있다면 제거 : 정규표현식을 활용했습니다. ^[.]은 "'.'로 시작하는"이라는 뜻이고 [.]$는 "'.'으로 끝나는"이라는 뜻입니다. replaceAll() 메소드로 해당 마침표는 제거합니다.
5. 아이디가 빈 문자열인지 확인 : isEmpty()를 통해 answer가 빈 문자열인지 확인하고 비어있다면 a를 추가합니다.
6. 아이디 글자 수 확인(15글자 초과) : 아이디가 16글자 이상이라면 substring()을 통해 15글자까지만 남깁니다. 이때 15글자까지 남기면 아이디의 끝자리가 마침표가 될 수 있기 때문에 4단계를 한 번 더 시행해줍니다.
7. 아이디 글자 수 확인(3글자 미만) : 아이디가 2글자 이하라면 answer의 가장 마지막 인덱스(answer.length()-1)의 문자를 더해줍니다.
class Solution {
public String solution(String new_id) {
String answer = "";
// 1단계 : 대문자를 소문자로 변경
answer = new_id.toLowerCase();
// 2단계 : 불필요한 특수기호 제거
answer = answer.replaceAll("[^-_.a-z0-9]","");
// 3단계 : 마침표가 연속으로 나온다면 하나로 변경
while(answer.indexOf("..") != -1) answer = answer.replace("..",".");
// 4단계 : 아이디의 처음 혹은 끝에 있는 마침표가 있다면 제거
answer = answer.replaceAll("^[.]|[.]$","");
// 5단계 : 아이디가 빈 문자열인지 확인, 비어있으면 a 입력
if(answer.isEmpty()) answer += "a";
// 6단계 : 아이디가 15글자를 초과했다면 1~15째 글자만 남기고 지우기
if(answer.length()>15) answer = answer.substring(0,15);
// 아이디의 처음 혹은 끝에 있는 마침표가 있다면 제거(한 번 더 시행)
answer = answer.replaceAll("^[.]|[.]$","");
// 7단계 : 아이디 길이가 2자 이하인지 확인, 이하라면 현재 문자열 반복
while(answer.length()<3) answer += answer.charAt(answer.length()-1);
return answer;
}
}'알고리즘 공부' 카테고리의 다른 글
| [프로그래머스] 문자열 나누기 - Java (0) | 2023.03.26 |
|---|---|
| [프로그래머스] 개인정보 수집 유효기간 - Java (0) | 2023.03.23 |
| [프로그래머스] 키패드 누르기 - Java (0) | 2023.03.16 |
| [프로그래머스] 콜라 문제 - Java (0) | 2023.03.13 |
| [프로그래머스] 기사단원의 무기 - Java (1) | 2023.03.12 |