๐Ÿ–ฅ๏ธ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/Python

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] [Python] ๊ณต์› ์‚ฐ์ฑ…

rtw0202 2026. 3. 9. 12:18

1. ๋ฌธ์ œ ์„ค๋ช…

์ง€๋‚˜๋‹ค๋‹ˆ๋Š” ๊ธธ์„ 'O', ์žฅ์• ๋ฌผ์„ 'X'๋กœ ๋‚˜ํƒ€๋‚ธ ์ง์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ๋ชจ์–‘์˜ ๊ณต์›์—์„œ ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ์‚ฐ์ฑ…์„ ํ•˜๋ คํ•ฉ๋‹ˆ๋‹ค. ์‚ฐ์ฑ…์€ ๋กœ๋ด‡ ๊ฐ•์•„์ง€์— ๋ฏธ๋ฆฌ ์ž…๋ ฅ๋œ ๋ช…๋ น์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

  • ["๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ", "๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ" … ]

์˜ˆ๋ฅผ ๋“ค์–ด "E 5"๋Š” ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋™์ชฝ์œผ๋กœ 5์นธ ์ด๋™ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋กœ๋ด‡ ๊ฐ•์•„์ง€๋Š” ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๋•Œ ๊ณต์›์„ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ์ค‘ ์žฅ์• ๋ฌผ์„ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์œ„ ๋‘ ๊ฐ€์ง€์ค‘ ์–ด๋А ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น๋œ๋‹ค๋ฉด, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๋Š” ํ•ด๋‹น ๋ช…๋ น์„ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์›์˜ ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ W, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ H๋ผ๊ณ  ํ•  ๋•Œ, ๊ณต์›์˜ ์ขŒ์ธก ์ƒ๋‹จ์˜ ์ขŒํ‘œ๋Š” (0, 0), ์šฐ์ธก ํ•˜๋‹จ์˜ ์ขŒํ‘œ๋Š” (H - 1, W - 1) ์ž…๋‹ˆ๋‹ค.

๊ณต์›์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด park, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด routes๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ๋ชจ๋“  ๋ช…๋ น์„ ์ˆ˜ํ–‰ ํ›„ ๋†“์ธ ์œ„์น˜๋ฅผ [์„ธ๋กœ ๋ฐฉํ–ฅ ์ขŒํ‘œ, ๊ฐ€๋กœ ๋ฐฉํ–ฅ ์ขŒํ‘œ] ์ˆœ์œผ๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • 3 ≤ park์˜ ๊ธธ์ด ≤ 50
    • 3 ≤ park[i]์˜ ๊ธธ์ด ≤ 50
      • park[i]๋Š” ๋‹ค์Œ ๋ฌธ์ž๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ์‹œ์ž‘์ง€์ ์€ ํ•˜๋‚˜๋งŒ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
        • S : ์‹œ์ž‘ ์ง€์ 
        • O : ์ด๋™ ๊ฐ€๋Šฅํ•œ ํ†ต๋กœ
        • X : ์žฅ์• ๋ฌผ
    • park๋Š” ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ž…๋‹ˆ๋‹ค.
  • 1 ≤ routes์˜ ๊ธธ์ด ≤ 50
    • routes์˜ ๊ฐ ์›์†Œ๋Š” ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ๋กœ๋ด‡ ๊ฐ•์•„์ง€๋Š” routes์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • routes์˜ ์›์†Œ๋Š” "op n"๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, op๋Š” ์ด๋™ํ•  ๋ฐฉํ–ฅ, n์€ ์ด๋™ํ•  ์นธ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
      • op๋Š” ๋‹ค์Œ ๋„ค ๊ฐ€์ง€์ค‘ ํ•˜๋‚˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
        • N : ๋ถ์ชฝ์œผ๋กœ ์ฃผ์–ด์ง„ ์นธ๋งŒํผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
        • S : ๋‚จ์ชฝ์œผ๋กœ ์ฃผ์–ด์ง„ ์นธ๋งŒํผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
        • W : ์„œ์ชฝ์œผ๋กœ ์ฃผ์–ด์ง„ ์นธ๋งŒํผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
        • E : ๋™์ชฝ์œผ๋กœ ์ฃผ์–ด์ง„ ์นธ๋งŒํผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
      • 1 ≤ n ≤ 9

 

