본문 바로가기

알고리즘 삽질장

[인프런] 교육과정 설계

반응형


문제설명

현수는 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