μ½”λ”©ν…ŒμŠ€νŠΈ/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[Lv.1] μ‹ κ·œ 아이디 μΆ”μ²œ

벼리01 2023. 11. 17. 00:09

μ–Έμ–΄: java

 

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 2021 KAKAO BLIND RECRUITMENT > μ‹ κ·œ 아이디 μΆ”μ²œ

 

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

[문제 μ„€λͺ…]

μΉ΄μΉ΄μ˜€μ— μž…μ‚¬ν•œ μ‹ μž… 개발자 λ„€μ˜€λŠ” "μΉ΄μΉ΄μ˜€κ³„μ •κ°œλ°œνŒ€"에 λ°°μΉ˜λ˜μ–΄, 카카였 μ„œλΉ„μŠ€μ— κ°€μž…ν•˜λŠ” μœ μ €λ“€μ˜ 아이디λ₯Ό μƒμ„±ν•˜λŠ” 업무λ₯Ό λ‹΄λ‹Ήν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. "λ„€μ˜€"μ—κ²Œ μ£Όμ–΄μ§„ 첫 μ—…λ¬΄λŠ” μƒˆλ‘œ κ°€μž…ν•˜λŠ” μœ μ €λ“€μ΄ 카카였 아이디 κ·œμΉ™μ— λ§žμ§€ μ•ŠλŠ” 아이디λ₯Ό μž…λ ₯ν–ˆμ„ λ•Œ, μž…λ ₯된 아이디와 μœ μ‚¬ν•˜λ©΄μ„œ κ·œμΉ™μ— λ§žλŠ” 아이디λ₯Ό μΆ”μ²œν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
λ‹€μŒμ€ 카카였 μ•„μ΄λ””μ˜ κ·œμΉ™μž…λ‹ˆλ‹€.

 

μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 3자 이상 15자 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

μ•„μ΄λ””λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.) 문자만 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

단, λ§ˆμΉ¨ν‘œ(.)λŠ” 처음과 끝에 μ‚¬μš©ν•  수 μ—†μœΌλ©° λ˜ν•œ μ—°μ†μœΌλ‘œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

"λ„€μ˜€"λŠ” λ‹€μŒκ³Ό 같이 7λ‹¨κ³„μ˜ 순차적인 처리 과정을 톡해 μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디가 카카였 아이디 κ·œμΉ™μ— λ§žλŠ” μ§€ κ²€μ‚¬ν•˜κ³  κ·œμΉ™μ— λ§žμ§€ μ•Šμ€ 경우 κ·œμΉ™μ— λ§žλŠ” μƒˆλ‘œμš΄ 아이디λ₯Ό μΆ”μ²œν•΄ μ£Όλ €κ³  ν•©λ‹ˆλ‹€.
μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디가 new_id λΌκ³  ν•œλ‹€λ©΄,

1단계 new_id의 λͺ¨λ“  λŒ€λ¬Έμžλ₯Ό λŒ€μ‘λ˜λŠ” μ†Œλ¬Έμžλ‘œ μΉ˜ν™˜ν•©λ‹ˆλ‹€.

2단계 new_idμ—μ„œ μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.)λ₯Ό μ œμ™Έν•œ λͺ¨λ“  문자λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

3단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ 2번 이상 μ—°μ†λœ 뢀뢄을 ν•˜λ‚˜μ˜ λ§ˆμΉ¨ν‘œ(.)둜 μΉ˜ν™˜ν•©λ‹ˆλ‹€.

4단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ μ²˜μŒμ΄λ‚˜ 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ μ œκ±°ν•©λ‹ˆλ‹€.

5단계 new_idκ°€ 빈 λ¬Έμžμ—΄μ΄λΌλ©΄, new_id에 "a"λ₯Ό λŒ€μž…ν•©λ‹ˆλ‹€.

6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€. λ§Œμ•½ 제거 ν›„ λ§ˆμΉ¨ν‘œ(.)κ°€ new_id의 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ 끝에 μœ„μΉ˜ν•œ λ§ˆμΉ¨ν‘œ(.) 문자λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

7단계 new_id의 길이가 2자 μ΄ν•˜λΌλ©΄, new_id의 λ§ˆμ§€λ§‰ 문자λ₯Ό new_id의 길이가 3이 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ„œ 끝에 λΆ™μž…λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, new_id 값이 "...!@BaT#*..y.abcdefghijklm" 라면, μœ„ 7단계λ₯Ό 거치고 λ‚˜λ©΄ new_idλŠ” μ•„λž˜μ™€ 같이 λ³€κ²½λ©λ‹ˆλ‹€.

