문제 보러가기:
https://programmers.co.kr/learn/courses/30/lessons/72410
class Solution {
public String solution(String new_id) {
//1단계
String answer =new_id.toLowerCase();
//2단계
for(int i=0; i<answer.length();i++){
int a=answer.charAt(i);
if( (96<a && 123>a) || (47<a && 58>a) ||a==95 || a==45 ||a==46){
}
else
{
answer=answer.replace(answer.charAt(i), ' ');
}
}
answer=answer.replaceAll(" ","");
//3단계
while(answer.contains("..")){
answer=answer.replace("..", ".");
}
//4단계
while(answer.charAt(0)=='.' || answer.charAt(answer.length()-1)=='.'){
if(answer.length()<=1){
answer="";
break;
}
if(answer.charAt(0)=='.')
answer=answer.substring(1, answer.length());
else
answer=answer.substring(0, answer.length()-1);
}
//5단계
if(answer.isEmpty())
answer="a";
//6단계
if(answer.length()>=16){
answer=answer.substring(0,15);
}
while(answer.charAt(answer.length()-1)=='.'){
answer=answer.substring(0, answer.length()-1);
}
//7단계
while(answer.length()<3){
answer+=answer.charAt(answer.length()-1);
}
return answer;
}
}
내가 푼 풀이
1단계. toLowerCase()함수를 통해 모든 대문자를 소문자로 변경
2단계. 반복문과 아스키코드 값을 활용하여 해당 문자가 아이디에 적합한 문자인지를 확인하고 아니면 우선적으로 공백으로 변경.
이후에 공백을 replaceAll로 모두 제거.
3단계. ..이 아이디에 포함되는 동안 계속해서 ..을 .으로 변경하는 반복문 실행
4단계. 맨 끝이나 처음문자가 .인지 확인 후, 문자의 길이가 1개거나 0개이면 ""을 저장. 아닌 경우에는 .이 처음에 존재하는지 끝에 존재하는지 여부에 따라서 문자열을 잘라서 저장.
5단계. 문자열이 비어있는지 확인하고, 비어있다면 a저장
6단계. 문자열의 길이가 16자를 넘는지 확인하고, 넘는다면 15자까지 잘라서 저장. +자른 상태에서의 마지막 문자가 .인지 확인하고 맞다면 제거.
7단계. 문자열의 길이가 3미만이라면 맨끝 문자와 같은 문자를 뒤에 추가.
문자열에 관한 함수와 문법이 잘 설명되어 있는 사이트:
https://offbyone.tistory.com/401
잘 풀긴 했으나, 이 문제는 정규표현식이라는 방법을 활용하면 훨씬 더 간단하게 해결할 수 있다고 한다.
모범 답안
class Solution {
public String solution(String new_id) {
//1단계
String answer = new_id.toLowerCase();
// 2단계
answer = answer.replaceAll("[^a-z0-9-_.]", "");
// 3단계
answer = answer.replaceAll("[.]{2,}", ".");
// 4단계
answer = answer.replaceAll("^[.]{1}", "");
answer = answer.replaceAll("[.]{1}$", "");
// 5단계
if (answer.equals("")) {
answer += "a";
}
// 6단계
if (answer.length() >= 16) {
answer = answer.substring(0, 15);
}
answer = answer.replaceAll("[.]{1}$", "");
// 7단계
while(answer.length()<3){
answer+=answer.charAt(answer.length()-1);
}
return answer;
}
}
정규표현식:특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어.
1단계. 같음
2단계. a-z,0-9,-,_,.이 아닌(^) 경우에는 모두 ""로 대체
3단계. .이 2회 이상 반복될 경우({2,}), 모두 "."으로 대체
4단계. 처음(^)이나 끝($)에 .이 존재하는 경우 모두 ""로 대체
5단계. 같음
6단계. 16자 이상인경우 15자로 자르고, 끝에 .이 존재하는지 확인하고 대체.
7단계. 같음
^: 문자열의 처음
$: 문자열의 끝
.: 임의의 한 문자
[]안에서의
^: 해당 문자들을 제외.
-:범위를 지정해줌 앞의 문자부터 뒤의 문자까지.
오늘의 tmi: 오늘이라 하기도 뭐하다. 왜냐면 하루에 여러개를 올려버렸기 때문이다. 오늘은 쩌는 걸 발견했다.
잘 보시라
짜잔!
ㅎㅎ