https://school.programmers.co.kr/learn/courses/30/lessons/72410
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
정규 표현식(regex)
https://codechacha.com/ko/java-regex/
- Regex는 문자열에 어떤 패턴의 문자들이 있는지 찾는데 도움을 준다.
Regula Expression | Description |
. | 어떤 문자 1개를 의미 |
^regex | ^ 다음 regex로 line을 시작하는지 |
regex$ | $ 앞의 regex가 line의 마지막으로 끝나는지 |
[abc] | a, b, c 중의 문자 1개 |
[abc][vz] | a, b, c 중에 문자 1개와 v, z 중에 문자 1개의 조합 |
[^abc] | a, b, c를 제외한 문자 1개 |
[a-d1-7] | a |
X|Z | X 또는 Z |
\d | 0~9 사이의 숫자, [0-9]와 동일 |
\D | 숫자가 아닌 어떤 문자, [^0-9]와 동일 |
\s | whitespace 1개, [\t\n\x0b\r\f]와 동일 |
\S | whitespace를 제외한 문자 |
\w | Alphanumeric(alphabet, 숫자) 문자, [a-zA-Z_0-9]와 동일 |
\W | Alphanumeric을 제외한 문자(whitespace 등) |
\S+ | whitespace를 제외한 여러 문자 |
\b | 단어의 경계(공백)를 찾습니다 |
Quantifiers
- 요소들을 얼마나 반복시킬지 정의
Regular Expression | Description |
* | 0회 이상 반복 |
+ | 1회 이상 반복 |
? | 0 또는 1회만 |
{X} | X회 이상 반복 |
{X,Y} | X~Y 사이의 수만큼 반복 |
*? | 가장 적게 일치하는 패턴을 찾음 |
자바 문자열 조작함수
[Java] 문자열(String) 조작 함수 이해하기 : 조작 및 비교 함수 — Contributor9 (tistory.com)
startsWith
- 문자열 내에 접두사로 해당 문자열이 있는지 확인하는 함수
endsWith
- 문자열 내에 접미사로 해당 문자열이 있는지 확인하는 함수
시도 1)
class Solution {
public String solution(String new_id) {
//1단계 소문자로 치환
new_id = new_id.toLowerCase();
//2단계 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
new_id = new_id.replaceAll("[^a-z0-9._-]", "");
//3단계 마침표가 2번이상 연속된 부분을 하나의 마침표로 치환
new_id = new_id.replaceAll("\\.+",".");
//4단계 마침표가 처음이나 끝에 위치한다면 제거
if (new_id.startsWith(".")) {
new_id = new_id.substring(1);
} else if (new_id.endsWith(".")) {
new_id = new_id.substring(0, new_id.length() - 1);
}
//5단계 빈 문자열이라면, new_id에 "a"를 대입
if(new_id.length()==0)
{
new_id+="a";
}
//6단계 길이가 16자 이상이라면, new_id의 첫 15개의 문자를 제외한
//나머지 문자들을 모두 제거
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
if(new_id.length()>=16)
{
new_id = new_id.substring(0,15);
if(new_id.endsWith("."))
{
new_id = new_id.substring(0, new_id.length() - 1);
}
}
//7단계 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
if(new_id.length()<=2)
{
char ch = new_id.charAt(new_id.length()-1);
while(new_id.length()<3)
{
new_id+=String.valueOf(ch);
}
}
return new_id;
}
}
반례
입력값 〉 ".ab......cd."
기댓값 〉 "ab.cd"
시도 2)
class Solution {
public String solution(String new_id) {
//1단계 소문자로 치환
new_id = new_id.toLowerCase();
//2단계 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
new_id = new_id.replaceAll("[^a-z0-9._-]", "");
//3단계 마침표가 2번이상 연속된 부분을 하나의 마침표로 치환
new_id = new_id.replaceAll("\\.+",".");
//4단계 마침표가 처음이나 끝에 위치한다면 제거
if (new_id.startsWith(".")) {
new_id = new_id.substring(1);
} else if (new_id.endsWith(".")) {
new_id = new_id.substring(0, new_id.length() - 1);
}
//5단계 빈 문자열이라면, new_id에 "a"를 대입
if(new_id.length()==0)
{
new_id+="a";
}
//6단계 길이가 16자 이상이라면, new_id의 첫 15개의 문자를 제외한
//나머지 문자들을 모두 제거
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
if(new_id.length()>=16)
{
new_id = new_id.substring(0,15);
if(new_id.endsWith("."))
{
new_id = new_id.substring(0, new_id.length() - 1);
}
}
//7단계 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
if(new_id.length()<=2)
{
char ch = new_id.charAt(new_id.length()-1);
while(new_id.length()<3)
{
new_id+=String.valueOf(ch);
}
}
if(new_id.endsWith("."))
{
new_id = new_id.substring(0, new_id.length() - 1);
}
return new_id;
}
}
정답
class Solution {
public String solution(String new_id) {
//1단계 소문자로 치환
new_id = new_id.toLowerCase();
//2단계 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
new_id = new_id.replaceAll("[^a-z0-9._-]", "");
//3단계 마침표가 2번이상 연속된 부분을 하나의 마침표로 치환
new_id = new_id.replaceAll("\\.{2,}",".");
//4단계 마침표가 처음이나 끝에 위치한다면 제거
if (!new_id.isEmpty() && new_id.charAt(0) == '.') {
new_id = new_id.substring(1);
}
if (!new_id.isEmpty() && new_id.charAt(new_id.length() - 1) == '.') {
new_id = new_id.substring(0, new_id.length() - 1);
}
//5단계 빈 문자열이라면, new_id에 "a"를 대입
if(new_id.equals(""))
{
new_id+="a";
}
else
{
new_id = new_id;
}
//6단계 길이가 16자 이상이라면, new_id의 첫 15개의 문자를 제외한
//나머지 문자들을 모두 제거
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
if(new_id.length()>=16)
{
new_id = new_id.substring(0,15);
//제거 했는데 마지막 문자가 .이라면
if(new_id.endsWith("."))
{
new_id = new_id.substring(0, new_id.length() - 1);
}
}
//7단계 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
if(new_id.length()<=2)
{
char ch = new_id.charAt(new_id.length()-1);
while(new_id.length()<3)
{
new_id+=String.valueOf(ch);
}
}
if(new_id.endsWith("."))
{
new_id = new_id.substring(0, new_id.length() - 1);
}
return new_id;
}
}
- substring 사용시 인덱스 범위를 벗어나면 에러가 나므로 문자열이 비어있지 않은지 미리 체크해줘야 함
'Java > 프로그래머스' 카테고리의 다른 글
[JAVA] 프로그래머스 - 자연수 뒤집어 배열로 만들기 (0) | 2024.05.14 |
---|---|
[JAVA] 프로그래머스 체육복 (0) | 2024.05.13 |
[JAVA] 프로그래머스 - 자릿수 더하기 (0) | 2024.05.13 |
[JAVA] 프로그래머스 - 약수의 합 (0) | 2024.05.13 |
[JAVA] 프로그래머스 - 문자열을 정수로 바꾸기 (0) | 2024.05.13 |