본문 바로가기

[Algorithms]/[Problems]

PGM. 신규아이디 추천

728x90

programmers.co.kr/learn/courses/30/lessons/72410?language=java

 

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

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

programmers.co.kr

    N사 면접에서 떨어지고 나서, 다시 초심으로 돌아가 기초부터 꼼꼼하게 다지기로 마음먹었다. 떨어진 아쉬움도 컸지만, 부족한 부분을 다듬고 채워야 할 부분을 알게된 소중한 시간이였다. 앞으로 인턴 및 정규직 시험도 몇개 남았는데, 급하게 욕심내기보단, 여유를 가지고 차근차근 밟아나가자! 

이 문제는 전혀 까다롭지 않는 문제지만, 정규표현식을 연습하기 좋은 문제인것 같다.

1. 정규표현식을 사용하지 않는 풀이

class Solution {
    public String solution(String new_id) {
        String answer = "";
        String rs1 = stepOne(new_id);
        String rs2 = stepTwo(rs1);
        System.out.println(rs2);
        String rs3 = stepThr(rs2);
        System.out.println(rs3);
        String rs4 = stepFou(rs3);
        System.out.println(rs4);
        String rs5 = stepFiv(rs4);
        System.out.println(rs5);
        String rs6 = stepSix(rs5);
        System.out.println(rs6);
        String rs7 = stepSev(rs6);
        System.out.println(rs7);
        return rs7;
    }
    // 1단계
    private String stepOne(String id){
        return id.toLowerCase();
    }
    // 2단계
    private String stepTwo(String id){
        StringBuilder sb = new StringBuilder();
        char c;
        for(int i=0; i<id.length(); i++){
            c = id.charAt(i);
            if( c == '-' || c == '_' || c =='.' 
              || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ){
                sb.append(c);    
            } 
            
        }
        return sb.toString();
    }
    // 3단계
    private String stepThr(String id){
        StringBuilder sb = new StringBuilder();
        sb.append(id.charAt(0));
        char c;
        for(int i=1; i<id.length(); i++){
            c = id.charAt(i);
            if(id.charAt(i-1)=='.' && id.charAt(i)=='.') continue;
            sb.append(c);
        }
        return sb.toString();
    }
    // 4단계
    private String stepFou(String id){
        String res = id;
        if(id.charAt(0)=='.'){
            res = res.substring(1,id.length());
        }
        if(id.charAt(id.length()-1)=='.'){
            res = res.substring(0,id.length()-1);
        }
        return res;
    }
    // 5단계
    private String stepFiv(String id){
        if(id.length()==0){
            id += "a";
        }
        return id;
    }
    // 6단계
    private String stepSix(String id){
        String res = id;
        if(res.length()>=16){
            res = res.substring(0,15);
        }
        if(res.charAt(res.length()-1)=='.'){
            res = res.substring(0,res.length()-1);
        }
        return res;
    }
    // 7단계
    private String stepSev(String id){
        String res = id;
        while(res.length()<=2){
            res += id.charAt(id.length()-1);
        }
        return res;
    }
}

 

2. 정규표현식을 사용한 풀이

class Solution {
    public static String solution(String new_id) {
	        String answer = "";
	        String rs1 = stepOne(new_id);
	        String rs2 = stepTwo(rs1);
	        String rs3 = stepThr(rs2);
	        String rs4 = stepFou(rs3);
	        String rs5 = stepFiv(rs4);
	        String rs6 = stepSix(rs5);
	        String rs7 = stepSev(rs6);
	        return rs7;
	    }
	    // 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
	    private static String stepOne(String id){
	        return id.toLowerCase();
	    }
	    // 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
	    private static String stepTwo(String id){
	    	// [^문자]형태 -> 문자를 제외한 모든 문자
	    	// -_.a-z0-9를 제외한 문자 전부 제거
	        return id.replaceAll("[^-_.a-z0-9]","");
	    }
	    // 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
	    private static String stepThr(String id){
	    	// .은 어떤 문자 1개
	    	// [.]은 정확히 .문자 자체를 의미( 그냥 .는 어떤 임의의 문자)
	    	// {2,} -> 2회 이상 반복
	    	// => 정확히 .문자가 2회이상 반복이면 .으로 치환
	        return id.replaceAll("[.]{2,}",".");
	    }
	    // 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
	    private static String stepFou(String id) {
	    	// ^문자 형태 -> 문자로 시작하는지
	    	// 문자$ 형태 -> 문자로 종료하는지
	    	// '.'으로 시작하거나 '.'로 끝나는 경우
	        return id.replaceAll("^[.]|[.]$","");
	    }
	    // 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
	    private static String stepFiv(String id){
	        return (id.length()==0) ? (id+"a") : id ;
	    }
	    // 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
	    //      만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
	    private static String stepSix(String id){
	    	if (id.length() >= 16) id=id.substring(0,15);
	    	return id.replaceAll("^[.]|[.]$","");
	    } 
	    // 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
	    private static String stepSev(String id){
	        while(id.length()<=2){ id += id.charAt(id.length()-1); }
	        return id;
	    }
}

 

3.  2번 풀이 그대로간략화시킨 경우

class Solution {
    public static String solution(String new_id) {
	        String res = new_id.toLowerCase();
	        res = res.replaceAll("[^-_.a-z0-9]","");
	        res = res.replaceAll("[.]{2,}",".");
	        res = res.replaceAll("^[.]|[.]$","");
	        res = (res.length()==0) ? (res+"a") : res;
            if (res.length() >= 16) res=res.substring(0,15);
	        res = res.replaceAll("^[.]|[.]$","");
            while(res.length()<=2){ res += res.charAt(res.length()-1); }
	        return res;
	    }
}


4. python으로 푼 풀이

import re

def solution(new_id):
    st = new_id.lower()
    st = re.sub('[^-_.a-z0-9]', '', st)
    st = re.sub('[.]{2,}', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st
728x90