반응형
문제 링크
코딩테스트 연습 - 신규 아이디 추천 | 프로그래머스 스쿨 (programmers.co.kr)
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이 될 때까지 반복해서 끝에 붙입니다.
문제 풀이
- 규칙이 있고 치환, 제거 등의 작업을 할 때에는 정규식을 활용
풀이-1
public String solution(String new_id) {
// Level 1
new_id = new_id.toLowerCase();
// Level 2
new_id = new_id.replaceAll("[^\\w-_.]*", "");
// Level 3
new_id = new_id.replaceAll("\\.{2,}", ".");
// Level 4
new_id = new_id.replaceAll("^\\.|\\.$", "");
// Level 5
if(new_id.equals("")) new_id = "a";
// Level 6
if(new_id.length() > 15) new_id = new_id.substring(0, 15).replaceAll("\\.$", "");
// Level 7
if(new_id.length() <= 2) {
char ch = new_id.charAt(new_id.length()-1);
while(new_id.length() <= 3) {
new_id += ch;
}
}
return new_id;
}
- Level 1 : 모든 대문자를 소문자로 표현
- String의
toLowerCase()
는 모든 문자를 소문자로 만들어요.
- String의
- Level 2 : 알파벳 소문자, 숫자,
-
,_
,.
를 제외한 모든 문자를 제거replaceAll("[^\\w-_.]*", "")
replaceAll을 사용하면 정규식을 원하는 문자로 대체할 수 있어요.[^]
:[]
안에^
가 있으면 not 의 의미입니다. 즉[^1]
은 1이 아니라면... 을 의미합니다.\\w
: 알파벳 소문자, 숫자를 의미합니다.a-z0-9
와 같은 의미입니다.
즉[^\\w-_.]
은 알파벳 소문자, 숫자,-
,_
,.
가 아닌 경우 를 뜻합니다.
- Level 3 :
.
가 2번 이상 연속된 경우 하나의.
로 치환\\.{2,}
은.
가 2개 이상 연속되는 경우를 뜻합니다.
- Level 4 :
.
가 처음이나 끝에 있으면 제거^\\.|\\.$
:^
는 괄호[]
안에 있으면 Not의 의미이지만 괄호 밖에 있으면 처음을 의미합니다.$
는 마지막을 의미합니다.|
는 또는(or)의 의미입니다.
그러므로 "처음에 마침표(.)가 있거나 마지막에 마침표(.)가 있는 경우"라는 뜻입니다.
- Level 5 : 빈 문자열이라면 "a"를 대입
public boolean equals(Object anObject)
: 문자열의 값을 비교
공백인지 아닌지 비교하여 공백이면 "a"를 대입한다.
- Level 6 : 길이가 16이상이면 15개의 문자까지만 표현하고 나머지는 제거, 제거 후 마지막 문자가
.
이면 마침표도 제거public String substring(int beginIndex, int endIndex)
- 문자열을 내가 원하는 인덱스만큼 자를 수 있는 메소드
예를 들어 "abcde"라는 문자열이 있고,substring(0, 3)
을 했다면 결과는 "abc"이다.
주의할 점은 endIndex에 3을 넣는다고 인덱스 3을 포함시키지는 않는다. 3 이전까지라는 뜻이다.
- 문자열을 내가 원하는 인덱스만큼 자를 수 있는 메소드
\\.$
: Level 4에서도 나온 것을 그대로 응용
- Level 7 : 문자열의 길이가 2 이하라면 마지막 문자를 길이가 3이 될 때까지 계속 추가
- 마지막 문자를 구해 길이가 3보다 작으면 문자열에 계속 더한다.
테스트 케이스 처리속도
- 0.41ms ~ 15.17ms
반응형
'Algorithm > Java' 카테고리의 다른 글
프로그래머스 - 숫자 문자열과 영단어 java :: 2021 카카오 채용연계형 인턴십 (0) | 2022.07.08 |
---|---|
프로그래머스 - 키패드 누르기 java :: 2020 카카오 인턴십 (0) | 2022.07.08 |
프로그래머스 - 크레인 인형뽑기 게임 java :: 2019 카카오 개발자 겨울 인턴십 :: 64061 (0) | 2022.07.07 |
프로그래머스 - 없는 숫자 더하기 java :: 월간 코드 챌린지 시즌3 (0) | 2022.07.06 |
프로그래머스 - 음양 더하기 java :: 월간 코드 챌린지 시즌2 (0) | 2022.07.06 |