2. ์ถœ๋ ฅ ์˜ˆ์‹œ

 

3. ๋ฌธ์ œ ๋‹ต์•ˆ

def solution(park, routes):
    answer = []
    start = [] # ์‹œ์ž‘ ์ขŒํ‘œ
    block = set() # ์žฅ์• ๋ฌผ ์ขŒํ‘œ
    
    park_w = len(park[0]) # ๊ณต์› ๊ฐ€๋กœ ๊ธธ์ด
    park_h = len(park) # ๊ณต์› ์„ธ๋กœ ๊ธธ์ด
    
    for row, road in enumerate(park):
        for col, val in enumerate(road):
            if val == 'S': # ์‹œ์ž‘ ์ขŒํ‘œ๋Š” 1๊ฐœ
                start.append(row)
                start.append(col)
            elif val == 'X': # ์žฅ์• ๋ฌผ์€ 0๊ฐœ ์ด์ƒ
                block.add((row, col))
                
    answer = start
    
    # ๊ณต์› ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ
    def is_out(row, col):
        if park_w <= col or col < 0:
            return 1
        if park_h <= row or row < 0:
            return 1
        else:
            return 0
    
    # ๋ช…๋ น๋ณ„ ์ˆœํšŒ
    for r in routes:
        direction, distance = r.split()
        distance = int(distance)
        
        check_out = 0 # ๊ณต์› ๋ฒ—์–ด๋‚จ ํ™•์ธ
        check_block = 0 # ์žฅ์• ๋ฌผ ํ™•์ธ
        
        if direction == 'E':
            for i in range(1, distance+1): # 1์นธ์”ฉ ์ด๋™
                # ๊ณต์› ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ
                check_out = is_out(answer[0], answer[1]+i)
                if check_out == 1:
                    break
                # ์žฅ์• ๋ฌผ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธ
                if (answer[0], answer[1]+i) in block:
                    check_block = 1
                    break
            if check_out == 0 and check_block == 0:
                answer[1] += distance  
                    
        elif direction == 'W':
            for i in range(1, distance+1): # 1์นธ์”ฉ ์ด๋™
                # ๊ณต์› ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ
                check_out = is_out(answer[0], answer[1]-i)
                if check_out == 1:
                    break
                # ์žฅ์• ๋ฌผ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธ
                if (answer[0], answer[1]-i) in block:
                    check_block = 1
                    break
            if check_out == 0 and check_block == 0:
                answer[1] -= distance  
                    
        elif direction == 'S':
            for i in range(1, distance+1): # 1์นธ์”ฉ ์ด๋™
                # ๊ณต์› ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ
                check_out = is_out(answer[0]+i, answer[1])
                if check_out == 1:
                    break
                # ์žฅ์• ๋ฌผ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธ
                if (answer[0]+i, answer[1]) in block:
                    check_block = 1
                    break
            if check_out == 0 and check_block == 0:
                answer[0] += distance
                    
        elif direction == 'N':
            for i in range(1, distance+1): # 1์นธ์”ฉ ์ด๋™
                # ๊ณต์› ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ
                check_out = is_out(answer[0]-i, answer[1])
                if check_out == 1:
                    break
                # ์žฅ์• ๋ฌผ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธ
                if (answer[0]-i, answer[1]) in block:
                    check_block = 1
                    break
            if check_out == 0 and check_block == 0:
                answer[0] -= distance            
        
        # print(f'{r} ๋ช…๋ น ํ›„ ํ˜„์žฌ ์œ„์น˜', answer)
                    
    return answer