이용자가 입력한 new_id를 7단계의 규칙에 따라 새로운 아이디로 추천하는 기능을 구현하는 문제입니다.
1단계: 모든 대문자를 소문자로 치환
2단계: 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
3단계: 연속된 마침표(.)를 하나의 마침표로 치환
4단계: 마침표가 맨 처음 또는 맨 끝에 위치하면 제거
5단계: 빈 문자열이면 "a"를 대입
6단계: 길이가 16자 이상이면 첫 15개 문자를 제외하고 모두 제거, 끝이 마침표면 다시 제거
7단계: 길이가 2자 이하면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임
예제
"...!@BaT#*..y.abcdefghijklm" → "bat.y.abcdefghi"
String#toLowerCase() replaceAll("[^a-z0-9._-]", "") replaceAll("\\.{2,}", ".") startsWith, endsWith, substring if (temp.isEmpty()) temp = "a"; substring(0,15) + 끝 마침표 체크 StringBuilder에 반복해서 마지막 문자 추가public class Solution {
public static String solution(String new_id) {
// 1단계: 소문자 변환
String temp = new_id.toLowerCase();
// 2단계: 허용 문자 외 제거
temp = temp.replaceAll("[^a-z0-9._-]", "");
// 3단계: 연속된 마침표 하나로
temp = temp.replaceAll("\\.{2,}", ".");
// 4단계: 양끝 마침표 제거
if (temp.startsWith(".")) temp = temp.substring(1);
if (temp.endsWith(".")) temp = temp.substring(0, temp.length()-1);
// 5단계: 빈 문자열 처리
if (temp.isEmpty()) temp = "a";
// 6단계: 길이 제한
if (temp.length() >= 16) {
temp = temp.substring(0, 15);
if (temp.endsWith(".")) {
temp = temp.substring(0, temp.length()-1);
}
}
// 7단계: 최소 길이 3자 보정
StringBuilder sb = new StringBuilder(temp);
while (sb.length() < 3) {
sb.append(sb.charAt(sb.length() - 1));
}
return sb.toString();
}
[^…] 정규식 패턴을 좀 알아두는게 좋은거 같다 !! substring과 StringBuilder#setLength를 조합하면 잘라내기가 쉽다