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

이유참치·2026년 3월 7일

백준

목록 보기
239/249

문제 : 15787

풀이 point

명령어 그대로 구현하면 된다. False 20개 칸을 N개 만들어서 해당 칸을 명령어대로 수정해나가면 된다. 마지막으로 중복확인은 set을 활용한다.

또다른 방법은 비트마스킹이다. int혹은 char같은 값을 넣는게 아닌 0 or 1로 값을 표현하는 것이기 때문에 비트마스킹을 활용할 수 있다.

풀이 코드

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

train = [[False]*20 for _ in range(N)]
for _ in range(M):
  cmd = list(map(int, input().split()))
  if cmd[0] == 1:
    train[cmd[1]-1][cmd[2]-1] = True
  elif cmd[0] == 2:
    train[cmd[1]-1][cmd[2]-1] = False
  elif cmd[0] == 3:
    for j in range(19, 0, -1):
      train[cmd[1]-1][j] = train[cmd[1]-1][j-1]
    train[cmd[1]-1][0] = False
  elif cmd[0] == 4:
    for j in range(19):
      train[cmd[1]-1][j] = train[cmd[1]-1][j+1]
    train[cmd[1]-1][19] = False

s = set()
for t in train:
  s.add(tuple(t))
print(len(s))

사족

중복 제거 set을 생각하지 못했다... 까비...

profile
임아리 - 대학생

0개의 댓글