본문 바로가기
알고리즘

BOJ 15787번(기차가 어둠을 헤치고 은하수를)

by eunyoung 2023. 4. 5.

난이도


실버 II

 

 

 

풀이


이차원 배열을 주어진 조건에 맞게 구현하면 되는 문제였다.

 

 

풀이1

풀이1은 리스트를 가지고 구현한 풀이이다.

import sys

input=sys.stdin.readline

N,M=map(int,input().split())

train=[[0 for _ in range(20)]for _ in range(N)]
result=0
answer=[]

for _ in range(M):
    command=list(map(int,input().split()))
    trainIdx=command[1]
    if len(command)==3:
        chain=command[2]
    if command[0]==1:
        train[trainIdx-1][chain-1]=1
    elif command[0]==2:
        train[trainIdx-1][chain-1]=0
    elif command[0]==3:
        if train[trainIdx-1][19]==1:
            train[trainIdx-1][19]=0
        for i in range(18,-1,-1):
            train[trainIdx-1][i+1]=train[trainIdx-1][i]
        train[trainIdx - 1][0]=0
    elif command[0]==4:
        if train[trainIdx-1][0]==1:
            train[trainIdx-1][0]=0
        for i in range(1,20):
            train[trainIdx-1][i-1]=train[trainIdx-1][i]
        train[trainIdx - 1][19] = 0

for tra in train:
    if tra in answer:
        pass
    else:
        answer.append(tra)
        result+=1

print(result)

리스트를 이용한 다른 풀이도 있는데 이게 훨씬 더 간단하긴 하다.

import sys

input=sys.stdin.readline

N,M=map(int,input().split())

train=[[0 for _ in range(20)]for _ in range(N)]
result=0
answer=[]

for _ in range(M):
    command=list(map(int,input().split()))
    trainIdx=command[1]
    if len(command)==3:
        chain=command[2]
    if command[0]==1:
        train[trainIdx-1][chain-1]=1
    elif command[0]==2:
        train[trainIdx-1][chain-1]=0
    elif command[0]==3:
        train[trainIdx-1].insert(0,0)
        train[trainIdx-1].pop(-1)
    elif command[0]==4:
        train[trainIdx-1].pop(0)
        train[trainIdx-1].append(0)

for tra in train:
    if tra in answer:
        pass
    else:
        answer.append(tra)
        result+=1

print(result)

 

 

 

풀이2

풀이2는 리스트말고 deque를 이용해서 구현하였다.

이를 이용하니 풀이1에 비해서는 훨씬 더 코드가 간단해졌다.

import sys
from collections import deque

input=sys.stdin.readline

N,M=map(int,input().split())
answer=[]
result=0
train=[deque(0 for _ in range(20))for _ in range(N)]

for _ in range(M):
    command=list(map(int,input().split()))
    trainIdx=command[1]
    if len(command)==3:
        chain=command[2]

    if command[0]==1:
        train[trainIdx-1][chain-1]=1
    elif command[0]==2:
        train[trainIdx-1][chain-1]=0
    elif command[0]==3:
        train[trainIdx-1].rotate(1)
        train[trainIdx-1][0]=0
    elif command[0]==4:
        train[trainIdx-1].rotate(-1)
        train[trainIdx - 1][19] = 0

for tra in train:
    if tra in answer:
        pass
    else:
        result+=1
        answer.append(tra)


print(result)

 

  • 파이썬 deque 문법 정리

    파이썬의 리스트와 같이 요소들을 한 곳에 담아두는 배열
    deque는 큐이지만 양방향인 queue이다 : 양 쪽 방향 모두에서 앞뒤 요소를 추가/제거할 수 있다.

    1. 큐.append(item)
    2. 큐.appendleft(item)
    3. 큐.pop()
    4. 큐.popleft()
    5. 큐.extend(array)
    6. 큐.extendleft(array)
    7. 큐.remove(item)
    8. 큐.rotate(숫자) : 해당 숫자만큼 회전 - 양수: 시계방향 / 음수 : 반시계방향

풀이3

비트마스킹을 이용한 풀이

import sys

input=sys.stdin.readline

N,M=map(int,input().split())

trains=[0 for _ in range(N)]
answer=[]
result=0

for _ in range(M):
    commmand=list(map(int,input().split()))
    trainIdx=commmand[1]-1
    if len(commmand)>2:
        chainIdx=commmand[2]-1
    if commmand[0]==1:
        trains[trainIdx]=trains[trainIdx]|1<<chainIdx
    elif commmand[0]==2:
        trains[trainIdx]=trains[trainIdx]&~(1<<chainIdx)
    elif commmand[0]==3:
        trains[trainIdx]=trains[trainIdx]<<1
        trains[trainIdx]=trains[trainIdx] & ~(1 << 20)
    elif commmand[0]==4:
        trains[trainIdx]=trains[trainIdx]>>1

print(len(set(trains)))

 

 

문제 링크


https://www.acmicpc.net/problem/15787

 

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

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

www.acmicpc.net

 

'알고리즘' 카테고리의 다른 글

BOJ 미로탐색 (2178번)  (0) 2023.04.06
프로그래머스 혼자서 하는 틱택토  (0) 2023.04.05
프로그래머스 추억 점수(Java/Python)  (0) 2023.04.05
BOJ 1354번(무한 수열2)  (0) 2023.04.04
BOJ 9742번 - 순열  (0) 2023.04.04