[프로그래머스] 신규 아이디 추천 - JAVA

[프로그래머스] 신규 아이디 추천 - JAVA

[프로그래머스] 신규 아이디 추천 - JAVA

정규 표현식을 모른다면 굉장히 귀찮은 문제가 될 수 있습니다.

그래도 정규 표현식을 모른다는 가정 하에 문자열로만 풀 수 있어야한다고 생각하기 때문에,

정규 표현식을 사용하지 않고 이 문제를 풀어봤습니다.

단계는 총 7단계이며 그 단계들을 모두 처리해준다면 이 문제를 풀게됩니다.

단계가 차례로 나와서 좀 쉽다고 느껴졌습니다.

public String solution(String new_id) { String answer = ""; String step1 = new_id.toLowerCase(); char[] step1arr = step1.toCharArray(); StringBuilder step2 = new StringBuilder(); for(char c : step1arr){ if ((c >= 'a' && c<= 'z') || (c >= '0' && c <= '9') || c == '-' || c== '_' || c=='.'){ step2.append(c); } } String step3 = step2.toString().replace("..","."); while(step3.contains("..")){ step3 = step3.replace("..","."); } String step4 = step3; if (step4.length() > 0){ if (step4.charAt(0) == '.'){ step4 = step4.substring(1); } } if (step4.length() > 0){ if (step4.charAt(step4.length()-1) == '.'){ step4 = step4.substring(0,step4.length()-1); } } String step5 = step4; if (step5.equals("")){ step5 = "a"; } String step6 = step5; if (step6.length() >= 16){ step6 = step6.substring(0,15); if (step6.charAt(step6.length()-1) == '.'){ step6 = step6.substring(0, step6.length()-1); } } StringBuilder step7 = new StringBuilder(step6); if (step7.length() <= 2){ while(step7.length() < 3){ step7.append(step7.charAt(step7.length()-1)); } } return String.valueOf(step7); }

좀 긴 코드가 되었네요. 정규표현식으로 풀면 진짜 짧아집니다.

단계별로 풀어보겠습니다.

STEP1

문자열을 받아 대문자인 걸 소문자로 바꿔줍니다.

이 부분에서도 사실 여러가지 알고리즘이 있습니다만 저는 자바의 내장 함수 toLowerCase를 사용하겠습니다.

사실 이러면 1단계는 끝입니다.

STEP2

해당 문자열이 소문자, 숫자, -, _, . 이 아니라면 다 제거해줍니다.

하지만 문자열 자체로 만들어진 문자열에서 제거하는 것은 불가능합니다.

그래서 문자열 다루기가 조금 더 편한 좀 더 유한 StringBuilder를 사용합니다.

StringBuilder에 step1에서 만든 문자열을 넣어줍니다.

그 후, step1을 char 배열에 넣어줍니다.

그 다음 위의 문자들이 아니라면 Stringbuilder에 넣어주지 않습니다.

STEP3

그 후, step3는 다시 문자열로 만들어서 ..을 포함하고 있는지 확인합니다.

..를 포함한다면 .하나로 바꿔줍니다.

while문을 사용하여 ..이 없어지는 그 날까지 반복해줍니다.

STEP4

맨 앞 또는 맨 뒤에 .이 온다면 지워주는 단계입니다.

step4에 step3를 넣어줍니다. (단계 구별을 위하여 같은 문자열이라도 넣었습니다.)

맨 앞에 .이 온다면 맨앞을 substring(1)을 해서 맨 앞 문자열이 없는 부분 문자열로 대체해줍니다. 이건 삭제가 아니라 부분 문자열로 바꾸는 메소드입니다. (사실 삭제랑 비슷합니다.)

그 다음 맨 뒤에 .이 온다면 substring(0, 마지막) 해서 마지막 문자가 없는 부분 문자열로 만듭니다.

STEP5

아주 쉽습니다. 만약 들어온 문자열이 빈 문자열이라면 그냥 a를 넣어주면 됩니다.

STEP6

문자열 길이가 16 이상이라면 15로 바꿔줘야합니다.

그래서 아까 substring을 사용했던 것처럼 부분 문자열을 만들어줍니다. substring(0,15)

하지만 그러고도 마지막이 .이 될 수 있으므로 그에 대한 처리도 해줍니다. (step4와 비슷)

STEP7

마지막으로 문자열의 길이가 2 이하라면 3이상으로 만들어줘야합니다.

추가할 문자열은 마지막 문자를 반복해서 집어 넣어줘서 추가합니다.

문자열에서 추가는 보통 아까 말씀드린 StringBuilder를 사용합니다.

이제까지 만들어진 문자열을 Stringbuilder로 만들어줍니다.

그 후 길이가 2 이하라면 길이가 3 이상이 될 때까지 마지막 문자를 append 해줍니다.

마지막

Stringbuilder를 마지막으로 사용했는데, 메소드의 반환형이 String이므로 StringBuilder를 String으로 변환해주면 됩니다.

String.valueOf(Step7) 을 사용하여 마무리 지어줍니다.

문자열을 잘 다룰 줄 안다면 그렇게 어려운 문제는 아니었다고 생각합니다.

다음 번엔 이 문제를 정규 표현식으로 푸는 방법을 포스팅 할 예정입니다.

화이팅!

from http://soobinhand.tistory.com/52 by ccl(A) rewrite - 2021-11-01 14:01:16