1단계 λŒ€λ¬Έμž 'B'와 'T'κ°€ μ†Œλ¬Έμž 'b'와 't'둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
"...!@BaT#*..y.abcdefghijklm" → "...!@bat#*..y.abcdefghijklm"

2단계 '!', '@', '#', '*' λ¬Έμžκ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
"...!@bat#*..y.abcdefghijklm" → "...bat..y.abcdefghijklm"

3단계 '...'와 '..' κ°€ '.'둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
"...bat..y.abcdefghijklm" → ".bat.y.abcdefghijklm"

4단계 μ•„μ΄λ””μ˜ μ²˜μŒμ— μœ„μΉ˜ν•œ '.'κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
".bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"

5단계 아이디가 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλ―€λ‘œ λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
"bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"

6단계 μ•„μ΄λ””μ˜ 길이가 16자 μ΄μƒμ΄λ―€λ‘œ, 처음 15자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ΄ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
"bat.y.abcdefghijklm" → "bat.y.abcdefghi"

7단계 μ•„μ΄λ””μ˜ 길이가 2자 μ΄ν•˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
"bat.y.abcdefghi" → "bat.y.abcdefghi"

 

λ”°λΌμ„œ μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ new_idκ°€ "...!@BaT#*..y.abcdefghijklm"일 λ•Œ, λ„€μ˜€μ˜ ν”„λ‘œκ·Έλž¨μ΄ μΆ”μ²œν•˜λŠ” μƒˆλ‘œμš΄ μ•„μ΄λ””λŠ” "bat.y.abcdefghi" μž…λ‹ˆλ‹€.

 

[문제]

μ‹ κ·œ μœ μ €κ°€ μž…λ ₯ν•œ 아이디λ₯Ό λ‚˜νƒ€λ‚΄λŠ” new_idκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, "λ„€μ˜€"κ°€ μ„€κ³„ν•œ 7λ‹¨κ³„μ˜ 처리 과정을 거친 ν›„μ˜ μΆ”μ²œ 아이디λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

[μ œν•œμ‚¬ν•­]

new_idλŠ” 길이 1 이상 1,000 μ΄ν•˜μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
new_idλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, 특수문자둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
new_id에 λ‚˜νƒ€λ‚  수 μžˆλŠ” νŠΉμˆ˜λ¬ΈμžλŠ” -_.~!@#$%^&*()=+[{]}:?,<>/ λ‘œ ν•œμ •λ©λ‹ˆλ‹€.

 


πŸ“Œ 풀이

[μ–Έμ–΄] java

 

μ£Όμ–΄μ§„ String을 쑰건에 맞게 λ³€κ²½ν•˜λŠ” 문제. 개인적으둜 λ„ˆλ¬΄ μž¬λ°ŒλŠ” λ¬Έμ œμ˜€λ‹€!

 

String answer = new_id.toLowerCase()			//	1단계
 			.replaceAll("[^a-z0-9-_\\.]", "")	//	2단계
 			.replaceAll("\\.{2,}", "\\.")		//	3단계
			.replaceAll("\\.$|^\\.", "");		//	4단계

 

 

1단계

λŒ€λ¬Έμžλ₯Ό μ†Œλ¬Έμžλ‘œ μΉ˜ν™˜

toLowerCase()

 

2단계

μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.) 문자만 λΉΌκ³  남기기

[a-z] μ•ŒνŒŒλ²³ μ†Œλ¬Έμž

[0-9] 숫자

[-_\\.] 쑰건에 λ‚˜μ˜¨ 특수문자(.(λ§ˆμΉ¨ν‘œ)λŠ” κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ €λ©΄ μ΄μŠ€μΌ€μ΄ν”„ 문자 \(λ°±μŠ¬λž˜μ‹œ) 두 개λ₯Ό λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€.)

λŒ€κ΄„ν˜Έ([]) λ‚΄μ˜ ^은 not을 μ˜λ―Έν•œλ‹€.

[^a-z0-9-_\\.] λ₯Ό "" 빈문자둜 λ³€κ²½ν•œλ‹€.

 

3단계

λ§ˆμΉ¨ν‘œκ°€ 두 개 이상이면 ν•œ 개둜 λ³€κ²½

\\. λ§ˆμΉ¨ν‘œ

{2,} 2개 이상

\\.{2,} λ₯Ό \\.둜 λ³€κ²½ν•œλ‹€.

 

4단계

