💡풀이 1
class Solution {
public String solution(String new_id) {
String id = new_id;
// 1. 모두 소문자로 변환
id = id.toLowerCase();
// 2. 소문자 숫자 - _ . 제외 모두 제거
id = id.replaceAll("[^a-z0-9-_.]", "");
// 3. .. 을 모두 . 으로 변경
while(id.contains("..")) {
id = id.replace("..", ".");
}
// 4. .으로 시작 혹은 종료한다면 제거
id = deleteStartOrEndPeriod(id);
// 5. 빈문자열이면 "a" 대입
if(id.isEmpty()) {
id = "a";
}
// 6. 16자가 넘어가면 15까지만 냅두고 제거, .이 끝에 위치하면 제거
if(id.length() > 15) {
id = deleteStartOrEndPeriod(id.substring(0, 15));
}
// 7. 2자보다 작다면 마지막문자를 길이3이 될때까지 반복
if(id.length() < 3) {
int length = id.length();
int index = 3 - length;
char c = id.charAt(length - 1);
id = id + String.valueOf(c)
.repeat(index);
}
return id;
}
private String deleteStartOrEndPeriod(String str) {
int start = 0;
if(str.startsWith(".")) {
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == '.') {
start++;
} else {
break;
}
}
}
str = str.substring(start);
int end = str.length();
if(str.endsWith(".")) {
for(int i = str.length() - 1; i >= 0; i--) {
if(str.charAt(i) == '.') {
end--;
} else {
break;
}
}
}
return str.substring(0, end);
}
}
💡풀이 2
- 정규표현식 적극 활용해보기
class Solution2 {
public String solution(String new_id) {
// 1. 모두 소문자로 변환
String id = new_id.toLowerCase();
// 2. 소문자 숫자 - _ . 제외 모두 제거
id = id.replaceAll("[^a-z0-9-_.]", "");
// 3. .. 을 모두 . 으로 변경
id = id.replaceAll("[.]{2,}", ".");
// 4. .으로 시작 혹은 종료한다면 제거
id = id.replaceAll("^[.]|[.]$", "");
// 5. 빈문자열이면 "a" 대입
if(id.isEmpty()) {
id = "a";
}
// 6. 16자가 넘어가면 15까지만 냅두고 제거, .이 끝에 위치하면 제거
if(id.length() >= 16) {
id = id.substring(0, 15);
id = id.replaceAll("[.]$", "");
}
// 7. 2자보다 작다면 마지막문자를 길이3이 될때까지 반복
while(id.length() < 3) {
id += id.charAt(id.length() - 1);
}
return id;
}
}
📖사용했던 정규표현식 정리해보기
1️⃣허용 문자만 남기기
id = id.replaceAll("[^a-z0-9-_.]", "");
:- a-z : 소문자
- 0-9 : 숫자
- -_. : 나머지 허용 문자
- ^ : 뒤의 문자들을 제외한 나머지를 뜻함
[^abc] : 괄호 안에서 사용된 ^는 뒤의 문자들과 일치하지 않는 부정의 의미로 사용 됨
^abc : 괄호 밖에서 사용될 경우 ^abc → "abc"로 시작하는 문자열. 즉, 문자열의 시작 위치를 뜻함
2️⃣연속 마침표 처리
id = id.replaceAll("[.]{2,}", ".");
:- 마침표가 2개 이상 연속되면 "."으로 바꾸기
- {n,} -> 앞 문자가 n번 이상 반복된다는 뜻
- ex) a{2,} → aa, aaa, aaaa 등
- 마침표가 2개 이상 연속되면 "."으로 바꾸기
3️⃣앞뒤 마침표 제거
id = id.replaceAll("^[.]|[.]$", "");
:- 시작(
^
)이나 끝($
)의 마침표 제거하기- $ -> 문자열 종료 위치
- ex) end$ → "end"로 끝나는 문자열
- 시작(
참고
정규 표현식 관련하여 블로그 글로 정리해보았습니다 😊
[Java] 자바 정규 표현식(Regular Expression) 정리
정규표현식(Regex)이란?정규표현식은 문자열에서 일정한 규칙을 가진 텍스트 패턴을 표현하는 식입니다.특정 단어나 문자를 찾거나문자열을 원하는 형식으로 바꾸거나데이터 검증, 파싱 등에 폭
devoks.tistory.com
GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.
프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스, Java] 개인정보 수집 유효기간 (0) | 2025.07.29 |
---|---|
[프로그래머스, Java] 바탕화면 정리 (0) | 2025.07.29 |
[프로그래머스, Java] 성격 유형 검사하기 (0) | 2025.07.21 |
[프로그래머스, Java][카카오 인턴] 키패드 누르기 (0) | 2025.07.21 |
[프로그래머스, Java][PCCE 기출문제] 10번 / 데이터 분석 (0) | 2025.07.21 |