1. 문제 정의
유저가 신규아이디를 만들 때 회사에서 정한 규칙에 맞지 않는다면 그 규칙에 맞게 수정해주어야 하는 문제.
처음에 String값이 매개변수로 넘어오며, 규칙은 총 7단계이다.
1. 소문자로 통일
2. 소문자, 숫자, 빼기, 언더바, 마침표를 제외한 모든 문자 제거
3. ..으로 연속된 부분있으면 .으로 치환
4. 마침표가 처음이나 끝에 존재하면 둘다 제거
5. 이 때 빈문자열이면 a 대입
6. 현재 16자 이상이면 15자까지만 남기고 나머지 제거
7. 현재 2자 이하라면 3자까지 반복해서 맨 마지막 글자를 추가
2. 나의 시도
처음에는 문제에 있는 순서를 바꿔서 풀려고 진행했는데, 잘 풀리지 않아서, 다시 문제가 요구하는 단계별로 로직을 구성하였더니, 모든 테스트케이스가 통과되었다. 문제에서 제공한 순서대로 푸는게 핵심이었다.
또한 replace에 대한 조건에 대한 정규표현식을 작성할 수 있는가가 이 문제의 핵심이 아니었나 싶다. (정규표현식은 chatGPT의 도움을 받았다.)
3. code
public String solution(String new_id) {
String answer = "";
// 모든 대문자를 소문자로 치환
answer = new_id.toLowerCase();
// 소문자, 숫자, -, _, .를 제외한 모든 문자를 제거
String regex = "[^a-z0-9\\-_.]";
answer = answer.replaceAll(regex, "");
// .가 2번이상 연속된 부분을 . 로 치환
while (answer.contains("..")) {
answer = answer.replaceAll("\\.{2}", ".");
}
// .가 처음이나 끝에 위치한다면 제거
if (answer.length()>0 && answer.charAt(0) == '.') {
answer = answer.substring(1);
}
if (answer.length()>0 && answer.charAt(answer.length() - 1) == '.') {
answer = answer.substring(0, answer.length() - 1);
}
// 빈 문자열이라면, new_id에 "a"를 대입
if (answer.length() < 1) {
answer = "a";
}
// 길이가 16자 이상이면 15개 문자를 제외한 나머지 문자들을 제거, 뒤에 .이 들어가 있다면 .을 제거
if (answer.length() > 15) {
answer = answer.substring(0, 15);
if (answer.charAt(14) == '.') {
answer = answer.substring(0, 14);
}
}
// 길이가 2자 이하라면 마지막 문자를 길이가 3이 될 때까지 반복.
if (answer.length() < 3) {
while (answer.length() < 3) {
answer += answer.charAt(answer.length() - 1);
}
}
return answer;
}
4. 깨닫거나 새로 알게 된 점.
문자열을 다루는 메서드는 이제 그럭저럭 익숙한 편이지만, 아직 정규표현식이 서툰편인 것 같다. 역시 문법을 머릿속에 외우는 것은 자주쓰는것이 아니라면 너무나도 어려운 일인 것 같다. chatGPT가 없었을 때에는 코딩테스트 시간에 검색을 하면서 검색시간이 소모되었던 기억이 있다. GPT 덕분에 서칭시간을 아낄 수 있어 좋았다.
참조
https://school.programmers.co.kr/learn/courses/30/lessons/72410
'프로그래밍 > 알고리즘 문제풀이' 카테고리의 다른 글
[pg] 프로그래머스 실패율 (0) | 2023.08.08 |
---|---|
[pg] 프로그래머스 키패드 누르기 (0) | 2023.08.02 |
[pg] 프로그래머스 숫자 문자열과 영단어 (0) | 2023.08.01 |
[pg] 프로그래머스 신고 결과 받기 (0) | 2023.07.27 |
[pg] 프로그래머스 성격 유형 검사하기 (0) | 2023.07.26 |