본문 바로가기
문제풀이/프로그래머스

신규 아이디 추천 / 프로그래머스 연습문제 / programmers / level1 / Java

by RUCKUS 2021. 4. 30.

programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

개인적으로 이건 인형뽑기보다는 조금 더 수월했다.

다만, 다른 사람들의 풀이를 보니 이상한 알 수 없는 문자들이 많이 나오더라.

정규표현식이라고 하는데 조만간 이것도 머리속에 집어넣어야겠다.

 

하지만 그것보다 백준과 프로그래머스를 풀면서 점점 드는 생각은

 

자바, 자스, 파이썬 같은 것들도 결국 프로그래밍 "언어" 이고 이 언어를 "작문"을 어떻게 할 것이냐가 핵심이다.

 

라는 것이다.

 

논리적인 사고 방식으로 지속적인 생각을 하는게 중요할 것 같다고 느꼈다. (물론 아직 갈길이 너무 멀다 ㅠ)

 

어쨌든 나의 코드를 이렇다

 

	public static String solution(String new_id) {
        String answer = "";
        String temp = "";
	// 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
        
       for (int i = 0; i < new_id.length(); i++) {
    	   
    	   if ((65 <= new_id.charAt(i)) && (new_id.charAt(i) <= 90)) {
    		   answer += Character.toLowerCase(new_id.charAt(i));
    	   } else {
    		   answer += new_id.charAt(i); 
    	   }
    	   
       }
       System.out.println("1단계 : " + answer);     
        
	// 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
       	for (int i = 0; i < answer.length(); i++) {      		
    	   switch (answer.charAt(i)) {
    	   case 'a':
    		   temp += 'a';
    		   break;   
    	   case 'b':
    		   temp += 'b';
    		   break;   
    	   case 'c':
    		   temp += 'c';
    		   break;   
    	   case 'd':
    		   temp += 'd';
    		   break;   
    	   case 'e':
    		   temp += 'e';
    		   break;   
    	   case 'f':
    		   temp += 'f';
    		   break;   
    	   case 'g':
    		   temp += 'g';
    		   break;   
    	   case 'h':
    		   temp += 'h';
    		   break;   
    	   case 'i':
    		   temp += 'i';
    		   break;   
    	   case 'j':
    		   temp += 'j';
    		   break;   
    	   case 'k':
    		   temp += 'k';
    		   break;   
    	   case 'l':
    		   temp += 'l';
    		   break;   
    	   case 'm':
    		   temp += 'm';
    		   break;   
    	   case 'n':
    		   temp += 'n';
    		   break;   
    	   case 'o':
    		   temp += 'o';
    		   break;   
    	   case 'p':
    		   temp += 'p';
    		   break;   
    	   case 'q':
    		   temp += 'q';
    		   break;   
    	   case 'r':
    		   temp += 'r';
    		   break;   
    	   case 's':
    		   temp += 's';
    		   break;   
    	   case 't':
    		   temp += 't';
    		   break;   
    	   case 'u':
    		   temp += 'u';
    		   break;   
    	   case 'v':
    		   temp += 'v';
    		   break;   
    	   case 'w':
    		   temp += 'w';
    		   break;   
    	   case 'x':
    		   temp += 'x';
    		   break;   
    	   case 'y':
    		   temp += 'y';
    		   break;   
    	   case 'z':
    		   temp += 'z';
    		   break;   
    	   case '-':
    		   temp += '-';
    		   break;   
    	   case '_':
    		   temp += '_';
    		   break;   
    	   case '.':
    		   temp += '.';
    		   break;   
    	   case '0':
    		   temp += '0';
    		   break;   
    	   case '1':
    		   temp += '1';
    		   break;   
    	   case '2':
    		   temp += '2';
    		   break;   
    	   case '3':
    		   temp += '3';
    		   break;   
    	   case '4':
    		   temp += '4';
    		   break;   
    	   case '5':
    		   temp += '5';
    		   break;   
    	   case '6':
    		   temp += '6';
    		   break;   
    	   case '7':
    		   temp += '7';
    		   break;   
    	   case '8':
    		   temp += '8';
    		   break;   
    	   case '9':
    		   temp += '9';
    		   break;   
    	   default:
    		   break;
    	   }  	   
       }
       	
       	answer = temp;  
       	temp = "";
       	System.out.println("2단계 : " + answer);   
	// 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
       	for (int i = 0; i < answer.length(); i++) {
			if (i >= 1 && answer.charAt(i) == '.' && answer.charAt(i-1) == '.') {
				continue;
			} else { 
				temp += answer.charAt(i);
			}
		}
       	answer = temp;
       	temp = "";
       	System.out.println("3단계 : " + answer);
       	
	// 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
       	
       	for (int i = 0; i < answer.length(); i++) {
			if (i == 0 && answer.charAt(i) == '.') {
				continue;
			} else if (i == answer.length()-1 && answer.charAt(answer.length()-1) == '.') {
				continue;
			} else {
				temp += answer.charAt(i);
			}

		}       	
       	answer = temp;
       	temp = "";
       	System.out.println("4단계 : " + answer);
	// 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
       	if (answer == null || answer == "") {
       		
       		answer = "a";
       	}
       	System.out.println("5단계 : " + answer);
	// 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
       	if (answer.length() > 15) {
       		for (int i = 0; i < 15; i++) {
				temp += answer.charAt(i);
			}
       		answer = temp;
           	temp = "";
           	System.out.println("6단계 : " + answer);      	
       	}
       	
    // 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.

       	if (answer.charAt(answer.length()-1) == '.') {
       		for (int i = 0; i < answer.length()-1; i++) {
    				temp += answer.charAt(i);
    		}
       		answer = temp;
           	temp = "";
           	System.out.println("6단계 : " + answer);   
       	}
       	   	
	// 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
       	if (answer.length() == 2) {
       		temp += answer.charAt(0);
       		temp += answer.charAt(1);
       		temp += answer.charAt(1);
       		
       		answer = temp;
           	temp = "";
           	System.out.println("7단계 : " + answer);   
       		
       	} else if (answer.length() == 1) {
       		temp += answer.charAt(0);
       		temp += answer.charAt(0);
       		temp += answer.charAt(0);  
       		
       		answer = temp;
           	temp = "";
           	System.out.println("7단계 : " + answer);   
       		
       	} 
        
        return answer;
    }

평균 처리 시간이 20.00ms 정도 되는 것 같다. 크레인에 비하면 너무 오래걸리는 ㅠㅠ

0.02초라는 게 맞는 걸까? 안심해도 되는 걸까??

우선은 실행이 가능하다는 점에서 만족을 해야할 것 같다.

추후에 숙달되면 처리속도를 줄이는 방법을 고민해봐야 할 듯

 

계속 answer에 초기화해주는 것도 문제일지도?? 잘 모르겠다 ㅠ 혹시나 지나가는 고수 있으시면 댓글좀.

그래도 어찌어찌 성공이다!

 


[깃허브]

https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level01/newId.java

 

RUCKUSJERRY/practiceOfJava

Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.

github.com