[TIL_Carrotww] 56 - 22/11/21

μœ ν˜•μ„Β·2022λ…„ 11μ›” 22일
0

TIL

λͺ©λ‘ 보기
66/138
post-thumbnail

πŸ“Carrotww의 μ½”λ”© 기둝μž₯

🧲 python algorithm

πŸ” programmers 숫자 νƒ€μž λŒ€νšŒ level3
이 λ¬Έμ œλ„ ν‘Ό μ‚¬λžŒμ΄ 100λͺ… 미만인 λ”°λˆ λ”°κ·Όν•œ λ¬Έμ œμ΄λ‹€
μ²˜μŒμ— μ–΄λ–»κ²Œ 접근해야할지 감이 μ•ˆμž‘ν˜”μ§€λ§Œ 일단! ν’€μ–΄λ³Έ λ¬Έμ œμ΄λ‹€.

  • 첫 풀이
import sys
sys.setrecursionlimit(10**9)

def solution(numbers):
    left, right = 4, 6
    depth = [
        	[1, 7, 6, 7, 5, 4, 5, 3, 2, 3], # 0
        	[7, 1, 2, 4, 2, 3, 5, 4, 5, 6], # 1
            [6, 2, 1, 2, 3, 2, 3, 5, 4, 5], # 2
    		[7, 4, 2, 1, 5, 3, 2, 6, 5, 4], # 3
    		[5, 2, 3, 5, 1, 2, 4, 2, 3, 5], # 4
    		[4, 3, 2, 3, 2, 1, 2, 3, 2, 3], # 5
    		[5, 5, 3, 2, 4, 2, 1, 5, 3, 2], # 6
    		[3, 4, 5, 6, 2, 3, 5, 1, 2, 4], # 7
    		[2, 5, 4, 5, 3, 2, 3, 2, 1, 2], # 8
    		[3, 6, 5, 4, 5, 3, 2, 4, 2, 1]] # 9
    result = []

    def dfs(number_po, total_val, left, right):
        # number_po 의 μœ„μΉ˜κ°€ numbers 의 λκΉŒμ§€ κ°”μœΌλ©΄ μ’…λ£Œ
        if number_po > len(numbers) - 1:
            result.append(total_val)
            return
        change_num = int(numbers[number_po])
        # λ°”κΆˆμ•Όν•  번호
        left_val = depth[left][change_num]
        right_val = depth[right][change_num]
        # μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μ˜ λ‹€μŒ κ°€μ€‘μΉ˜
        if left_val < right_val:
            total_val += left_val
            dfs(number_po + 1, total_val, change_num, right)
        elif right_val < left_val:
            total_val += right_val
            dfs(number_po + 1, total_val, left, change_num)
        elif left_val == right_val:
            total_val += left_val
            dfs(number_po + 1, total_val, change_num, right)
            dfs(number_po + 1, total_val, left, change_num)


쀑간에 μ‹€νŒ¨κ°€ 뜨고 λ§ˆμ§€λ§‰ 5κ°œκ°€ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚œλ‹€.
μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚¬λ‹€λŠ” 것은... μ–΄μ§€κ°„ν•˜λ©΄ μ ‘κ·Ό 방식이 이게 μ•„λ‹ˆλΌλŠ”κ±΄λ°... 일단 문제λ₯Ό λ‹€μ‹œ 읽고 ν’€μ–΄λ³΄μ•˜λ‹€.
κ·Έ λ•Œ 손 μœ„μ— μžˆλŠ” λ²ˆν˜ΈλŠ” 무쑰건 λˆŒλŸ¬μ•Ό ν•œλ‹€ ν•΄μ„œ κ·Έ λŒ€λ‘œ μ½”λ“œμ— λ„£μ–΄λ΄€λ‹€.
첫 번째 μ½”λ“œλ„ 자기 손 μœ„μ— μžˆλŠ” 번호λ₯Ό λˆ„λ₯Όν…λ° λΌλŠ” μ˜λ¬Έμ„ 가지며...

  • 두 번째 풀이
import sys
sys.setrecursionlimit(10**9)

def solution(numbers):
    left, right = 4, 6
    depth = [
        	[1, 7, 6, 7, 5, 4, 5, 3, 2, 3], # 0
        	[7, 1, 2, 4, 2, 3, 5, 4, 5, 6], # 1
            [6, 2, 1, 2, 3, 2, 3, 5, 4, 5], # 2
    		[7, 4, 2, 1, 5, 3, 2, 6, 5, 4], # 3
    		[5, 2, 3, 5, 1, 2, 4, 2, 3, 5], # 4
    		[4, 3, 2, 3, 2, 1, 2, 3, 2, 3], # 5
    		[5, 5, 3, 2, 4, 2, 1, 5, 3, 2], # 6
    		[3, 4, 5, 6, 2, 3, 5, 1, 2, 4], # 7
    		[2, 5, 4, 5, 3, 2, 3, 2, 1, 2], # 8
    		[3, 6, 5, 4, 5, 3, 2, 4, 2, 1]] # 9
    result = []

    def dfs(number_po, total_val, left, right):
        # number_po 의 μœ„μΉ˜κ°€ numbers 의 λκΉŒμ§€ κ°”μœΌλ©΄ μ’…λ£Œ
        if number_po > len(numbers) - 1:
            result.append(total_val)
            return

        change_num = int(numbers[number_po])
        # 움직여야할 λ‹€μŒ 번호
        left_val = depth[left][change_num]
        right_val = depth[right][change_num]

        # μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μ˜ λ‹€μŒ κ°€μ€‘μΉ˜
        if left_val == 1:
            dfs(number_po + 1, total_val + left_val, change_num, right)
        elif right_val == 1:
            dfs(number_po + 1, total_val + right_val, left, change_num)
        # κ°€μ€‘μΉ˜κ°€ 1μΌλ•ŒλŠ” ν•΄λ‹Ή 번호 μœ„μ— 손가락이 μžˆλ‹€λŠ” κ²ƒμ΄λ‹ˆκΉŒ κ·ΈλŒ€λ‘œ λˆŒλŸ¬μ•Όν•¨
        else:
            dfs(number_po + 1, total_val + left_val, change_num, right)
            dfs(number_po + 1, total_val + right_val, left, change_num)
       	return

    # dfs -> λ§€κ°œλ³€μˆ˜ : ν˜„μž¬ numbers의 μœ„μΉ˜, μ§€κΈˆκΉŒμ§€μ˜ κ°€μ€‘μΉ˜, left, right 손가락 μœ„μΉ˜!

μ—­μ‹œ λ¬Έμ œμ— 닡이 μžˆμ—ˆλ‹€.
ν•˜μ§€λ§Œ μ‹œκ°„ μ΄ˆκ³ΌλŠ” μ—­μ‹œ... dfs 둜 ν’€κΈ°λŠ” ν–ˆμ§€λ§Œ λ‹€λ₯Έ ν’€μ΄λ‘œλŠ” 왼손 였λ₯Έμͺ½μ„ λ‚˜λˆ„μ–΄μ„œ dp둜 κΈ°λ‘ν•˜λ©° λ‚˜μ•„κ°€λ©΄ μ‹œκ°„μ„ 쀄일 수 μžˆμ„ 것 κ°™λ‹€.
내일 λ‹€μ‹œ 풀어봐야겠닀.
였늘 끝!

profile
Carrot_hyeong

0개의 λŒ“κΈ€