Algorithm

โ˜… [์นด์นด์˜ค๊ธฐ์ถœ][Python] ํ‚คํŒจ๋“œ ๋ˆ„๋ฅด๊ธฐ

jihuSunbae 2024. 8. 1. 17:29

 

 

๋ชฉ์ฐจ

     

     

    ๐Ÿซก Overview

    ์ฒด๊ฐ ๋‚œ์ด๋„: โ˜…โ˜†โ˜†โ˜†โ˜†

    ์†Œ์š”์‹œ๊ฐ„: 30๋ถ„

    ๋ฌธ์ œ ๋ ˆ๋ฒจ: Lv1. / ๋ฌธ์ œ ์œ ํ˜•: ๋‹จ์ˆœ ๊ตฌํ˜„ 
    ํ’€์ด ์ƒํƒœ:  ์Šค์Šค๋กœ ํ•ด๊ฒฐ
    ์ถ”ํ›„: ๊ฐ„๋‹จ๋ณต์Šต

     


    ๋ฌธ์ œ ๋งํฌ 

    https://school.programmers.co.kr/learn/courses/30/lessons/67256

    ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„


    <๋ฌธ์ œ ์ดํ•ด>
    ์™ผ์ชฝ๊ณผ ๊ฐ™์ด 3*4 ๋ฒˆํ˜ธํŒ์ด ์ฃผ์–ด์ง„๋‹ค. 

     

    ๋ฌธ์ œ: ๋ˆ„๋ฅผ ์ˆซ์ž ๋ฐฐ์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ 
    ์–ด๋–ค ์†๊ฐ€๋ฝ์ด ๋ˆŒ๋ €๋Š”์ง€ ๋ฐฐ์—ด์„ ๋ฆฌํ„ด(์˜ค๋ฅธ์† R, ์™ผ์† L)

    ์†๊ฐ€๋ฝ ๋ˆ„๋ฅด๋Š” ๋ฐฉ๋ฒ•
    - ์‹œ์ž‘์ : ์™ผ์†(*), ์˜ค๋ฅธ์†(#)
    - ์™ผ์†(1,4,7), ์˜ค๋ฅธ์†(3,6,9)
    - ๊ฐ€์šด๋ฐ 2,5,8,0์€ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ์†๊ฐ€๋ฝ์ด ๋ˆ„๋ฅธ๋‹ค. 
       - ๋งŒ์•ฝ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ, ์™ผ์†์žก์ด/์˜ค๋ฅธ์†์žก์ด์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง 

    ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, ์ด๋•Œ ๊ฑฐ๋ฆฌ๋Š” ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ์ด๋‹ค!

     

     

     

     

     

    ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„ 

    ์ž…๋ ฅ numbers 1<=len(numbers)<=1000

    ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋งค๋ฒˆ 2,5,8,0์„ ๋ˆŒ๋Ÿฌ์•ผํ•ด์„œ ๋งค๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผํ•˜๋Š” ๋ฒˆํ˜ธ์˜ ์œ„์น˜์™€ ์™ผ์†/์˜ค๋ฅธ์†์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. 

    -> ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ O(2)*1000๋ฒˆ ์ด๋ฏ€๋กœ ์‹œ๊ฐ„ ๋‚ด์— ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. 

     

     

     

    ๋‚˜์˜ ์ฝ”๋“œ

    • ์ž๋ฃŒํ˜•: dict
      • key: ๋ฒˆํ˜ธํŒ ๋‚ด ์ˆซ์ž, value๋Š” ์œ„์น˜๋กœ ์„ค์ •ํ•˜์—ฌ, ๋ฒˆํ˜ธํŒ ์ˆซ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ์ขŒํ‘œ ์œ„์น˜๊ฐ€ ๋‚˜์˜ค๋„๋ก ํ•จ. 
    • ๊ทธ๋ฆฌ๊ณ  ๋ฌด์ง€์„ฑ ๋‹จ์ˆœ ๊ตฌํ˜„์„ ํ–ˆ๋‹ค. 
    # key: ๋ฒˆํ˜ธํŒ ๋‚ด ์ˆซ์ž, value๋Š” ์œ„์น˜ 
    coordinate = {'1':[0,0], '2':[0,1], '3':[0,2],
                      '4':[1,0], '5':[1,1], '6':[1,2],
                      '7':[2,0], '8':[2,1], '9':[2,2],
                      '*':[3,0], '0':[3,1], '#':[3,2],
                     } 
    
    def distance(current_str, num): # current: str, num : int 
        cx, cy = coordinate[current_str]
        nx, ny = coordinate[str(num)]
        
        return abs(cx-nx) + abs(cy-ny)
        
    
    def solution(numbers, hand):
        ans = ''
        
        left, right = '*', "#"
        for num in numbers:
            if num in (1,4,7): # left 
                left = str(num)
                ans += 'L'
            
            elif num in (3,6,9): # right
                right = str(num)
                ans += 'R'
            else: # 2,5,8,0 ์ผ ๋•Œ 
                l_dist = distance(left, num)
                r_dist = distance(right, num)
                if l_dist < r_dist: 
                    left = str(num)
                    ans += 'L'
                elif l_dist > r_dist: 
                    right = str(num)
                    ans += 'R'
                else: # ๋‘˜์ด ๋˜‘๊ฐ™์„ ๋•Œ 
                    if hand == 'left': 
                        left = str(num)
                        ans += 'L'
                    else:
                        right = str(num)
                        ans += 'R' 
        return ans

     

     

    ์ฐธ๊ณ  ์ฝ”๋“œ

    - ๊ฐ ์ˆซ์ž ์ขŒํ‘œ ๊ตฌํ•  ๋•Œ dict์„ ์“ฐ์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•˜์ž 

     

    3x4์˜ ํ–‰๋ ฌ์ด๊ณ , ํ–‰๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค. 

    <ํ–‰>

    1,2,3 => 0ํ–‰

    4,5,6 => 1ํ–‰ 

    7,8,9 => 2ํ–‰ 

    10,11,12 => 3ํ–‰ 

    => ํ–‰ ์ธ๋ฑ์Šค: (N-1)//3

     

    <์—ด>

    1,4,7,10 => 0์—ด 

    2,5,8,11 => 1์—ด 

    3,6,9,12 => 2์—ด 

    => ์—ด ์ธ๋ฑ์Šค (N-1)%3

    def distance(current, num):  # current: str, num : int
        cx, cy = (current - 1) // 3, (current - 1) % 3
        nx, ny = (num - 1) // 3, (num - 1) % 3
    
        return abs(cx - nx) + abs(cy - ny)
    
    
    def solution(numbers, hand):
        ans = ''
        left, right = 10, 12
        for num in numbers:
            if num in (1, 4, 7):  # left
                left = num
                ans += 'L'
    
            elif num in (3, 6, 9):  # right
                right = num
                ans += 'R'
            else:  # 2,5,8,0 ์ผ ๋•Œ
                if num == 0:
                    num = 11
                l_dist = distance(left, num)
                r_dist = distance(right, num)
                if l_dist < r_dist:
                    left = num
                    ans += 'L'
                elif l_dist > r_dist:
                    right = num
                    ans += 'R'
                else:  # ๋‘˜์ด ๋˜‘๊ฐ™์„ ๋•Œ
                    if hand == 'left':
                        left = num
                        ans += 'L'
                    else:
                        right = num
                        ans += 'R'
        return ans

     

     

     

     

     

     

     


    ๋ฐฐ์šด ์ /๋А๋‚€ ์ 

    ๊ธฐ์ดˆ ๊ตฌํ˜„๋ ฅ์„ ํƒ„ํƒ„ํžˆ ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค!!!