📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 문자열 (정규식)
문제에서 언급한 단계대로 진행하면 된다.
그 중 정규식을 사용하거나 헷갈렸던 부분에 대해서만 작성해보겠다.
[2단계] 알파벳 소문자, 숫자, -, _, . 제외한 모든 문자 제거
- Character.isLowerCase(char)
: 해당 문자열이 소문자인지 확인
- Character.isDigit(char)
: 해당 문자열이 숫자인지 확인
정규식을 활용하면 좋았겠지만.. 까먹은 관계로 직접 알파벳 소문자, 숫자, -, _, . 에 해당하는 문자열을 추가한 새 문자열을 만들어 복사해 활용했다.
char[] ch = answer.toCharArray();
StringBuilder tmp = new StringBuilder();
for(char c : ch) {
if(Character.isLowerCase(c)) tmp.append(c); // 소문자인지 확인
else if(Character.isDigit(c)) tmp.append(c); // !!숫자인지 확인
else if(c == '-' || c == '_' || c == '.') tmp.append(c);
}
answer = tmp.toString();
[3단계] 마침표(.) 2개 이상이면 하나로 치환 > 정규식
answer = answer.replaceAll("\\.{2,}", ".");
💥 유의사항
- 4단계를 진행할 때 문자열의 길이가 0 이상인지 확인하고 진행해야 한다.
- 6단계 진행 후, 마지막 문자열이 마침표(.)일 경우 제거한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import java.util.*;
class Solution {
public String solution(String new_id) {
// 1. 소문자로 치환
String answer = new_id.toLowerCase();
// 2. 알파벳 소문자, 숫자, -, _, . 제외한 모든 문자 제거 > 정규식
char[] ch = answer.toCharArray();
StringBuilder tmp = new StringBuilder();
for(char c : ch) {
if(Character.isLowerCase(c)) tmp.append(c);
else if(Character.isDigit(c)) tmp.append(c);
else if(c == '-' || c == '_' || c == '.') tmp.append(c);
}
answer = tmp.toString();
// 3. 마침표(.) 2개 이상이면 하나로 치환
answer = answer.replaceAll("\\.{2,}", ".");
// 4. 마침표(.) 처음이나 끝에 있다면 제거
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);
// 5. 빈 문자열이면, a 대입
if(answer.length() == 0)
answer = "a";
// 6. 길이가 16자 이상이면, 첫 15개 제외하고 모두 제거
if(answer.length() >= 16)
answer = answer.substring(0, 15);
if(answer.length() > 0 && answer.charAt(answer.length() - 1) == '.') // 마지막 . 제거
answer = answer.substring(0, answer.length() - 1);
// 7. 길이가 2자 이하면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임
if(answer.length() <= 2) {
while(answer.length() < 3) {
answer += answer.charAt(answer.length() - 1);
}
}
return answer;
}
}
|
cs |
➕ 다른 풀이 방식
- 정규표현식 ver. (출처)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Solution {
public String solution(String new_id) {
String answer = new_id.toLowerCase(); // 1단계
answer = answer.replaceAll("[^-_.a-z0-9]", ""); // 2단계
answer = answer.replaceAll("\\.+", "."); // 3단계
answer = answer.replaceAll("^[.]|[.]$", ""); // 4단계
if (answer.equals("")) { // 5단계
answer += "a";
}
if (answer.length() >= 16) { // 6단계
answer = answer.substring(0, 15);
answer = answer.replaceAll("[.]$","");
}
if (answer.length() <= 2) { // 7단계
while (answer.length() < 3) {
answer += answer.charAt(answer.length()-1);
}
}
return answer;
}
}
|
cs |
- 정규표현식 없이 점 2개 이상 처리 (출처)
// 방법1
while (answer.indexOf("..") != -1)
answer = answer.replace("..", ".");
// 방법2
while (new_id.contains(".."))
new_id = new_id.replace("..", ".");
💦 어려웠던 점
33분 소요 (구현 23분, 디버깅 10분)
- 정규식을 암기하고 있지 직접 구현했다...
- 문자가 2개 이상일 때 처리! 다음엔 나도 while문을 활용해 어렵지 않게 처리하도록 하겠다!
🧐 새로 알게 된 내용
- Character.isLowerCase(char) : 해당 문자열이 소문자인지 확인
- Character.isDigit(char) : 해당 문자열이 숫자인지 확인
4단계에서 마침표로 시작하거나 끝나는지 확인할 때, startsWith(), endsWith() 써도 되었다,,,
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 240706 |
(+240706 2회독)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.util.*;
class Solution {
public String solution(String new_id) {
// step1.
new_id = new_id.toLowerCase();
// step2.
StringBuilder sb = new StringBuilder();
for(char c : new_id.toCharArray()) {
if(c >= 'a' && c <= 'z') sb.append(c);
else if(Character.isDigit(c)) sb.append(c);
else if(c == '-' || c == '_' || c == '.') sb.append(c);
}
// step3.
String newStr = sb.toString();
while(newStr.contains("..")) {
newStr = newStr.replace("..", ".");
}
// step4.
if(newStr.startsWith("."))
newStr = newStr.substring(1);
if(newStr.endsWith("."))
newStr = newStr.substring(0, newStr.length()-1);
// step5.
if(newStr.length() == 0)
newStr = "a";
// step6.
if(newStr.length() >= 16) {
newStr = newStr.substring(0, 15);
if(newStr.endsWith("."))
newStr = newStr.substring(0, newStr.length()-1);
}
// step7.
if(newStr.length() <= 2) {
char c = newStr.charAt(newStr.length() - 1);
while(newStr.length() < 3) {
newStr += c;
}
}
return newStr;
}
}
|
cs |
(참고)
[2021 카카오 코딩테스트] 신규 아이디 추천(문자열, String Lv. 1) - java 자바
0. 자세한 설명은 YouTube 영상으로 1. 문제 설명 (출처 : 프로그래머스) 카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하
coding-grandpa.tistory.com
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level2] 괄호 변환 (JAVA) (0) | 2024.02.25 |
---|---|
[프로그래머스/Level2] [3차] 압축 (JAVA) (0) | 2024.02.23 |
[프로그래머스/Level2] 오픈채팅방 (JAVA) (0) | 2024.02.21 |
[프로그래머스/Level2] 메뉴 리뉴얼 (JAVA) (1) | 2024.02.19 |
[프로그래머스/Level1] [1차] 비밀지도 (JAVA) (0) | 2024.02.19 |