프로그래머스 - 신규 아이디 추천
정규표현식 활용하지 않은 버전
class Solution {
public String solution(String new_id) {
String answer = "";
new_id = new_id.toLowerCase();
for (int i = 0; i < new_id.length(); i++) {
char ch = new_id.charAt(i);
if (Character.isAlphabetic(ch) || Character.isDigit(ch) || ch == '-' || ch == '_' || ch == '.') {
answer += ch;
}
}
while (answer.indexOf("..") != -1) {
answer = answer.replace("..", ".");
}
if (!answer.isEmpty() && answer.charAt(0) == '.') {
answer = answer.substring(1);
}
if (!answer.isEmpty() && answer.charAt(answer.length() - 1) == '.') {
answer = answer.substring(0, answer.length() - 1);
}
if (answer.isEmpty()) {
answer = "a";
}
if (answer.length() >= 16) {
answer = answer.substring(0, 15);
if (answer.charAt(answer.length() - 1) == '.') {
answer = answer.substring(0, answer.length() - 1);
}
}
while (answer.length() < 3) {
answer += answer.charAt(answer.length() - 1);
}
return answer;
}
}
- 각 단계별 구현 방법
ex) 입력 예시 : "...!@BaT#*..y.abcdefghijklm"
| 단계 | 내용 | 활용메서드 | 예상결과 |
|---|
| 1단계 | 소문자 치환 | toLowerCase() | ...!@bat#*..y.abcdefghijklm |
| 2단계 | 소문자, 숫자, 빼기, 밑줄, 마침표 | isAlphabetic, isDisgit | ...bat..y.abcdefghijklm |
| 3단계 | 마침표 2번 이상 | while | .bat.y.abcdefghijklm |
| 4단계 | 마침표 처음 또는 끝 제거 | charAt | bat.y.abcdefghijklm |
| 5단계 | 빈 문자열이면 "a"대입 | isEmpty | bat.y.abcdefghijklm |
| 6-1 | 길이가 16자 이상 | subString | bat.y.abcdefghi |
| 6-2 | 마침표가 끝에 위치 | charAt | bat.y.abcdefghi |
| 7단계 | 길이가 2자 이하 | while | bat.y.abcdefghi |
- Character.isAlphabetic : 유니코드 문자 범위 내 알파벳 문자 인식
- Character.isDigit : 0-9 사이 숫자인지 확인
- charAt 메서드 및 shbString 메서드의 경우 조건에 맞지 않으면 예외
- 문자열 길이가 0인 경우
- 문자열 길이 or 범위를 벗어난 인덱스에 접근
정규표현식 활용 버전
class Solution {
public String solution(String new_id) {
String answer = "";
new_id = new_id.toLowerCase();
answer = new_id.replaceAll("[^a-z0-9-_.]", "");
answer = answer.replaceAll("\\.+", ".");
answer = answer.replaceAll("^[.]|[.]$", "");
if (answer.isEmpty()) {
answer = "a";
}
if (answer.length() >= 16) {
answer = answer.substring(0, 15);
answer = answer.replaceAll("[.]$", "");
}
while (answer.length() < 3) {
answer += answer.charAt(answer.length() - 1);
}
return answer;
}
}
- 각 단계별 구현 방법
ex) 입력 예시 : "...!@BaT#*..y.abcdefghijklm"
| 단계 | 내용 | 활용메서드 | 예상결과 |
|---|
| 1단계 | 소문자 치환 | toLowerCase() | ...!@bat#*..y.abcdefghijklm |
| 2단계 | 소문자, 숫자, 빼기, 밑줄, 마침표 | [^a-z0-9\-_.] | ...bat..y.abcdefghijklm |
| 3단계 | 마침표 2번 이상 | \.+ | .bat.y.abcdefghijklm |
| 4단계 | 마침표 처음 또는 끝 제거 | ^[.]1[.]$(1은 or의미,표 문법..) | bat.y.abcdefghijklm |
| 5단계 | 빈 문자열이면 "a"대입 | isEmpty | bat.y.abcdefghijklm |
| 6-1 | 길이가 16자 이상 | subString | bat.y.abcdefghi |
| 6-2 | 마침표가 끝에 위치 | [.]$ | bat.y.abcdefghi |
| 7단계 | 길이가 2자 이하 | while | bat.y.abcdefghi |
| 문자 | 의미 |
|---|
| [] | or: 대괄호 안의 모든 문자 |
| [^] | not : 대괄호 안의 문자 외 모든 문자 |
| ^[] | 대괄호 안의 문자로 시작하는 문자열 |
| []$ | 대괄호 안의 문자로 끝나는 문자열 |
| + | 1개 이상의 문자 |