프로그래머스(programmers)-신규 아이디 추천-JAVA

SUIN·2022년 5월 24일
0

백준/프로그래머스

목록 보기
16/18
post-thumbnail

신규 아이디 추천

문제 보러가기:
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단계. 같음

^: 문자열의 처음
$: 문자열의 끝
.: 임의의 한 문자

[]안에서의
^: 해당 문자들을 제외.
-:범위를 지정해줌 앞의 문자부터 뒤의 문자까지.

참고한 사이트:
https://gh402.tistory.com/54?category=890133


오늘의 tmi: 오늘이라 하기도 뭐하다. 왜냐면 하루에 여러개를 올려버렸기 때문이다. 오늘은 쩌는 걸 발견했다.
잘 보시라

짜잔!

ㅎㅎ

profile
공부하기싫을때붙잡고공부해봤자비명밖에안나옵니다지금제가그래요

0개의 댓글