λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개발/π™‹π™§π™€π™œπ™§π™–π™’π™’π™šπ™§π™¨

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ '곡원 μ‚°μ±…' 파이썬 풀이

by beomcoder 2023. 4. 26.
728x90
λ°˜μ‘ν˜•
https://school.programmers.co.kr/learn/courses/30/lessons/172928
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

"""
μ§€λ‚˜λ‹€λ‹ˆλŠ” 길을 'O', μž₯애물을 'X'둜 λ‚˜νƒ€λ‚Έ μ§μ‚¬κ°ν˜• 격자 λͺ¨μ–‘μ˜ κ³΅μ›μ—μ„œ 
λ‘œλ΄‡ κ°•μ•„μ§€κ°€ 산책을 ν•˜λ €ν•©λ‹ˆλ‹€. 산책은 λ‘œλ΄‡ 강아지에 미리 μž…λ ₯된 λͺ…령에
따라 μ§„ν–‰ν•˜λ©°, λͺ…령은 λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

["λ°©ν–₯ 거리", "λ°©ν–₯ 거리" … ]
예λ₯Ό λ“€μ–΄ "E 5"λŠ” λ‘œλ΄‡ κ°•μ•„μ§€κ°€ ν˜„μž¬ μœ„μΉ˜μ—μ„œ 동μͺ½μœΌλ‘œ 
5μΉΈ μ΄λ™ν–ˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. λ‘œλ΄‡ κ°•μ•„μ§€λŠ” λͺ…령을 μˆ˜ν–‰ν•˜κΈ° 전에
λ‹€μŒ 두 κ°€μ§€λ₯Ό λ¨Όμ € ν™•μΈν•©λ‹ˆλ‹€.

μ£Όμ–΄μ§„ λ°©ν–₯으둜 이동할 λ•Œ 곡원을 λ²—μ–΄λ‚˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
μ£Όμ–΄μ§„ λ°©ν–₯으둜 이동 쀑 μž₯애물을 λ§Œλ‚˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
μœ„ 두 가지쀑 μ–΄λŠ ν•˜λ‚˜λΌλ„ ν•΄λ‹Ήλœλ‹€λ©΄, λ‘œλ΄‡ κ°•μ•„μ§€λŠ” 
ν•΄λ‹Ή λͺ…령을 λ¬΄μ‹œν•˜κ³  λ‹€μŒ λͺ…령을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
κ³΅μ›μ˜ κ°€λ‘œ 길이가 W, μ„Έλ‘œ 길이가 H라고 ν•  λ•Œ, 
κ³΅μ›μ˜ 쒌츑 μƒλ‹¨μ˜ μ’Œν‘œλŠ” (0, 0), 우츑 ν•˜λ‹¨μ˜ μ’Œν‘œλŠ” (H - 1, W - 1) μž…λ‹ˆλ‹€.
"""