λ§ˆμΉ¨ν‘œλ‘œ μ‹œμž‘ν•˜κ±°λ‚˜ λ§ˆμΉ¨ν‘œλ‘œ λλ‚˜λ©΄ λ§ˆμΉ¨ν‘œ μ‚­μ œ

\\.$ λ§ˆμΉ¨ν‘œλ‘œ λλ‚˜λŠ” 문자

^\\. λ§ˆμΉ¨ν‘œλ‘œ μ‹œμž‘ν•˜λŠ” 문자

\\.$|^\\. λ₯Ό "" 빈 λ¬Έμžμ—΄λ‘œ λ³€κ²½ν•œλ‹€.(쑰건이 μ—¬λŸ¬κ°œμΌ λ•Œ |(νŒŒμ΄ν”„λΌμΈ)을 λ„£μ–΄μ€€λ‹€.)

 

 

if(answer.length() == 0){
	answer = "a";
    }

 

 

5단계

빈 λ¬Έμžμ—΄μ΄λ©΄ "a" μΆ”κ°€

 

 

if(answer.length >= 16){
	answer = answer.substring(0, 15).replaceAll("\\.$", "");
}

 

 

6단계

길이가 16자 이상이면 첫 15개의 문자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ λͺ¨λ‘ 제거

λ§Œμ•½ 제거 ν›„ λ§ˆμΉ¨ν‘œ(.)κ°€ new_id의 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ 끝에 μœ„μΉ˜ν•œ λ§ˆμΉ¨ν‘œ(.) 문자λ₯Ό 제거

substring(0, 15) 0μ—μ„œ 15κΉŒμ§€μ˜ 문자만 κ°€μ§€κ³  옴

\\.$ λ§ˆμΉ¨ν‘œλ‘œ λλ‚˜λŠ” 문자λ₯Ό λΉˆλ¬Έμžμ—΄λ‘œ λ³€κ²½

 

if(answer.length() <= 3){
	for(int i = 0; i < 3; i++){
		answer += answer.charAt(answer.length()-1);
        
    if(answer.length() == 3){
    	break;
    }
    
    }
   
}

 

while(answer.length() <= 3){
	answer += answer.charAt(answer.length-1);
    }

 

μ΄λ ‡κ²Œ 써도 될듯

 

 

7단계

길이가 2 μ΄ν•˜λΌλ©΄ λ§ˆμ§€λ§‰ 문자λ₯Ό 길이가 3이 될 λ•ŒκΉŒμ§€ 뢙인닀.

charAt(answer.length()-1) answer의 λ§ˆμ§€λ§‰ 문자.

길이가 3이 되면 반볡문 쀑지. μ½”λ“œκ°€ μ’€ λ”λŸ½λ‹€. 더 쒋은 방법이 μžˆμ—ˆμ„ 텐데 μ•„μ£Ό κ·Έλƒ₯ ν†΅κ³Όν•˜κ³  μ‹Άμ–΄μ„œ μ•ˆλ‹¬μ΄ λ‚¬μ—ˆλ‚˜λ΄„...

 

 

 

 

전체 μ½”λ“œ(1단계~7단계)

 

class Solution {
    public String solution(String new_id) {
        String answer = "";
        answer = new_id.toLowerCase()
        		.replaceAll("[^a-z0-9-_\\.]", "")
        		.replaceAll("\\.{2,}", "\\.")
        		.replaceAll("\\.$|^\\.", "");

		if(answer.length() == 0){
			answer = "a";
		}
        
        if(answer.length() >= 16){
			answer = answer.substring(0, 15).replaceAll("\\.$", "");
		}else if(answer.length() <= 2){
			for(int i = 0; answer.length() < 3; i++) {
				answer += answer.charAt(answer.length() - 1);

				if(answer.length() > 3){
					break;
				}
			}
		}
        return answer;
    }
}

 

 

 

 

μ–Όλ ˆλ²Œλ ˆ ν†΅κ³ΌλŠ” ν–ˆμ§€λ§Œ μ΄λ ‡κ²Œ μ •λ¦¬ν•˜κ³  λ‚˜λ‹ˆ μ’€ 더 κ³ λ €ν•΄μ•Όν•  사항이 보인닀.

 String의 길이 변경이 μžˆλŠ” κ³³μ—μ„œ StringBuilderλ₯Ό μ‚¬μš©ν•˜κ³ , 가독성 있게 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ 더 쒋은 μ½”λ“œκ°€ 될 것 κ°™λ‹€!

 

μ •κ·œμ‹ 짱이 될 κ±°μ•Ό