티스토리 뷰
[Java/Programmers]
Lv.1 신규 아이디 추천
(2021 KAKAO BLIND RECRUITMENT)
⬇︎ ⬇︎ ⬇︎ 문 제 링 크 ⬇︎ ⬇︎ ⬇︎
programmers.co.kr/learn/courses/30/lessons/72410
입/출력
(입력)
신규 유저가 입력한 아이디 : new_id
- new_id는 길이 1 이상 1,000 이하인 문자열입니다.
- new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
- new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.
(출력)
"네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return
풀이
⭕️ ver.1 : 처음 제출한 코드
public static String solution(String new_id) {
String answer = "";
// 1단계 : new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
answer = new_id.toLowerCase();
// 2단계 : new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
answer = answer.replaceAll("[^a-z0-9.\\-_]", "");
// 3단계 : new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
answer = answer.replaceAll("[.]{2,}", ".");
// 4단계 : new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
if(answer.length() >= 1 && answer.charAt(0) == '.') {
answer = answer.substring(1);
} else if (answer.charAt(0) == '.') {
answer = "";
}
if(answer.length() >= 1 && answer.charAt(answer.length() - 1) == '.') {
answer = answer.substring(0, answer.length() - 1);
}
// 5단계 : new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if(answer.equals("")) {
answer = "a";
}
// 6단계 : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if(answer.length() >= 16) {
answer = answer.substring(0, 15);
if(answer.charAt(answer.length() - 1) == '.') {
answer = answer.substring(0, answer.length() - 1);
}
}
// 7단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
if(answer.length() <= 2) {
char lastChar = answer.charAt(answer.length() - 1);
while(answer.length() < 3) {
answer += lastChar;
}
}
return answer;
}
- 아직 정규식 문법을 많이 알진 못해서 푸는데 검색도 많이 하고 (정규식 문법 관련) 헤맸다...
- 답안을 보지 않고 정규식 문법만을 검색하다 보니 내가 원하는 검색 결과는 나오지 않아서 그냥 혼자서 땅파고 테스트돌려보다가 해결...
- 특히 2단계에서는 모든 조건이 아닐때 그냥 앞에 ^ 하나만 해주면 되는걸 몰라 헤메고, 3단계에서는 2번 이상 . 이 연속된다는 것을 정규식으로 표현할 줄 몰라서 헤멨다....
⭕️ ver.2 : 다른분들 풀이 보고 조금 개선한 코드
public static String solution(String new_id) {
String answer = "";
// 1단계 : new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
answer = new_id.toLowerCase();
// 2단계 : new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
answer = answer.replaceAll("[^a-z0-9.\\-_]", "");
// 3단계 : new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
answer = answer.replaceAll("[.]{2,}", ".");
// 4단계 : new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
answer = answer.replaceAll("^[.]|[.]$", "");
// 5단계 : new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if(answer.equals("")) {
answer = "a";
}
// 6단계 : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if(answer.length() >= 16) {
answer = answer.substring(0, 15);
answer = answer.replaceAll("[.]$", "");
}
// 7단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
if(answer.length() <= 2) {
char lastChar = answer.charAt(answer.length() - 1);
while(answer.length() < 3) {
answer += lastChar;
}
}
return answer;
}
- 분명 위에서 2,3단계 해결하려고 정규식 문법 찾아볼때 ^는 문자열의 시작을 의미하고, $이 문자열의 끝을 의미하는거라는 걸 알게되었는데 활용하지 못하고 if문으로 해결해버리는 무지함...^^
- 프로그래머스에서 다른분들 풀이한 것 보니까 팩토리 쓰셔서 푸신 분도 계시고 진짜 다양한 풀이법이 있었는데, 그중에서도 처음과 끝이 마침표일 경우 없애주는 부분을 정규식으로 간단하게 해결할 수 있어서 내 코드도 개선해보았다.
- 첫번째 풀이보다 훨씬 간단해보여서 뿌듯... ^__^
후기
생각보다 정규식을 활용해서 푸는 코테 문제가 많은 것 같아 정규식 연습을 많이 해둬야겠다고 느꼈다.
전에는 정규식이 마냥 어렵게 느껴지고 되도록이면 사용 안 했는데 계속 접하다보니 너무 편하고 익숙해지는 것 같다. 확실히 문자열 필터링 할 때 유용한 것 같아서 프로젝트 할 때도 많이 쓸 것 같다!
'Algorithm' 카테고리의 다른 글
[Java/Programmers] Lv.1 소수 만들기 (0) | 2021.04.12 |
---|---|
[Java/Programmers] Lv.1 두 개 뽑아서 더하기 (0) | 2021.04.09 |
[Java/Programmers] Lv.2 카카오프렌즈 컬러링북 (0) | 2021.04.08 |
[Java/Programmers] Lv.1 폰켓몬 (0) | 2021.04.07 |
[Java/백준(boj)] 2010번. 플러그 (0) | 2021.03.06 |