def solution(park, routes):
    dog, width, height, block = {'y': 0, 'x': 0}, len(park[0]), len(park), []
            
    for y in range(len(park)):
        for x in range(len(park[0])):
            if park[y][x] == 'X': block.append([y, x])
            elif park[y][x] == 'S': dog = {'y': y, 'x': x}
            
    for route in routes:
        op, n = route.split()
        n = int(n)
        move = {'E': {'y': 0, 'x': n}, 'S': {'y': n, 'x': 0},'W': {'y': 0, 'x': -n}, 'N': {'y': -n, 'x': 0}}
        
        if 0 <= (dog['y'] + move[op]['y']) < height and 0 <= (dog['x'] + move[op]['x']) < width:
            check_block = True
            
            for y, x in block:
                if min(dog['y'], dog['y'] + move[op]['y']) <= y <= max(dog['y'], dog['y'] + move[op]['y']):
                    if min(dog['x'], dog['x'] + move[op]['x']) <= x <= max(dog['x'], dog['x'] + move[op]['x']):
                        check_block = False
                        break
                        
            if check_block:
                dog['y'] += move[op]['y']
                dog['x'] += move[op]['x']
        
    return [dog['y'],dog['x']]
 
 """
 μ½”λ“œ 리뷰
 def solution(park, routes):
    dog, width, height, block = {'y': 0, 'x': 0}, len(park[0]), len(park), []
    # 개의 μ’Œν‘œλ₯Ό 담을 λ”•μ…”λ„ˆλ¦¬ dog, κ³΅μ›μ˜ κ°€λ‘œ, μ„Έλ‘œ, block의 μœ„μΉ˜λ₯Ό 담을 리슀트λ₯Ό μ„ μ–Έ
    
    for y in range(len(park)): # 곡원을 이쀑for문으둜 λŒλ©΄μ„œ
        for x in range(len(park[0])):
            if park[y][x] == 'X': block.append([y, x]) 
            # μž₯애물이 μžˆλ‹€λ©΄ blockλ¦¬μŠ€νŠΈμ— μΆ”κ°€
            
            elif park[y][x] == 'S': dog = {'y': y, 'x': x} 
            # 개의 ν˜„μž¬μœ„μΉ˜λ₯Ό μ°Ύμ•˜λ‹€λ©΄ dog의 μ’Œν‘œλ₯Ό λ³€κ²½
            
    for route in routes: λ£¨νŠΈλ“€μ„ λŒλ©΄μ„œ
        op, n = route.split() # λ™μ„œλ‚¨λΆ μœ„μΉ˜λ₯Ό 담을 op, μ–Όλ§ˆλ‚˜ 이동할지 n
        n = int(n)
        move = {'E': {'y': 0, 'x': n}, 'S': {'y': n, 'x': 0},'W': {'y': 0, 'x': -n}, 'N': {'y': -n, 'x': 0}}
        # μ’Œν‘œλ₯Ό μ €μž₯함.
        
        if 0 <= (dog['y'] + move[op]['y']) < height and 0 <= (dog['x'] + move[op]['x']) < width:
        # 개의 ν˜„μž¬ μœ„μΉ˜μ—μ„œ μ΄λ™ν–ˆμ„λ•Œ κ³΅μ›μ˜ μ’Œν‘œλ₯Ό λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”μ§€ 검사함.
        
            check_block = True
            # 이동할 κ²½λ‘œμ— 블둝이 μžˆλŠ”μ§€ κ²€μ‚¬ν•˜κΈ° μœ„ν•œ λ³€μˆ˜
            
            for y, x in block: # μ²˜μŒμ— μž₯μ• λ¬Όλ“€μ˜ μ’Œν‘œλ₯Ό 담은 λ¦¬μŠ€νŠΈλ“€μ„ λŒλ©΄μ„œ
            
            	# min max ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ μ΄μœ λŠ” λ§ˆμ΄λ„ˆμŠ€ μ’Œν‘œλ‘œ μ΄λ™ν• μˆ˜ 있고,
                # ν”ŒλŸ¬μŠ€ μ’Œν‘œλ‘œ μ΄λ™ν• μˆ˜μžˆκΈ° λ•Œλ¬Έμ— min, max문으둜 λ‹€μ–‘ν•œ 경우λ₯Ό ν•˜λ‚˜λ‘œ ν•©μ³€μŒ.
                if min(dog['y'], dog['y'] + move[op]['y']) <= y <= max(dog['y'], dog['y'] + move[op]['y']):
                    if min(dog['x'], dog['x'] + move[op]['x']) <= x <= max(dog['x'], dog['x'] + move[op]['x']):
                        # ν˜„μž¬ 개의 μœ„μΉ˜μ™€ 이동할 μœ„μΉ˜ 사이에 μž₯애물이 μžˆλ‹€λ©΄
                        # μ΄λ™ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ check_block λ³€μˆ˜λ₯Ό false둜 λ³€κ²½ν•˜κ³  μ’…λ£Œ
                        check_block = False
                        break
                        
            if check_block: # 이동할 κ²½λ‘œμ— μž₯애물이 μ—†λ‹€λ©΄ 개의 μœ„μΉ˜λ₯Ό μ΄λ™μ‹œν‚΄
                dog['y'] += move[op]['y']
                dog['x'] += move[op]['x']
        
    return [dog['y'],dog['x']]
 """
728x90
λ°˜μ‘ν˜•

λŒ“κΈ€