오늘의 학습 키워드
- 문자열 처리
- 정규 표현식(Regex)
- 조건 분기
- 예외처리
- 시뮬레이션
- 구현
공부한 내용 정리
이번 문제는 7단계로 문자열을 변형하여 규칙에 맞는 아이디를 만드는 작업이었습니다.
각 단계마다 정해진 조건에 따라 new_id를 조작해야 했기 때문에 꼼꼼한 구현이 필요했습니다.
문제를 읽느라 시간이 좀 걸렸습니다. 한 단계씩 구현하며 실행하면서 풀었습니다.
주요 처리 흐름은 다음과 같았습니다:
- 모든 대문자를 소문자로 변환 (toLowerCase)
- 허용된 문자(소문자, 숫자, -, _, .)만 남기기 (정규식 사용)
- 연속된 마침표를 하나로 합치기 (정규식 사용)
- 문자열 앞뒤에 위치한 마침표 제거 (substring)
- 빈 문자열이면 "a" 추가
- 길이가 16자 이상이면 15자까지만 남기고, 끝에 마침표 있으면 제거
- 길이가 2자 이하라면 마지막 문자를 반복해서 길이를 3자로 맞추기
특히 2단계, 3단계에서는 **정규표현식(Regex)**을 적극 활용하여 코드를 간결하게 만들 수 있었습니다.
소스코드
/*
프로그래머스 신규 아이디 추천
입력: new_id
조건: 아이디 길이 length 3~15
아이디는 소문자 , - _ . 사용가능
.는 처음과 끝 사용 불가 연속사용 불가
로직: 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이 될 때까지 반복해서 끝에 붙입니다.
출력: 새로운 규칙에 맞는 아이디
*/
class Solution {
public String solution(String new_id) {
StringBuilder sb = new StringBuilder();
// 1단계
new_id = new_id.toLowerCase();
// 2단계
new_id = new_id.replaceAll("[^a-z0-9-_.]", "");
// 3단계
new_id = new_id.replaceAll("\\.{2,}", ".");
// 4단계
if(new_id.length() > 0 && new_id.charAt(0) == '.')
new_id = new_id.substring(1);
if(new_id.length() > 0 && new_id.charAt(new_id.length() - 1) == '.')
new_id = new_id.substring(0, new_id.length() - 1);
// 5단계
if(new_id.length() == 0)
new_id = "a";
// 6단계
if (new_id.length() >= 16) {
new_id = new_id.substring(0, 15);
}
if (new_id.charAt(new_id.length() - 1) == '.') {
new_id = new_id.substring(0, new_id.length() - 1);
}
// 7단계
while(new_id.length() < 3) {
new_id += new_id.charAt(new_id.length() - 1);
}
return new_id;
}
}
오늘의 회고
• 어떤 문제가 있었고, 나는 어떤 시도를 했는지
2단계에서 처음에는 if-else로만 처리하려 했지만, 문자의 필터링이나 마침표 연속 처리처럼 복잡한 조건에서는 정규표현식이 훨씬 깔끔하고 빠르다는 것을 깨달았습니다.
• 어떻게 해결했는지
- 정규식을 통해 불필요한 문자를 제거하거나 패턴을 변형했습니다.
- substring과 charAt을 이용해 문자열의 처음과 끝을 다루었습니다.
- while문을 이용해 짧은 아이디를 규칙에 맞게 확장했습니다.
• 무엇을 새롭게 알았는지
- 문자열 문제는 명확한 규칙을 단계별로 차근차근 처리하는 것이 중요하다는 것을 느꼈습니다.
- 특히 문자열의 첫 글자와 마지막 글자를 다룰 때는 빈 문자열 예외 처리를 반드시 신경 써야 한다는 것도 다시 확인했습니다.
• 내일 학습할 것은 무엇인지
정규표현식을 조금 더 깊게 공부하고, 다양한 패턴 매칭 문제에 대해 익숙해져야겠습니다.
'99클럽 > 6기' 카테고리의 다른 글
99클럽 코테 스터디 18일차 TIL - 강아지는 많을수록 좋다(백준 27971번) (0) | 2025.04.23 |
---|---|
99클럽 코테 스터디 17일차 TIL - 너구리 구구 백준 18126번 (0) | 2025.04.22 |
99클럽 코테 스터디 15일차 TIL - 리그 오브 레전설(Small) 백준 17271번 (1) | 2025.04.18 |
99클럽 코테 스터디 14일차 TIL - 진우의 달 여행 (Small) (1) | 2025.04.17 |
99클럽 코테 스터디 13일차 TIL - JadenCase 문자열 만들기 (1) | 2025.04.16 |