πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ] ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

EarthSea 2024. 3. 23. 14:05

 
 
 
πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ
μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이
✍🏻 Github
문제 풀이 github 링크
 
 
 

문제 μ„€λͺ…

슀마트폰 μ „ν™” ν‚€νŒ¨λ“œμ˜ 각 칸에 λ‹€μŒκ³Ό 같이 μˆ«μžλ“€μ΄ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€.
이 μ „ν™” ν‚€νŒ¨λ“œμ—μ„œ 왼손과 였λ₯Έμ†μ˜ μ—„μ§€μ†κ°€λ½λ§Œμ„ μ΄μš©ν•΄μ„œ μˆ«μžλ§Œμ„ μž…λ ₯ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
맨 처음 왼손 엄지손가락은 * ν‚€νŒ¨λ“œμ— 였λ₯Έμ† 엄지손가락은 # ν‚€νŒ¨λ“œ μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜λ©°, 엄지손가락을 μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 엄지손가락은 μƒν•˜μ’Œμš° 4κ°€μ§€ λ°©ν–₯으둜만 이동할 수 있으며 ν‚€νŒ¨λ“œ 이동 ν•œ 칸은 거리둜 1에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. μ™Όμͺ½ μ—΄μ˜ 3개의 숫자 1, 4, 7을 μž…λ ₯ν•  λ•ŒλŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. 였λ₯Έμͺ½ μ—΄μ˜ 3개의 숫자 3, 6, 9λ₯Ό μž…λ ₯ν•  λ•ŒλŠ” 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  4. κ°€μš΄λ° μ—΄μ˜ 4개의 숫자 2, 5, 8, 0을 μž…λ ₯ν•  λ•ŒλŠ” 두 μ—„μ§€μ†κ°€λ½μ˜ ν˜„μž¬ ν‚€νŒ¨λ“œμ˜ μœ„μΉ˜μ—μ„œ 더 κ°€κΉŒμš΄ 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.4-1. λ§Œμ•½ 두 μ—„μ§€μ†κ°€λ½μ˜ 거리가 κ°™λ‹€λ©΄, 였λ₯Έμ†μž‘μ΄λŠ” 였λ₯Έμ† 엄지손가락, μ™Όμ†μž‘μ΄λŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μˆœμ„œλŒ€λ‘œ λˆ„λ₯Ό λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ numbers, μ™Όμ†μž‘μ΄μΈμ§€ 였λ₯Έμ†μž‘이인 μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ handκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 번호λ₯Ό λˆ„λ₯Έ 엄지손가락이 왼손인 μ§€ 였λ₯Έμ†μΈ μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ—°μ†λœ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.
 

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

  • numbers λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • numbers λ°°μ—΄ μ›μ†Œμ˜ 값은 0 이상 9 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.
  • handλŠ” "left" λ˜λŠ” "right" μž…λ‹ˆλ‹€.
    • "left"λŠ” μ™Όμ†μž‘μ΄, "right"λŠ” 였λ₯Έμ†μž‘이λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • 왼손 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” L, 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” R을 μˆœμ„œλŒ€λ‘œ 이어뢙여 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•΄μ£Όμ„Έμš”.

 

μž…μΆœλ ₯ 예

