hoon DevLog

[Java] 프로그래머스 신규아이디 추천 자바 본문

코딩테스트/프로그래머스

[Java] 프로그래머스 신규아이디 추천 자바

개발한기발자 2022. 7. 5. 10:32
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


느낌이 온다...

이건 정규식과 replace() 메서드 사용 각이닷!

 

[나의 풀이]


  
class Solution {
public String solution(String new_id) {
String answer = "";
new_id = new_id.toLowerCase();
for (int i=0; i<new_id.length(); i++) {
//알파벳, 숫자, ".", "_", "-" 만 허용
if(String.valueOf(new_id.charAt(i)).matches("[a-z0-9._-]")){
answer += new_id.charAt(i);
}
}
//.. -> .
answer = answer.replaceAll("[.]{2,}", ".");
//처음이나 끝에 위치하면 제거
answer = answer.replaceAll("^[.]|[.]$","");
if (answer.length() == 0){
answer += "a";
}
//15자리까지 자르고, 끝에 . 제거
if(answer.length() >= 16) {
answer = answer.substring(0, 15);
answer = answer.replaceAll("[.]$", "");
}
//2자 이하면 길이 3 될때 까지 반복
if(answer.length() <= 2) {
while(answer.length() < 3){
answer += answer.charAt(answer.length()-1);
}
}
return answer;
}
}

[다른 사람의 풀이]


  
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;
}
}
}

[정리]

- 정규식의 기본적인 문법만 알고 있다면 정말 많은 응용이 가능하다! 참 유용한 듯 ㅎㅎ

- 코드의 재사용성, 유지보수 관리 측면까지 고려한 내부클래스의 메서드 사용... 실무에서 많이 쓰이는 패턴 중 하나이기도 하다!

 

개인 피셜 난이도 : ★☆☆

단순히 테스트의 답만을 찾기 보단,

이렇게 다른 분들의 코드를 보며 리뷰하고, 내 소스와 비교해보면서

알아가는 재미가 쏠쏠하다.

늦게라도 시작한 코딩 테스트이지만,

계속해서 멈추지 않고,

꾸준히 내 갈길 가자!

 

끝.

728x90
반응형