반응형
2021 KAKAO BLINDTEST 난이도 1
신규 아이디 추천
문제 요약
> 사용자가 입력된 아이디를 기준에 맞는 아이디로 변경
기준
- 3<=id<=15
- 소문자, 숫자, -, _, .
- .는 처음/끝/연속 X
변경 순서
- 대->소
- 소문자, 숫자, -, _, . 외 문자 제외
- .가 연속이면 하나로
- .가 처음/끝이면 제외
- 빈문자열이면 "a"
- 16자 넘으면 15자까지만 자르기 + .가 마지막이면 그것도 자르기
- 2자 이하면 마지막 문자를 길이 3될때까지 반복
내 풀이
class Solution {
public String solution(String new_id) {
//step 1
new_id = new_id.toLowerCase();
//step 2
new_id = replaceNotLetter(new_id);
//step 3
new_id = duplicateDot(new_id);
//step 4
new_id = isStartEndWithDot(new_id);
//step 5
new_id = isEmptyStr(new_id);
//step 6
new_id = isOverThan15(new_id);
new_id = isStartEndWithDot(new_id);
//step 7
new_id = isLessThan2(new_id);
return new_id;
}
// 유효하지 않은 문자 제거
public String replaceNotLetter (String str) {
return str.replaceAll("[^a-z0-9_.-]", "");
}
// .가 연속이면 하나로
public String duplicateDot (String str) {
return str.replaceAll("[.]{2,1000}", ".");
}
// .가 처음/끝에 있으면 제거
public String isStartEndWithDot (String str) {
if(str.startsWith(".")) str = str.substring(1,str.length());
if(str.endsWith(".")) str = str.substring(0, str.length()-1);
return str;
}
// 빈 문자열이면 "a"
public String isEmptyStr (String str) {
if("".equals(str)||str==null) return "a";
else return str;
}
// 글자수 조절
public String isOverThan15 (String str) {
if(str.length()>15) return str.substring(0,15);
return str;
}
// 2자 이하면 마지막 문자 추가
public String isLessThan2 (String str) {
int len = str.length();
if(len>2) return str;
String last = str.substring(len-1,len);
if (len==2) return str+last;
else return str+last+last;
}
}
난이도는 막 어렵지 않은데 정규식 공부한걸 메모하기 위해 글을 따로 작성한다.
- ^[A]: A로 시작하는 글자
- [^A]: A가 아닌 모든 글자
- A{2,5}: AA, AAA, ..., AAAAA의 의미로 A가 2~5회 반복
- A{2,}: A가 2회 이상 반복
- [A]$: A로 끝나는 글자
- | : OR
다른 사람 코드
class Solution {
public String solution(String new_id) {
String s = new KAKAOID(new_id)
.replaceToLowerCase()
.filter()
.toSingleDot()
.noStartEndDot()
.noBlank()
.noGreaterThan16()
.noLessThan2()
.getResult();
return s;
}
private static class KAKAOID {
private String s;
KAKAOID(String s) {
this.s = s;
}
private KAKAOID replaceToLowerCase() {
s = s.toLowerCase();
return this;
}
private KAKAOID filter() {
s = s.replaceAll("[^a-z0-9._-]", "");
return this;
}
private KAKAOID toSingleDot() {
s = s.replaceAll("[.]{2,}", ".");
return this;
}
private KAKAOID noStartEndDot() {
s = s.replaceAll("^[.]|[.]$", "");
return this;
}
private KAKAOID noBlank() {
s = s.isEmpty() ? "a" : s;
return this;
}
private KAKAOID noGreaterThan16() {
if (s.length() >= 16) {
s = s.substring(0, 15);
}
s = s.replaceAll("[.]$", "");
return this;
}
private KAKAOID noLessThan2() {
StringBuilder sBuilder = new StringBuilder(s);
while (sBuilder.length() <= 2) {
sBuilder.append(sBuilder.charAt(sBuilder.length() - 1));
}
s = sBuilder.toString();
return this;
}
private String getResult() {
return s;
}
}
}
풀이 자체는 비슷한데 구성이 훨씬 깔끔하다ㅜㅜㅜㅜ
JAVA는 객체 지향적인 언어인데 왜 자꾸 난 코테만 보면 객체의 존재를 까먹게 될까..
반응형
'Memo > 코테' 카테고리의 다른 글
프린터 (0) | 2021.06.22 |
---|---|
방문 길이 (0) | 2021.06.16 |
[Codility] CountDiv (0) | 2021.04.22 |
[Codility] TapeEquilibrium (0) | 2021.04.21 |
[Codility] PermMissingElem (0) | 2021.04.20 |