numbers hand result
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL"
[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR"
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

 

μž…μΆœλ ₯ μ˜ˆμ— λŒ€ν•œ μ„€λͺ…

μž…μΆœλ ₯ 예 #1
μˆœμ„œλŒ€λ‘œ λˆŒλŸ¬μ•Ό ν•  λ²ˆν˜Έκ°€ [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 였λ₯Έμ†μž‘μ΄μž…λ‹ˆλ‹€.

왼손 μœ„μΉ˜ 였λ₯Έμ† μœ„μΉ˜ λˆŒλŸ¬μ•Ό ν•  숫자 μ‚¬μš©ν•œ 손 μ„€λͺ…
* # 1 L 1은 μ™Όμ†μœΌλ‘œ λˆ„λ¦…λ‹ˆλ‹€.
1 # 3 R 3은 였λ₯Έμ†μœΌλ‘œ λˆ„λ¦…λ‹ˆλ‹€.
1 3 4 L 4λŠ” μ™Όμ†μœΌλ‘œ λˆ„λ¦…λ‹ˆλ‹€.
4 3 5 L 왼손 κ±°λ¦¬λŠ” 1, 였λ₯Έμ† κ±°λ¦¬λŠ” 2μ΄λ―€λ‘œ μ™Όμ†μœΌλ‘œ 5λ₯Ό λˆ„λ¦…λ‹ˆλ‹€.
5 3 8 L 왼손 κ±°λ¦¬λŠ” 1, 였λ₯Έμ† κ±°λ¦¬λŠ” 3μ΄λ―€λ‘œ μ™Όμ†μœΌλ‘œ 8을 λˆ„λ¦…λ‹ˆλ‹€.
8 3 2 R 왼손 κ±°λ¦¬λŠ” 2, 였λ₯Έμ† κ±°λ¦¬λŠ” 1μ΄λ―€λ‘œ 였λ₯Έμ†μœΌλ‘œ 2λ₯Ό λˆ„λ¦…λ‹ˆλ‹€.
8 2 1 L 1은 μ™Όμ†μœΌλ‘œ λˆ„λ¦…λ‹ˆλ‹€.
1 2 4 L 4λŠ” μ™Όμ†μœΌλ‘œ λˆ„λ¦…λ‹ˆλ‹€.
4 2 5 R 왼손 거리와 였λ₯Έμ† 거리가 1둜 κ°™μœΌλ―€λ‘œ, 였λ₯Έμ†μœΌλ‘œ 5λ₯Ό λˆ„λ¦…λ‹ˆλ‹€.
4 5 9 R 9λŠ” 였λ₯Έμ†μœΌλ‘œ λˆ„λ¦…λ‹ˆλ‹€.
4 9 5 L 왼손 κ±°λ¦¬λŠ” 1, 였λ₯Έμ† κ±°λ¦¬λŠ” 2μ΄λ―€λ‘œ μ™Όμ†μœΌλ‘œ 5λ₯Ό λˆ„λ¦…λ‹ˆλ‹€.
5 9 - - λ”°λΌμ„œ "LRLLLRLLRRL"λ₯Ό return ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ "LRLLLRLLRRL"λ₯Ό return ν•©λ‹ˆλ‹€.
μž…μΆœλ ₯ 예 #2
μ™Όμ†μž‘μ΄κ°€ [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]λ₯Ό μˆœμ„œλŒ€λ‘œ λˆ„λ₯΄λ©΄ μ‚¬μš©ν•œ 손은 "LRLLRRLLLRR"이 λ©λ‹ˆλ‹€.
μž…μΆœλ ₯ 예 #3
였λ₯Έμ†μž‘이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]λ₯Ό μˆœμ„œλŒ€λ‘œ λˆ„λ₯΄λ©΄ μ‚¬μš©ν•œ 손은 "LLRLLRLLRL"이 λ©λ‹ˆλ‹€.
 
 
 

문제 풀이

λ‚˜μ˜ 풀이

import CoreFoundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    
    // μˆ«μžμ— λ”°λ₯Έ ν‚€νŒ¨λ“œ μœ„μΉ˜
    let keypadLocation = [[1,0],[0,3],[1,3],[2,3],[0,2],[1,2],[2,2],[0,1],[1,1],[2,1]]
    // μ™Όμͺ½ μ†κ°€λ½μ˜ ν˜„μž¬ μœ„μΉ˜
    var currentPositionL = [0,0]
    // 였λ₯Έμͺ½ μ†κ°€λ½μ˜ ν˜„μž¬ μœ„μΉ˜
    var currentPositionR = [2,0]
    
    return numbers.map{ number -> String in
            if [1,4,7].contains(number) {
                currentPositionL = keypadLocation[number]
                return "L"
            }else if [3,6,9].contains(number){
                currentPositionR = keypadLocation[number]
                return "R"
            }else {
                let intervalL = (0...1).map{ abs(currentPositionL[$0] - keypadLocation[number][$0]) }.reduce(0,+)
                let intervalR = (0...1).map{ abs(currentPositionR[$0] - keypadLocation[number][$0]) }.reduce(0,+)
                
                if intervalL > intervalR || ( intervalL == intervalR && hand == "right" ) {
                    currentPositionR = keypadLocation[number]
                    return "R"
                }else {
                    currentPositionL = keypadLocation[number]
                    return "L"
                }
            }
                     }.joined()
}

 
이번 λ¬Έμ œλŠ” 정말 λ‚΄κ°€ 생각해도 잘 ν’€μ—ˆλ‹€κ³  μƒκ°ν•œλ‹€.
 
λ‚΄κ°€ 이 λ¬Έμ œμ— μ–΄λ–€μ‹μœΌλ‘œ μ ‘κ·Όν–ˆλŠμ§€ μƒκ°ν•΄λ³΄μž. μ²˜μŒμ—” var move = [[1,0],[-1,0],[0,1],[0,-1]] μƒν•˜μ’Œμš°λ₯Ό μ΄λ™ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ ν‚€νŒ¨λ“œμœ„μ˜ 왼손과 였λ₯Έμ†μ„ 직접 움직여 거리λ₯Ό 재렀고 ν–ˆλ‹€. 그럼 λͺ©μ μ§€λ‘œ κ°€κ³ μž ν•˜λŠ” ν‚€νŒ¨λ“œμ˜ μ’Œν‘œλ₯Ό μ•Œμ•„μ•Όν–ˆλ‹€. "*"을 ( 0,0 ) μ΄λΌλŠ” μ’Œν‘œν‰λ©΄μœΌλ‘œ 두고 숫자 λŒ€μ‹ μ— μ’Œν‘œκ°’μ„ λ„£μžλΌκ³  생각이 λ“€μ—ˆκ³ , 마침 μˆ«μžλ„ 0λΆ€ν„° 9κΉŒμ§€λ‘œ μžˆμ–΄μ„œ ν•΄λ‹Ή ν‚€νŒ¨λ“œ λ²ˆν˜Έμ— λ§žλ„λ‘ λ°°μ—΄ μˆœμ„œλŒ€λ‘œ λŒ€μž…ν•˜λ©΄, ν‚€νŒ¨λ“œ λ²ˆν˜Έμ™€ λ°°μ—΄μ˜ 인덱슀 값이 μΌμΉ˜ν•˜κΈ° λ•Œλ¬Έμ— 값을 κΊΌλ‚΄μ˜€κΈ°κ°€ μˆ˜μ›”ν–ˆλ‹€. 
 
