ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

14891번: ν†±λ‹ˆλ°”ν€΄

첫째 쀄에 1번 ν†±λ‹ˆλ°”ν€΄μ˜ μƒνƒœ, λ‘˜μ§Έ 쀄에 2번 ν†±λ‹ˆλ°”ν€΄μ˜ μƒνƒœ, μ…‹μ§Έ 쀄에 3번 ν†±λ‹ˆλ°”ν€΄μ˜ μƒνƒœ, λ„·μ§Έ 쀄에 4번 ν†±λ‹ˆλ°”ν€΄μ˜ μƒνƒœκ°€ 주어진닀. μƒνƒœλŠ” 8개의 μ •μˆ˜λ‘œ 이루어져 있고, 12μ‹œλ°©ν–₯λΆ€ν„° οΏ½

www.acmicpc.net

 

문제 풀이

좜처 : https://www.acmicpc.net/problem/14891

 λ¬Έμ œμ—λŠ” 4개의 ν†±λ‹ˆλ°”ν€΄μ— λŒ€ν•œ μƒνƒœκ°€  N극인 경우 0, S극인 경우 1둜 주어진닀. ν•˜λ‚˜μ˜ ν†±λ‹ˆλ°”ν€΄λ₯Ό νšŒμ „ν•  λ•Œ, μ‹œκ³„λ°©ν–₯ λ˜λŠ” λ°˜μ‹œκ³„ λ°©ν–₯으둜 νšŒμ „ν•  수 있고 νšŒμ „ν•˜κ³ μž ν•˜λŠ” ν†±λ‹ˆλ°”ν€΄μ™€ μΈμ ‘ν•œ ν†±λ‹ˆλ°”ν€΄λŠ” 극이 λ‹€λ₯Έ 경우 영ν–₯을 λ°›κ²Œ λœλ‹€. μ΄λ•Œ, νšŒμ „ν•œ ν†±λ‹ˆλ°”ν€΄μ™€λŠ” λ°˜λŒ€ 반ν–₯으둜 νšŒμ „ν•˜λŠ” νŠΉμ§•μ„ 가지고 μžˆλ‹€. 이λ₯Ό κ³ λ €ν•˜μ—¬ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λ©΄ μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆλŠ” λ¬Έμ œμ΄λ‹€.

 

 ν•˜λ‚˜μ˜ ν†±λ‹ˆλ°”ν€΄λ₯Ό νšŒμ „μ‹œν‚€λ©΄ 쒌츑, μš°μΈ‘μ— μ—°μ‡„μ μœΌλ‘œ μž‘μš©ν•œλ‹€. λ”°λΌμ„œ μ„ νƒλœ ν†±λ‹ˆλ°”ν€΄μ˜ 쒌우츑의 ν†±λ‹ˆλ°”ν€΄λ“€μ΄ νšŒμ „ν•œλ‹€λ©΄, νšŒμ „ν•œ ν†±λ‹ˆλ°”ν€΄μ˜ 쒌츑 λ˜λŠ” μš°μΈ‘λ„ λͺ¨λ‘ ν™•μΈν•˜μ—¬μ•Ό ν•œλ‹€.

 

μ½”λ“œ

from sys import stdin
from collections import deque


def move_gear(idx, cur_dir):
    global cur_right, cur_left, gears
    origin_dir = cur_dir

    # ν˜„μž¬ ν†±λ‹ˆλ°”ν€΄λ₯Ό κΈ°μ€€μœΌλ‘œ 쒌츑의 ν†±λ‹ˆλ°”ν€΄λ“€ 확인.
    for i in reversed(range(idx)):
        if cur_right != gears[i][LEFT]:
            cur_right = gears[i][RIGHT]
            gears[i].rotate(cur_dir * -1)
            cur_dir *= -1
        else:
            break

    cur_dir = origin_dir
    # ν˜„μž¬ ν†±λ‹ˆλ°”ν€΄λ₯Ό κΈ°μ€€μœΌλ‘œ 우츑의 ν†±λ‹ˆλ°”ν€΄λ“€ 확인.
    for i in range(idx + 1, 4):
        if gears[i][RIGHT] != cur_left:
            cur_left = gears[i][LEFT]
            gears[i].rotate(cur_dir * -1)
            cur_dir *= -1
        else:
            break


if __name__ == '__main__':
    LEFT, RIGHT = 2, 6
    gears = [deque(map(int, stdin.readline().strip())) for _ in range(4)]
    k = int(stdin.readline())
    orders = [list(map(int, stdin.readline().split())) for _ in range(k)]

    for gear_idx, direction in orders:
        gear_idx -= 1
        cur_left, cur_right = gears[gear_idx][LEFT], gears[gear_idx][RIGHT]
        gears[gear_idx].rotate(direction)
        move_gear(gear_idx, direction)

    print(sum([2 ** delta if gear[0] else 0 for delta, gear in enumerate(gears)]))

 μ²˜μŒμ—λŠ” rotationν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ˜€λŠ”λ°, dequeλ₯Ό ν™œμš©ν•˜λ©΄ rotateν•¨μˆ˜κ°€ μžˆμ–΄ 이λ₯Ό κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†λ‹€λŠ” κ±Έ 처음 μ•Œμ•˜λ‹€.πŸ˜‚ λ°˜λ³΅λ¬Έμ„ 톡해 μ—°μ‡„μ μœΌλ‘œ 영ν–₯을 λ―ΈμΉ˜λŠ” ν†±λ‹ˆλ°”ν€΄κΉŒμ§€ νšŒμ „ν•˜κ²Œ 되면 μ •λ‹΅μ΄λΌλŠ” 문ꡬλ₯Ό λ³Ό 수 μžˆλ‹€.

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€