현수는 1년 과정의 수업계획을 짜야 합니다. 수업중에는 필수과목이 있습니다. 이 필수과목은 반드시 이수해야 하며, 그 순서도 정해져 있습니다.
만약 총 과목이 A, B, C, D, E, F, G가 있고, 여기서 필수과목이 CBA로 주어지면 필수과목은 C, B, A과목이며 이 순서대로 꼭 수업계획을 짜야 합니다. 여기서 순서란 B과목은 C과목을 이수한 후에 들어야 하고, A과목은 C와 B를 이수한 후에 들어야 한다는 것입니다. 현수가 C, B, D, A, G, E로 수업계획을 짜면 제대로 된 설계이지만 C, G, E, A, D, B 순서로 짰다면 잘 못 설계된 수업계획이 됩니다. 수업계획은 그 순서대로 앞에 수업이 이수되면 다음 수업을 시작하다는 것으로 해석합니다. 수업계획서상의 각 과목은 무조건 이수된다고 가정합니다. 필수과목순서가 주어지면 현수가 짠 N개의 수업설계가 잘된 것이면 “YES", 잘못된 것이면 ”NO“를 출력하는 프로그램을 작성하세요.
import sys
input = sys.stdin.readline
str1 = input() # 뒤에 개행('\n')이 붙는다.
str2 = sys.stdin.readline().rstrip() # 개행 붙지 않음
<내 답안>
must = sys.stdin.readline().rstrip() # 필수과목
n = int(input()) # n개의 수업설계
for n in range(n):
sch = sys.stdin.readline().rstrip()
queue = deque(must)
for j in sch:
if j in queue:
q = queue.popleft()
if q == j: # 순서 맞음
continue
else: # 순서에 어긋남
print('#{} NO'.format(n+1))
break
else:
if len(queue) == 0:
print('#{} YES'.format(n+1))
음.. 채점이 90%만 맞았다고 한다.
<수정 후 정답>
must = sys.stdin.readline().rstrip() # 필수과목
n = int(input()) # n개의 수업설계
for n in range(n):
sch = sys.stdin.readline().rstrip()
queue = deque(must)
for j in sch:
if j in queue:
q = queue.popleft()
if q == j: # 순서 맞음
continue
else: # 순서에 어긋남
print('#{} NO'.format(n+1))
break
else:
if len(queue) == 0:
print('#{} YES'.format(n+1))
else:
print('#{} NO'.format(n + 1))
알고보니 마지막 queue가 비어있는지 확인하는 부분에서 else 문을 쓰지 않아 틀렸다고 한 것이었다.
queue가 비어있다면 필수과목을 모두 수업계획서에 넣어 시간표를 짠 것이지만, 그렇지 않다면(else) NO를 출력해야 했다.
만약 순서는 맞았지만 queue가 비어있지 않을 때 NO가 출력되어야 하기 때문에 else문을 써줘야 한다!