" 1, 4, 7"κ³Ό " 3, 6, 9"에 ν•΄λ‹Ήν•˜λŠ” μˆ«μžκ°€ λ‚˜μ˜€λ©΄ Lλ‚˜ R 에 ν•΄λ‹Ή 숫자의 μ’Œν‘œκ°’μ„ λŒ€μž…ν•΄μ£Όκ³ , κ·Έ μ΄μ™Έμ˜ μˆ«μžκ°€ λ‚˜μ˜€λ©΄ ν˜„μž¬μ˜ μœ„μΉ˜μ™€ λͺ©ν‘œν•˜λŠ” ν‚€νŒ¨λ“œμ˜ 숫자의 μ’Œν‘œκ°’μ„ λΉ„κ΅ν•˜μ—¬ 더 μž‘μ€ 값이 λ‚˜μ˜€λŠ” 손가락이 μ΄λ™ν•˜λ©΄ λ˜μ—ˆλ‹€. 

ν‚€νŒ¨λ“œμ˜ 숫자의 μ’Œν‘œμ™€ ν˜„μž¬ μœ„μΉ˜μ˜ μ’Œν‘œμ˜ 값을 λΉ„κ΅ν•˜λŠ” κ³Όμ •μ—μ„œ ꡳ이 moveλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ°°μ—΄μ˜ 수끼리 값을 λΉΌμ£Όμ–΄ μ ˆλŒ“κ°’μ„ μ”Œμš°λ©΄ κ°„λ‹¨ν•˜κ²Œ ꡬ할 수 μžˆμ„ 거라고 생각이 λ“€μ—ˆλ‹€. μΆ”κ°€λ‘œ reduce ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ κ°„νŽΈν•˜κ²Œ 숫자λ₯Ό κ³„μ‚°ν•˜κ³  μ‹Άμ–΄μ„œ map으둜 κ΅¬ν˜„ν•˜μ˜€λ‹€.

전체적인 ν‚€νŒ¨λ“œμ˜ 흐름을 map으둜 λŒ€μž…ν•˜μ—¬ “R” λ˜λŠ” “L”만 좜λ ₯ν•œλ‹€λ©΄ String 배열을 joined ν•΄μ„œ λ°”λ‘œ 닡을 ꡬ할 수 μžˆμ„ 거라고 ν™•μ‹ ν–ˆλŠ”λ°, μ²˜μŒμ— map μ•ˆμ— if 문이 λ“€μ–΄κ°€μ§€ μ•Šμ•˜λ‹€. κ·Έλž˜μ„œ 인터넷을 μ°Ύμ•„λ³΄λ‹ˆ map μ•ˆμ˜ if 문을 μ“°κΈ° μœ„ν•΄μ„œλŠ” ν΄λ‘œμ € ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 좜λ ₯값을 μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν–ˆλ‹€.

κ·Έλ ‡κ²Œ 문제λ₯Ό ν’€μ—ˆλŠ”λ° 예제 3문제 쀑 2문제λ₯Ό ν‹€λ Έλ‹€. λ‘œμ§μ—μ„œλŠ” ν‹€λ¦° 뢀뢄이 μ—†λ‹€λŠ” 확신을 ν•˜κ³  문제의 흐름을 따라가며 였λ₯˜λ₯Ό νŒŒμ•…ν–ˆλ‹€. λ¬Έμ œλŠ” λ‚΄κ°€ 숫자 ν‚€νŒ¨λ“œμ˜ μ’Œν‘œλ₯Ό 잘λͺ» μž…λ ₯ν•œ 것 9와 0의 μ’Œν‘œκ°’μ„ λ°˜λŒ€λ‘œ λŒ€μž…ν–ˆμ—ˆλ‹€. κ·Έλž˜μ„œ λ‹€μ‹œ ν‘Ό κ²°κ³Ό μ •λ‹΅!

 

 

μ€‘μš”ν•œ κ°œλ…

- μ ˆλŒ“κ°’ : abs()
- κ³ μ°¨ν•¨μˆ˜μ˜ if문을 λ„£κΈ° μœ„ν•΄μ„  좜λ ₯κ°’ 지정이 ν•„μˆ˜!