DonHurry

[Python] ๋ฐฑ์ค€ 14891๋ฒˆ - ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ๋ณธ๋ฌธ

Problem Solving

[Python] ๋ฐฑ์ค€ 14891๋ฒˆ - ํ†ฑ๋‹ˆ๋ฐ”ํ€ด

_๋„๋… 2024. 1. 21. 15:08

๐Ÿ“– ๋ฌธ์ œ

 

14891๋ฒˆ: ํ†ฑ๋‹ˆ๋ฐ”ํ€ด

์ฒซ์งธ ์ค„์— 1๋ฒˆ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์˜ ์ƒํƒœ, ๋‘˜์งธ ์ค„์— 2๋ฒˆ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์˜ ์ƒํƒœ, ์…‹์งธ ์ค„์— 3๋ฒˆ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์˜ ์ƒํƒœ, ๋„ท์งธ ์ค„์— 4๋ฒˆ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ƒํƒœ๋Š” 8๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , 12์‹œ๋ฐฉํ–ฅ๋ถ€ํ„ฐ

www.acmicpc.net

 

๐Ÿ”Ž ํ’€์ด

๋ฐฑ์ค€ ์‚ผ์„ฑ SW ์—ญ๋Ÿ‰ ํ…Œ์ŠคํŠธ ๊ธฐ์ถœ ๋ฌธ์ œ์ง‘์— ์žˆ๋Š” ๊ตฌํ˜„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ’€์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ์ฃผ์–ด์ง„ K๊ฐœ์˜ ํšŒ์ „ ๋ฐฉ๋ฒ•์„, ์ˆœ์„œ๋Œ€๋กœ (๋ฒˆํ˜ธ์™€ ๋ฐฉํ–ฅ์„) ๊บผ๋‚ธ๋‹ค.
  2. ๋ฆฌ์ŠคํŠธ(deque)๋ฅผ ๋งŒ๋“ค์–ด ๋ฒˆํ˜ธ์™€ ๋ฐฉํ–ฅ์„ ๋„ฃ๋Š”๋‹ค.
  3. ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฒˆํ˜ธ์™€ ๋ฐฉํ–ฅ์„ ํ•˜๋‚˜์”ฉ ๋ฝ‘์•„ ์•„๋ž˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  4. ํ•ด๋‹น ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€, ์กด์žฌํ•œ๋‹ค๋ฉด ๋งž๋‹ฟ์•„ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๊ฐ™์€ ๊ทน์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  5. ํ˜„์žฌ ๋ฐ”ํ€ด๋ฅผ ํšŒ์ „์‹œํ‚ค๊ณ , ๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ทน์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, ๋ฆฌ์ŠคํŠธ์— ์ƒˆ๋กœ์šด ๋ฒˆํ˜ธ์™€ ๋ฐฉํ–ฅ์„ ๋„ฃ๋Š”๋‹ค.

์ฃผ์˜ํ•  ์ ์€ ํšŒ์ „์‹œํ‚ค๊ธฐ ์ „์— ์˜†์˜ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ๊ฐ™์€ ๊ทน์ธ์ง€, ๋‹ค๋ฅธ ๊ทน์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ

from collections import deque

wheel = [[]]
for _ in range(4):
    wheel.append(deque([int(x) for x in input()]))

K = int(input())
q = deque()
for _ in range(K):
    num, direct = map(int, input().split())
    q.append((num, direct))

# ์˜†์— ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ์—†๋‹ค๋ฉด -1
side = [[-1, 2], [1, 3], [2, 4], [3, -1]]
cnt = 0
while q:
    check = [0 for _ in range(5)]
    seq = deque()
    seq.append((q.popleft()))

    while seq:
        num, direct = seq.popleft()
        left, right = side[num-1]
        # ์ขŒ์šฐ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ์—ฐ๋‹ฌ์•„ ํšŒ์ „์‹œํ‚ค๋Š”์ง€์— ๋Œ€ํ•œ flag
        left_flag, right_flag = 0, 0
        check[num] = 1

        # ์ขŒ์šฐ์— ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด๋ฏธ ํšŒ์ „์‹œํ‚ค์ง€ ์•Š์•˜์œผ๋ฉฐ ๋‹ค๋ฅธ ๊ทน์ธ ๊ฒฝ์šฐ
        if left != -1 and not check[num-1] and wheel[left][2] != wheel[num][6]:
            left_flag = 1
        if right != -1 and not check[num+1] and wheel[right][6] != wheel[num][2]:
            right_flag = 1

        # ์‹œ๊ณ„ ๋ฐฉํ–ฅ, ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
        if direct == 1:
            k = wheel[num].pop()
            wheel[num].appendleft(k)
        if direct == -1:
            k = wheel[num].popleft()
            wheel[num].append(k)

        # ์ด์ „์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ ๊ฒฝ์šฐ ์˜†์˜ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋„ ํ์— ์ถ”๊ฐ€
        if left_flag:
            seq.append((num-1, -1 if direct == 1 else 1))
        if right_flag:
            seq.append((num+1, -1 if direct == 1 else 1))

# ์ตœ์ข… ์ ์ˆ˜ ๊ณ„์‚ฐ
for i in range(4):
    if wheel[i+1][0]:
        cnt += 2 ** i

print(cnt)