글 작성자: bbangson
반응형

 

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

 

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

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

programmers.co.kr

신규 아이디 추천


 

난이도 :  Level1

 

 카카오에서 자주 출제되는 유형인 문자열 다루는 문제입니다. String 클래스의 메소드와 정규표현식을 잘 사용한다면 굉장히 쉽게 풀 수 있는 문제이지만, 정규표현식을 잘 모른다면 시간이 좀 걸릴 것 같습니다. 

 

 문제에 주어진 각 단계의 조건에 맞춰서 문제를 해결해 나가면 풀 수 있습니다.

1단계) 소문자로 치환 -> toLowerCase()

2단계) 소문자, 숫자, 빼기( - ), 밑줄( _ ), 마침표( . )를 제외한 모든 문자 제거 -> 정규표현식

3단계) 마침표( . )가 2번 이상이면 하나로 치환 -> 정규표현식

4단계) 마침표( . )가 처음과 끝에 위치하면 제거 -> 정규표현식

5단계) 빈 문자열이라면, "a" 대입 -> if문

6단계) 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자 제거. 다시 4단계 실행. -> substring(), 정규표현식

7단계) 2자 이하라면, 마지막 문자를 길이가 3이될 때까지 추가 -> while문 

 

 

- String solution(String new_id)

 new_id를 입력받고 각 단계별로 요구하는 조건을 구현합니다. 마지막으로 조건에 맞게 수정된 new_id를 다시 return 합니다. 

 

1단계

toLowerCase() => 영어 대문자를 소문자로 치환합니다. 

 

2단계 

 replaceAll 메소드는 좌측에 정규표현식에 해당하는 조건을 작성하고 이 값이 true 값이면, 우측에 있는 문자열로 치환합니다. replace 메소드도 있지만 이 메소드는 정규표현식을 조건에 작성할 수 없어 replaceAll 메소드를 사용합니다. 맨 앞에 ^연산자는 논리 연사자 !과 유사합니다. 문자열에서 - _ . 0~9 a~z에 해당하지 않는 문자는 true 값을 반환하여 우측에 있는 ""값으로 치환합니다. 즉, 제거하는 것입니다.

 

3단계

 "[.]{2,}"은 [ ] 괄호 안의 문자가 최소 2개 이상이라는 의미를 나타냅니다. 범위를 정하고자 하면 {2,5}와 같이 , 뒤에 숫자를 적어주면 됩니다. 

 

4단계

 "^[.]|[.]$" 에서도 ^연산자가 사용됩니다. 하지만 2단계에서 사용한 것과는 다릅니다. [ ] 괄호 안에 사용되는 ^는 논리 연산자 !과 유사한 성질을 갖지만 [ ] 괄호 밖에 사용 되는 ^ 연산자는 시작을 나타냅니다. 즉, 문자열이 마침표로 시작하면 true 값을 반환합니다. | 연산자는 || 연산자와 유사한 or의 의미를 갖고 있습니다. $ 연산자는 ^ 연산자와 반대로 [ ] 괄호 안의 문자로 끝나는 경우 true를 반환합니다. 즉, 마침표로 시작하거나 마침표로 끝나면 이 정규표현식은 true를 반환하고 우측에 있는 ""(빈 값)로 치환합니다. 

 

5단계

 길이가 0이면 "a" 값을 넣어줍니다. 

 

6단계 

 if문을 통해 조건을 작성하고 substring 메소드로 문자열을 잘라냈습니다. 그 후 4단계에서 사용했던 정규표현식을 다시 한번 사용했습니다.

 

7단계

 마지막 문자를 charAt 메소드를 통해 가져오고 while 문을 통해 조건을 만들어준 다음 += 연산자로 뒤에 더해줬습니다. 

 

 

 

  코드
import java.util.ArrayList;

class Solution {
	public static String solution(String new_id) {
		
		// 1단계
		new_id = new_id.toLowerCase();
		
		// 2단계
		new_id = new_id.replaceAll("[^-_0-9a-z.]", "");
		
		// 3단계
		new_id = new_id.replaceAll("[.]{2,}", ".");
		
		// 4단계
		new_id = new_id.replaceAll("^[.]|[.]$", "");

		// 5단계
		if(new_id.length() == 0) {
			new_id = "a";
		}
		
		// 6단계
		if(new_id.length() >= 16) {
			new_id = new_id.substring(0, 15);
			new_id = new_id.replaceAll("^[.]|[.]$", "");
		}

		// 7단계
		char last = new_id.charAt(new_id.length()-1);
		while(new_id.length() <= 2) {
			new_id += last;
		}

		return new_id;
	}
}

 

 

피드백 환영합니다.

반응형