일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그레이들
- 자바
- Graph
- 다이나믹 프로그래밍
- 알고리즘
- Data Structure
- db
- DP
- frontend
- 안드로이드
- Python
- Javascript
- java
- Redux
- VIM
- git
- LeetCode
- DFS
- vscode
- TypeScript
- network
- 백준
- CS
- Database
- Algorithm
- 프로그래머스
- react
- BFS
- 리트코드
- 동적 계획법
- Today
- Total
늘 겸손하게
Programmers - 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 - Java 본문
Programmers - 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 - Java
besforyou999 2022. 3. 2. 15:35
안녕하세요 besforyou 입니다
2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 문제 해설입니다
문제 풀이
주어진 단계별로 문자열을 변형하면 되는 문제입니다.
1 단계
String의 메소드인 toLowerCase()로 문자열 속 대문자들을 모두 소문자로 바꿉니다.
1
2
|
// Step 1
answer = new_id.toLowerCase();
|
cs |
2 단계
순차탐색으로 모든 문자를 읽어들여서 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자를 제거합니다.
문자가 숫자인지는 Character.isDigit() 메소드로 알 수 있습니다.
1
2
3
4
5
6
7
8
|
// Step 2
for (int i = 0 ; i < answer.length() ; i++) {
Character ch = answer.charAt(i);
if ( ch == '-' || ch == '_' || ch == '.' || Character.isDigit(ch) || isAlpha(ch) )
temp += ch;
else
continue;
}
|
cs |
- isAlpha()
1
2
3
4
5
|
public boolean isAlpha(char c) {
if ( c >= 'a' && c <= 'z' )
return true; else
return false;
}
|
cs |
3 단계
마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환합니다.
문자열을 순차 탐색하며 마침표를 찾고, 마침표가 연속되었다면 연속된 마지막 마침표의 인덱스를 i에 저장하여 마지막 마침표 다음 문자부터 정답 문자열에 이어 붙입니다.
1
2
|
// Step 3
answer = mergeDots(answer);
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public String mergeDots(String str) {
String ans = "";
StringBuilder string = new StringBuilder(str);
for (int i = 0 ; i < string.length() ; i++) {
Character c = string.charAt(i);
if ( c == '.') {
int p = i;
while ( p != string.length() && string.charAt(p) == '.' ) p += 1;
i = p - 1;
}
ans += c;
}
return ans;
}
|
cs |
4 단계
문자열의 인덱스를 이용하여 처음이나 마지막에 존재하는 마침표를 제거합니다.
주의점 : 인덱스를 이용하여 문자열에 접근한다면, 마침표를 제거했을때 길이가 0이 되는 경우를 피해야합니다.
1
2
|
// Step 4
answer = trimDots(answer);
|
cs |
1
2
3
4
5
6
7
|
public String trimDots(String str) {
StringBuilder string = new StringBuilder(str);
if (string.charAt(0) == '.' ) string.deleteCharAt(0);
int len = string.length();
if (len - 1 > 0 && string.charAt(len - 1) == '.' ) string.deleteCharAt(len - 1);
return string.toString();
}
|
cs |
5 단계
빈 문자열이라면 문자열 끝에 "a"를 대입합니다.
1
2
|
// Step 5
if (answer.length() == 0) answer = "a";
|
cs |
6 단계
문자열 길이가 16자 이상이면 첫 15개의 문자를 제외한 나머지 문자를 모두 제거합니다. String 메소드 substring을 이용합니다.
제거 후 마침표가 문자열 끝에 위치한다면 끝에 위치한 마침표 문자를 제거합니다. 4단계에서 만든 trimDots를 사용합니다.
1
2
|
// Step 6
answer = limitTo15(answer);
|
cs |
1
2
3
4
5
6
|
public String limitTo15(String str) {
if (str.length() <= 15) return str;
String ans = str.substring(0, 15);
ans = trimDots(ans);
return ans;
}
|
cs |
7 단계
인덱스로 문자열을 참조하여 문자열의 길이가 3이 될 때까지 마지막 문자를 문자열에 이어붙힙니다.
1
2
|
// Step 7
if ( answer.length() <= 2 ) answer = stretchString(answer);
|
cs |
1
2
3
4
5
6
|
public String stretchString(String str) {
int len = str.length();
Character c = str.charAt(len - 1);
while (str.length() != 3 ) str += c;
return str;
}
|
cs |
풀 코드
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
class Solution {
public String solution(String new_id) {
String answer = "";
String temp = "";
// Step 1
answer = new_id.toLowerCase();
// Step 2
for (int i = 0 ; i < answer.length() ; i++) {
Character ch = answer.charAt(i);
if (ch == '-' || ch == '_' || ch == '.' || Character.isDigit(ch) || isAlpha(ch) )
temp += ch;
else
continue;
}
answer = temp;
// Step 3
answer = mergeDots(answer);
// Step 4
answer = trimDots(answer);
// Step 5
if (answer.length() == 0) answer = "a";
// Step 6
answer = limitTo15(answer);
// Step 7
if ( answer.length() <= 2 ) answer = stretchString(answer);
return answer;
}
public boolean isAlpha(char c) {
if ( c >= 'a' && c <= 'z' ) return true;
else
return false;
}
public String mergeDots(String str) {
String ans = "";
StringBuilder string = new StringBuilder(str);
for (int i = 0 ; i < string.length() ; i++) {
Character c = string.charAt(i);
if ( c == '.') {
int p = i;
while ( p != string.length() && string.charAt(p) == '.' ) p += 1;
i = p - 1;
}
ans += c;
}
return ans;
}
public String trimDots(String str) {
StringBuilder string = new StringBuilder(str);
if (string.charAt(0) == '.' ) string.deleteCharAt(0);
int len = string.length();
if (len - 1 > 0 && string.charAt(len - 1) == '.' ) string.deleteCharAt(len - 1);
return string.toString();
}
public String limitTo15(String str) {
if (str.length() <= 15) return str;
String ans = str.substring(0, 15);
ans = trimDots(ans);
return ans;
}
public String stretchString(String str) {
int len = str.length();
Character c = str.charAt(len - 1);
while (str.length() != 3 ) str += c;
return str;
}
}
|
cs |
결과
'코딩 문제 > Programmers' 카테고리의 다른 글
프로그래머스 코딩테스트 연습 > 해시 > 전화번호 목록 (Java) (0) | 2022.06.23 |
---|---|
프로그래머스 - 2022 카카오 블라인드 채용 > K진수에서 소수 개수 구하기 - JavaScript (0) | 2022.03.22 |
2020 카카오 블라인드 채용 > 문자열 압축 문제풀이 - Java (0) | 2022.03.07 |
Programmers - 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (0) | 2022.03.01 |
Summer/Winter Coding(~2018) > 소수 만들기 - Level 1 (0) | 2021.11.05 |