반응형
문제설명
현수는 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'를 출력하는 프로그램을 작성해라.
입력조건
- 첫 줄에 한 줄에 필수과목의 순서가 주어진다. 모든 과목은 영문 대문자이다.
- 둘째 줄에 N(1 <= N <= 10)이 주어진다.
- 셋째 줄부터 현수가 짠 N개의 수업설계가 주어진다.(수업설계의 길이는 30이하 이다)
- 수업설계는 같은 과목을 여러 번 이수하도록 설계해도 된다.
출력조건
- 수업설계가 잘 된 것이면 'YES', 잘못된 것이면 'NO'를 출력한다.
사고과정
- 처음에 큐를 생각 안하고 주어지는 필수과목 순서를 뒤집어서 스택을 활용해서 풀면 될 것 같다고 생각했다. 큐로 구현하는 데 성공은 했지만 코드 길이가 상당히 만연했다..
- 풀이를 보니 큐로 사용해 구현했고 for ~ else 구문을 사용하기도 했다. 매번 for ~ else 구문을 사용하려고 시도했는데 잘못 알고 있던 게 있었다. 바로 for 안에서 break를 당하지 않았으면! else 구문이 동작하는 것이다! 난 반대로 생각했었음..
풀이
- 나의 풀이
s = list(input())
n = int(input())
for i in range(n):
arr = input()
stack = s[::-1]
for x in arr:
# 스택이 비었다는 것은 = 필수과목 순서대로 이수 1번씩 다했다는 것을 의미하므로 바로 break
if not stack:
break
if x == stack[-1]:
stack.pop()
# 현재 과목이 필수과목에 포함되지 않을 경우 무시
elif x not in stack:
continue
# 현재 과목이 이제 들어야 할 필수과목이랑 불일치할 경우(위에서 필수과목에 포함되지 않는 경우를 1차 필터링했으므로 범위가 좁아짐!)
elif x != stack[-1]:
break
# 스택에 남은 필수 과목들이 들어있다면 NO
if stack:
print(f'#{i+1} NO')
# 스택이 비어있다면 모두 필수 과목 제대로 이수하는 설계이므로 YES
else:
print(f'#{i+1} YES')
- 강의 풀이(권장)
# 강의 Solution -> 큐를 활용함, for ~ else 구문 활용함(break안 당했으면! else구문으로 동작하는 거임!!!)
from collections import deque
need = input()
n = int(input())
for i in range(n):
plan = input()
dq = deque(need)
for x in plan:
# 필수과목일 때,
if x in dq:
# 필수과목 순서 지켰는지 확인하면서 pop시켰으므로 따로 밑에서 popleft() 또 해줄 필요 없음
if x != dq.popleft():
print(f'#{i+1} NO')
break
else:
if len(dq) == 0:
print(f'#{i+1} YES')
else:
print(f'#{i+1} NO')
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[인프런] 아나그램(Anagram) (0) | 2021.11.18 |
---|---|
[인프런] 단어 찾기 (0) | 2021.11.17 |
[인프런] 응급실 (0) | 2021.11.17 |
[인프런] 공주 구하기 (0) | 2021.11.17 |
[인프런] 가장 큰 수 (0) | 2021.11.16 |