https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
해당 문제는 제시된 문자열을 제시된 과정을 통해서 문자열을 조작하면서 원하는 문자열로 만드는 문제입니다.
과정은 아래와 같습니다.
- 대문자 -> 소문자
- 소문자, 숫자, 빼기(-), 밑줄('_'), 마침표('.') 제외 모든 문자 제거
- 마침표 2회 이상 연속되면 마침표 하나로
- 마침표가 처음 혹은 끝에 있으면 제거
- 빈 문자열이면 'a' 로 초기화
- 16자 이상, 첫 15문자 제외 나머지 문자 모두 제거
- 만약 끝에 마침표 있다면 제거
- 2자 이하일 경우, 마지막 문자 길이를 3이 될때까지 반복
다만, 이 문제를 쉽게 해결하기 위해서는 정규 표현식을 활용하면 좋습니다.
예를 들어 특정 문자열 형식(영문 소문자, 숫자)을 제외한 나머지 문자열은 제거할 경우 아래와 같은 정규식 사용이 가능합니다.
// 소문자, 숫자, 제외 모든 문자 제거
answer = answer.replaceAll("[^a-z0-9]","");
그리고 처음 문자와 끝 문자가 . 일 경우, 제거하는 방법은 아래와 같습니다.
// 마침표가 처음 혹은 끝에 있다면 제거
answer = answer.replaceAll("^[.]|[.]$", "");
마침표가 최소 2회 이상 연속되면 마침표 하나로 만들려면 아래 코드를 참고하면 됩니다. ( 숫자 뒤에 , 를 사용해야 함)
answer = answer.replaceAll("[.]{2,}",".");
Source Code Example 은 아래와 같습니다.
import java.util.*;
import java.util.stream.*;
class Solution {
public static String solution(String new_id) {
// 모든 대문자 -> 소문자
String answer = new_id.toLowerCase(Locale.ROOT);
// 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 제외 모든 문자 제거
answer = answer.replaceAll("[^-_.a-z0-9]","");
// 마침표 2번 이상 연속된 부분 하나로 (.. -> .)
answer = answer.replaceAll("[.]{2,}",".");
// 마침표가 처음 혹은 끝에 있다면 제거
answer = answer.replaceAll("^[.]|[.]$", "");
// 빈 문자열이면 new_id 에 a 대입
answer = answer.length() > 0 ? answer : "a";
// 16자 이상, 첫 15 문자 제외한 나머지 문자들 모두 제거
answer = answer.length() >= 16 ? answer.substring(0,15) : answer;
// 만약 끝에 . 위치한다면 마지막 마침표 제거
answer = answer.replaceAll("[.]$", "");
// 2자 이하일 경우, 마지막 문자를 길이가 3이 될때까지 반복
if (answer.length() <= 2) {
answer += answer.substring(answer.length()-1);
answer += answer.substring(answer.length()-1);
answer = answer.substring(0,3);
}
return answer;
}
}
참고 링크
Java - 정규표현식(regex), 다양한 예제로 쉽게 이해하기
정규표현식(Regular expressions), Regex는 문자열에서 어떤 패턴을 찾는데 도움을 줍니다. Regex의 Metacharacters, Quantifiers, Grouping에 대해서 정리하였고 다양한 예제로 설명합니다. Regex는 대부분 알고 있지
codechacha.com
'코딩테스트' 카테고리의 다른 글
| [프로그래머스] H-index (0) | 2022.03.29 |
|---|---|
| [프로그래머스] 가장큰수 (0) | 2022.03.28 |
| [프로그래머스] 신고 결과 받기 (0) | 2022.03.15 |
| [프로그래머스] 완주하지 못한 선수 (0) | 2021.08.30 |
| [프로그래머스] 기능개발 (0) | 2021.08.29 |