🌞Algorithm/πŸ”₯programmers

[programmers] [카카였 인턴] ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ° - 2020 카카였 인턴십

λΏŒμ•Ό._. 2021. 1. 3. 21:52

μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 2020 카카였 인턴십


<[카카였 인턴] ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°>

 

문제 μ„€λͺ…

 

슀마트폰 μ „ν™” ν‚€νŒ¨λ“œμ˜ 각 칸에 λ‹€μŒκ³Ό 같이 μˆ«μžλ“€μ΄ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€.

 

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

 

  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 ν•΄μ£Όμ„Έμš”.

 

문제 풀이

   - my solution

def solution(numbers, hand):
    answer = ''
    # 12 = ν‚€νŒ¨λ“œ *을 의미, 10 = ν‚€νŒ¨λ“œ #을 의미
    tempR = 12 #였λ₯Έμ† μœ„μΉ˜ μ €μž₯
    tempL = 10 #왼손 μœ„μΉ˜ μ €μž₯

    for i in range(len(numbers)):
        if (numbers[i] == 0): #ν‚€νŒ¨λ“œ 0 -> 계산을 μœ„ν•΄ 11둜 λ³€κ²½
            numbers[i] = 11
        if (numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7): #1,4,7인 경우 왼손
            answer += "L"
            tempL = numbers[i]
        elif (numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9): #3,6,9인 경우 였λ₯Έμ†
            answer += "R"
            tempR = numbers[i]
        else: #2,5,8,7인 경우 
            #거리 ꡬ함
            temp1 = abs(numbers[i] - tempL) 
            temp2 = abs(numbers[i] - tempR)
            dstL = 0
            dstR = 0
            #거리 λ³„λ‘œ 숫자 λΆ€μ—¬
            if (temp1 == 1 or temp1 == 3):
                dstL = 1
            elif (temp1 == 2 or temp1 == 4 or temp1 == 6):
                dstL = 2
            elif (temp1 == 5 or temp1 == 7 or temp1 == 9):
                dstL = 3
            elif (temp1 == 8 or temp1 == 10):
                dstL = 4

            if (temp2 == 1 or temp2 == 3):
                dstR = 1
            elif (temp2 == 2 or temp2 == 4 or temp2 == 6):
                dstR = 2
            elif (temp2 == 5 or temp2 == 7 or temp2 == 9):
                dstR = 3
            elif (temp2 == 8 or temp2 == 10):
                dstR = 4
            
            if (dstL < dstR): #왼손이 더 κ°€κΉŒμš΄ 경우
                answer += "L"
                tempL = numbers[i]
            elif (dstL == dstR): #거리 같은 경우 hand따라
                if (hand == "right"):
                    answer += "R"
                    tempR = numbers[i]
                else:
                    answer += "L"
                    tempL = numbers[i]
            else: #였λ₯Έμ†μ΄ 더 κ°€κΉŒμš΄ 경우
                answer += "R"
                tempR = numbers[i]

    return answer

  κ³„μ‚°μ˜ 편리λ₯Ό μœ„ν•˜μ—¬ * = 10, 0 = 11, # = 12둜 λ°”κΎΈμ–΄ 문제λ₯Ό ν•΄κ²°

 

    1) 1,4,7인 경우 왼손, 3,6,9인 경우 였λ₯Έμ†μ„ answer에 μ €μž₯

    2) κ·Έ μ™Έμ˜ 경우 -> 거리 κ΅¬ν•˜κΈ°

        2-1) μ°¨λ₯Ό μ΄μš©ν•˜μ—¬ 거리λ₯Ό ꡬ해 각 κ±°λ¦¬λ³„λ‘œ 숫자 λΆ€μ—¬

               - μ°¨κ°€ 1,3인 경우: 1

               - μ°¨κ°€ 2,4,6인 경우: 2

               - μ°¨κ°€ 5,7,9인 경우: 3

               - μ°¨κ°€ 8,10인 경우: 4

        2-2) 2-1)μ—μ„œ κ΅¬ν•œ 숫자λ₯Ό μ΄μš©ν•˜μ—¬ 더 κ°€κΉŒμš΄ 손은 answer에 μ €μž₯

               - 왼손이 더 κ°€κΉŒμš΄ 경우: L

               - 였λ₯Έμ†μ΄ 더 κ°€κΉŒμš΄ 경우: R

               - 거리가 같은 경우: hand 따라


κ³ λ €ν•΄μ•Ό ν•  것이 λ§Žμ€ λ¬Έμ œμ˜€κΈ°μ— λ‹€λ₯Έ λ¬Έμ œλ“€λ³΄λ‹€ ν•΄κ²°ν•˜λŠ”λ° μ‹œκ°„μ΄ 쑰금 더 κ±Έλ Έλ‹€.    

 

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅, https://programmers.co.kr/learn/challenges