ps

[programmers] 신규 아이디 추천

수수한개발자 2022. 5. 10.
728x90

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

 

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

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

programmers.co.kr

카카오 String 문제 중에서는 가장 쉽지 않을까라는 생각을 가지고 풀었습니다.
문제 설명도 잘 되어있고 단계별로 하나씩 조건만 맞춰주면서 풀면 어렵지 않게 풀어낼 수 있을 거라 생각합니다.

 

1단계 : 소문자로 치환

2단계 : 소문자, 숫자, 빼기(-), 마침표(.),밑줄(_) 제외한 나머지 제거

3단계 : 마침표(.)가 2번이상이면 하나로 바꿔주기

4단계 : 마침표(.)가 처음이나 끝에 위치한다면 제거하기

5단계 : 빈 문자열이라면 new_id에 "a"를 대입한다.

6단계 : 길이가 16자 이상이면 잘라주어야한다, 마침표(.)가 new_id의 끝에 있다면 잘라주어야한다.

7단계 : 길이가 2자이하면 길이가 3이 될때까지 끝에 붙여준다.

public class 신규아이디추천 {
	
	public String solution(String new_id) {
		String answer = "";
		//1단계 소문자로 바꿔준다.
		new_id = new_id.toLowerCase();
		//2단계
		for(int i=0; i<new_id.length();i++) {
			char ch = new_id.charAt(i);
			if(Character.isAlphabetic(ch) || Character.isDigit(ch) || ch =='-' || ch=='_' || ch == '.')
					answer += ch;
		}
		//3단계
		while(answer.indexOf("..") != -1) {
			answer = answer.replace("..", ".");
			System.out.println("answer2: "+answer);
		}
		System.out.println("answer3: "+answer);
		//4단계
		if(!answer.isEmpty() && answer.charAt(0) == '.') {
			answer = answer.substring(1);
		}
		if(!answer.isEmpty() && answer.charAt(answer.length()-1) == '.') {
			answer = answer.substring(0, answer.length() -1);
		}
		//5단계
		if(answer.isEmpty()) {
			answer = "a";
		}
		//6단계
		if(answer.length() > 15) {
			answer = answer.substring(0,15);
			if(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;
	}
	
	public static void main(String[] args) {
		신규아이디추천 sol = new 신규아이디추천();
		System.out.println(sol.solution("...!@BaT#*..y.abcdefghijklm"));
		
	}
}

 

코드를 보면서 설명하겠습니다.

클래스명은 문제와 동일하게 맞추려고 한글로 썼습니다..ㅎ

 

1단계

소문자로 치환

new_id = new_id.toLowerCase();

 

https://techjisu.tistory.com/18

제 블로그 String 클래스 메소드를 정리 해놓은 글입니다.

toLowerCase() 를 사용하시면 String이 소문자로 다 바뀝니다.

 

2단계

소문자, 숫자, 빼기(-), 마침표(.),밑줄(_) 제외한 나머지 제거

//2단계
for(int i=0; i<new_id.length();i++) {
	char ch = new_id.charAt(i);
	if(Character.isAlphabetic(ch) || Character.isDigit(ch) || ch =='-' || ch=='_' || ch == '.')
		answer += ch;
}

isAlphavetic : 영문자 확인 메소드

isDigit : 숫자 확인 메소드

여기서 반복문을 돌면서 new_id의 문자 하나씩 ch에 넣고 영문자인지 숫자인지 조건을 걸어주고 '.' , '_' , '-' 이것들이라면 answer에 넣도록 하였습니다.

그러면 소문자,숫자,빼기(-),마침표,밑줄(_) 을 제외한 나머지들은 answer에 들어가지 않으니 제거가 됩니다.

 

3단계

마침표(.)가 2번이상이면 하나로 바꿔주기

//3단계
while(answer.indexOf("..") != -1) {
	answer = answer.replace("..", ".");
}

indexOf 메소드는 String 안에있는 ("")의 index를 반환 합니다.

만약 ("")안에 맞는 값이 없다면 -1을 반환합니다.

replace 메소드는 앞에 값을 뒤에 값으로 바꿔줍니다.

그래서 아이디가 ...bat..y.abcdefghijklm가 들어오게 되면 앞에 ..이 한번 .으로 바뀌게 되면서 ..bat..y.abcdefghijklm 이렇게 바뀌게 되고 다시 ..bat..y.abcdefghijklm 앞에 두개가 ..이 생기기 때문에 .bat..y.abcdefghijklm 으로 바뀌게 되면서 -1을 반환하게되고 while문을 나오게 됩니다.

 

4단계

마침표(.)가 처음이나 끝에 위치한다면 제거하기

 

//4단계
if(!answer.isEmpty() && answer.charAt(0) == '.') {
	answer = answer.substring(1);
}
if(!answer.isEmpty() && answer.charAt(answer.length()-1) == '.') {
	answer = answer.substring(0, answer.length() -1);
}

isEmpty() : 비었을경우 length = 0 을 반환 합니다.

              비어있지 않을경우 false를 반환 합니다.

여기서 isEmpty()로 비어있지 않을경우의 조건을 잡아주지 않으면 비어있을경우 비어있는데 읽어오라는것이기 때문에 Exception을 발생하므로 조건을 잡아줍니다.

(!answer.isEmpty() 앞에 !느낌표를 붙이면 부정 == true가 아닐때, false일때 즉, 비어있지 않을때를 뜻함.)

첫번째 if 문

charAt(0) : 첫 번째가 마침표(.)이면 1부터 끝까지 다 잘라서 answer에 담는다.

두번째 if 문

String.length()는 총 길이는 반환하기때문에 index는 0부터 시작해서 -1을 해줍니다.

ex) String str = "abc"; str.length() ==3 

끝에가 마침표(.)라면 처음부터 length()-1까지 잘라서 answer에 넣어라.

 

5단계

빈 문자열이라면 new_id에 "a"를 대입한다.

 

//5단계
if(answer.isEmpty()) {
	answer = "a";
}

6단계

길이가 16자 이상이면 잘라주어야한다, 마침표(.)가 new_id의 끝에 있다면 잘라주어야한다.

//6단계
if(answer.length() > 15) {
	answer = answer.substring(0,15);
	if(answer.charAt(answer.length()-1) == '.') {
	    answer = answer.substring(0,answer.length() -1);
	}
}

answer.length()가 15가 넘는다면 == 16이상이라면 조건문을 걸어줍니다.

그래서 answer = answer.substring(0,15)로 처음부터 15까지 잘라서 넣어줍니다.

그리고 끝에 마침표(.)가 있다면 4단계에서 했던것처럼 잘라서 넣어줍니다.

 

7단계

길이가 2자이하면 길이가 3이 될때까지 new_id에 마지막문자를 끝에 붙여준다.

//7단계
while(answer.length()<3) {
	answer+=answer.charAt(answer.length() -1);
}
return answer;

answer의 길이가 3보다 작을때까지 while문을 돌게 해주시고 

answer에 끝에 answer의 마지막 index의 문자를 붙여줍니다.

그리고 모든 조건을 만족한 new_id ==answer를 반환해주면 됩니다.

 

String 클래스의 메소드만 잘 안다면 쉽게 차근차근 조건을 붙여주면서 풀 수 있는 문제였습니다.

혹시라도 String 클래스의 메소드를 잘 모르시는 분이라면 제가 쓴글이 있으니 참고해주시면 될 것 같습니다.

 

https://techjisu.tistory.com/18

 

[Java] String 클래스 메소드 정리

startWith 문자열이 지정한 문자로 시작하는지 판단 같으면 true반환 아니면 false를 반환한다.(대소문자구별) String str = "kosmo"; boolean startWith = false; startWith = str.startsWith("k"); System.out.p..

techjisu.tistory.com

 

728x90

'ps' 카테고리의 다른 글

[programmers] 신고 결과 받기  (0) 2022.05.10
[programmers] 숫자 문자열과 영단어  (0) 2022.05.10
[programmers] 하샤드 수  (0) 2022.05.09
상위 n개 레코드  (0) 2022.05.09
핸드폰 번호 가리기  (0) 2022.05.09

댓글