λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1] μ‹ κ·œ 아이디 μΆ”μ²œ

by hyebin (Helia) 2023. 3. 3.
λ°˜μ‘ν˜•
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 λͺ¨μŒ

μ‹ κ·œ 아이디 μΆ”μ²œ

문제 μ„€λͺ…

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

  • μ•„μ΄λ””μ˜ κΈΈμ΄λŠ” 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에 λ‚˜νƒ€λ‚  μˆ˜ μžˆλŠ” νŠΉμˆ˜λ¬ΈμžλŠ” -_.~!@#$%^&*()=+[{]}:?,<>/ λ‘œ ν•œμ •λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

no new_id result
1 "...!@BaT#*..y.abcdefghijklm" "bat.y.abcdefghi"
2 "z-+.^." "z--"
3 "=.=" "aaa"
4 "123_.def" "123_.def"
5 "abcdefghijklmn.p" "abcdefghijklmn"

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • 문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • 1단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 2단계 "z-+.^." → "z-.."
  • 3단계 "z-.." → "z-."
  • 4단계 "z-." → "z-"
  • 5단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 6단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 7단계 "z-" → "z--"

μž…μΆœλ ₯ 예 #3

  • 1단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 2단계 "=.=" → "."
  • 3단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 4단계 "." → "" (new_idκ°€ 빈 λ¬Έμžμ—΄μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.)
  • 5단계 "" → "a"
  • 6단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 7단계 "a" → "aaa"

μž…μΆœλ ₯ 예 #4

  • 1λ‹¨κ³„μ—μ„œ 7λ‹¨κ³„κΉŒμ§€ κ±°μΉ˜λŠ” λ™μ•ˆ new_id("123_.def")λŠ” λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, new_idκ°€ μ²˜μŒλΆ€ν„° 카카였의 아이디 κ·œμΉ™μ— λ§žμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #5

  • 1단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 2단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 3단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 4단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 5단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.
  • 6단계 "abcdefghijklmn.p" → "abcdefghijklmn." → "abcdefghijklmn"
  • 7단계 λ³€ν™” μ—†μŠ΅λ‹ˆλ‹€.

제좜

import Foundation

func solution(_ new_id:String) -> String {
    var result = ""
    var new_id = new_id.lowercased()
    
    new_id = new_id.filter{$0.isLetter || $0.isNumber || ($0 == "-" || $0 == "_" || $0 == ".")}
    while (new_id.contains("..")){
        new_id = new_id.replacingOccurrences(of: "..", with: ".")
    }
    if new_id.first == "." {new_id.removeFirst()}
    if new_id.last == "." {new_id.removeLast()}
    if new_id.isEmpty {new_id = "a"}
    if new_id.count >= 16 {
        new_id.removeLast(new_id.count-15)
        if new_id.last == "." {new_id.removeLast()}
    }
    if new_id.count <= 2{
        new_id += String(repeating: new_id.last!, count: 3-new_id.count)
    }

    return new_id
}
new_id λ³€μˆ˜λ₯Ό 생성할 λ•Œ lowercased()λ₯Ό μ‚¬μš©ν•˜μ—¬ 아이디λ₯Ό λͺ¨λ‘ μ†Œλ¬Έμžλ‘œ λ§Œλ“ λ‹€.
이후 filter ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 아이디에 μ•ŒνŒŒλ²³, 숫자 λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.)만 ν¬ν•¨ν•˜λ„λ‘ ν•œλ‹€.
λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•΄ 아이디에 2개의 λ§ˆμΉ¨ν‘œκ°€ μ—°μ†μœΌλ‘œ(..) μžˆλ‹€λ©΄ ν•˜λ‚˜μ˜ λ§ˆμΉ¨ν‘œ(.)둜 μΉ˜ν™˜ν•œλ‹€.
λ§ˆμΉ¨ν‘œκ°€ μ²˜μŒμ— μžˆλ‹€λ©΄ 맨 μ•ž κΈ€μžλ₯Ό μ‚­μ œν•˜κ³ , λ§ˆμΉ¨ν‘œκ°€ λ§ˆμ§€λ§‰μ— μžˆλ‹€λ©΄ λ§ˆμ§€λ§‰ κΈ€μžλ₯Ό μ‚­μ œν•œλ‹€.
아이디가 빈 λ¬Έμžμ—΄μ΄λΌλ©΄ new_id에 "a"λ₯Ό λŒ€μž…ν•œλ‹€.
아이디가 16κΈ€μž 이상이라면 첫 15의 문자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ₯Ό μ‚­μ œν•œ ν›„, λ§ˆμ§€λ§‰ κΈ€μžκ°€ λ§ˆμΉ¨ν‘œ(.)라면 λ§ˆμ§€λ§‰ κΈ€μžλ₯Ό μ‚­μ œν•œλ‹€.
아이디가 2κΈ€μž μ΄ν•˜λΌλ©΄ μ•„μ΄λ””μ˜ λ§ˆμ§€λ§‰ κΈ€μžλ₯Ό μ•„μ΄λ””μ˜ 길이가 3이 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
λ°˜μ‘ν˜•