알고리즘/프로그래머스

[프로그래머스] 신규 아이디 추천 for JAVA

정석이 2021. 11. 5. 19:05

 

 

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

 

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

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

programmers.co.kr

 

 

 

 

 

 

 

 


 

 

 

후... 이 문제 여러가지 검색하다가 너무 오래걸려서 다른 사람꺼 보기로 했다.

 

 

테스트케이스 1개만 통과되는 개욱긴 코드

 

 

 

고민의 흔적들....

 

 

 

 

다른 사람의 코드를 구경해보니 그냥 문제에 써있는 단계대로 푸는게 좋아보인다.

 

 

나는 단계 내맘대로 만들어서 어쩌구 했는데 ㅎㅎ 그래서 망했나?

 

 

 

 

https://minhamina.tistory.com/121

class Solution {
    public String solution(String new_id) {
		// 1. 소문자로 변경
		new_id = new_id.toLowerCase();

		// 2. 소문자 숫자 -_. 제외한 모든 문자 제거 
		String id = "";
		for(int i = 0; i < new_id.length(); i++) {
			char ch = new_id.charAt(i);

			if(ch >= 'a' && ch <= 'z') {
				id += String.valueOf(ch);
			} else if(ch >= '0' && ch <= '9') {
				id += String.valueOf(ch);
			} else if(ch == '.' || ch == '-' || ch == '_') {
				id += String.valueOf(ch);
			}
		}

		// 3. . 하나만 
		for(int i = 0; i < id.length(); i++) {
			if(id.charAt(i) == '.') {
				int j = i+1;
				String dot = ".";

				while(j != id.length() && id.charAt(j) == '.') {
					dot += ".";
					j++;
				}

				if(dot.length() > 1)
					id = id.replace(dot, ".");
			}
		}

		// 4. 첫번째, 마지막 . 제거
		if(id.startsWith(".") ) {
			id = id.substring(1, id.length());
		} else if(id.endsWith(".")) {
			id = id.substring(0, id.length()-1);
		}

		// 5. 빈 문자열이라면 a 대입 
		if(id.length() == 0) {
			id += "a";
		}

		// 6. 16자 이상이면, 15자만 남김 
		if(id.length() >= 16) {
			id = id.substring(0, 15);
		}
        
		// 마지막 . 제거 
		if(id.endsWith(".")) {
			id = id.substring(0, id.length()-1);
		}

		// 7. 2자 이하라면, 마지막 문자 길이 3까지 반복해서 붙임 
		String last = id.charAt(id.length()-1) + "";
		if(id.length() == 2) {
			id = id + last;
		} else if(id.length() == 1) {
			id = id + last + last;
		}

		return id;
    }
}

 

 

구현에 충실한 코드....

 

 

내가 구현하지 못한 3번..을 저렇게 구현하는구나 ㅎㅎ 

 

j가 id의 제일 끝 인덱스가 아니고 j번째 문자가 "."일 때 +dot 해주고

 

dot가 1보다 크면 여러 "."들을 replace로 "."으로 만들어줌

 

 

 

글고 4번.. startsWith 이라는거 처음본다 ㄷㄷ substring을 사용해 substring(i) 면 i번째 인덱스부터 끝까지 자르기,

 

substring(begin i, start i) 해서 그 위치만큼 자르기!

 

 

 

 

 

 

 

 

그리고 정규식을 이용하면 더 간단하게 코드 구현이 가능하다!

 

class Solution {
    public String solution(String new_id) {
        String id = new_id.toLowerCase(); // 소문자로 
        id = id.replaceAll("[^-_.a-z0-9]", ""); //-_. 영문자 숫자만 남김 
        id = id.replaceAll("[.]{2,}", "."); // .2개 이상 .으로 
        id = id.replaceAll("^[.]|[.]$", ""); // 처음과 끝 . 제거 

        if(id.equals("")) // 빈 문자열이라면 a 추가 
            id += "a";
            
        if(id.length() >= 16){ // 16자 이상이면 15자로 
            id = id.substring(0, 15);
            id = id.replaceAll("^[.]|[.]$", ""); // 끝 . 제거 
        }
        if(id.length() <= 2) // 2자 이하라면 3자까지 마지막 문자추가 
            while(id.length() < 3)
                id += id.charAt(id.length() - 1);

        return id;
    }
}

 

 

 

 

ㄷㄷㄷ

 

 

 

 

내일 모레는 정규식에 대해 정리해야겠다.....