현제의 현재이야기

[백준/python] 15787 - 기차가 어둠을 헤치고 은하수를 본문

algorithm

[백준/python] 15787 - 기차가 어둠을 헤치고 은하수를

현재의 현제 2022. 9. 22. 10:45

 

15787번: 기차가 어둠을 헤치고 은하수를

입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. 

www.acmicpc.net

from collections import deque

def one(arr, x):
    if arr[x] == 1:
        return arr
    else:
        arr[x] = 1
        return arr
def two(arr, x):
    if arr[x] == 0:
        return arr
    else:
        arr[x] = 0
        return arr

def thr(arr):
    arr = deque(arr)
    arr.rotate(1)
    if arr[0] == 1:
        arr[0] = 0
    return list(arr)

def four(arr):
    arr = deque(arr)
    arr.rotate(-1)
    if arr[-1] == 1:
        arr[-1] = 0
    return list(arr)

n, m = map(int, input().split())
train = [[0] * 20 for _ in range(n)]
order = [
    list(map(int,input().split()))
    for _ in range(m)
]
box =[]
cnt = 0

for i in range(m):
    if order[i][0] == 1:
        train[order[i][1] -1] = one(train[order[i][1] -1], order[i][2] -1)
    elif order[i][0] == 2:
        train[order[i][1] -1] = two(train[order[i][1] -1], order[i][2] -1)
    elif order[i][0] == 3:
        train[order[i][1] -1] = thr(train[order[i][1] -1])
    elif order[i][0] == 4:
        train[order[i][1] -1] = four(train[order[i][1] -1])


for target in train:
    if target in box:
        continue
    else:
        box.append(target)
        cnt += 1
print(cnt)

| 알고리즘

order의 첫번 째가 주문의 종류이기 때문에, 1, 2, 3, 4로 나누었다. 그리고 각 함수에 기차칸(order[ı][1])과 좌석 x를 넣어주었다.

-1를 한 이유는 첫번째 기차 칸과 첫번 째 좌석은 1이지만, 기차의 배열은 0부터 시작하기 때문이다. one과 two는 그냥 자리를 확인하고

채워주고 비워준다. thr four은 앞으로 한 칸, 뒤로 한칸씩 로테이틀해주고 각 맨 앞과 맨 뒤가 1, 즉 좌석이 차있으면 0으로 바꾸어준다. 그리고 배열에 넣고 있으면 cnt +1을 해준다

'algorithm' 카테고리의 다른 글

[백준/python] 2606 - 바이러스  (0) 2022.09.28
[백준/python] 1331 - 나이트투어  (0) 2022.09.27
[백준/python] 18310 - 안테나  (0) 2022.09.19
[백준/python] 2644 - 촌수계산  (1) 2022.09.18
[백준/python] 15486 - 퇴사2  (0) 2022.09.07
Comments