명령어 그대로 구현하면 된다. 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을 생각하지 못했다... 까비...