1 분 소요

사용 언어: Python3

문제

스크린샷 2023-04-27 오후 3 03 48

풀이

내 풀이

from collections import deque
def process(i):
    subject = input()
    q = deque() # 현수의 플랜 중 필수과목만 담을 큐
    for x in subject:
        if x in must and not x in q: # ✅ 이미 q에 들어있다면 제외!
            q.append(x)
    if ''.join(q) == must: # must와 현수가 짠 플랜 비교
        print('#{} {}'.format(i, 'YES'))
    else:
        print('#{} {}'.format(i, 'NO'))

must = input()
N = int(input())

for i in range(N):
    process(i+1);
  • 현수의 플랜을 순회하며 필수 과목들만 큐에 담는다.
    • 🌟 필수과목이 두 개 이상 포함되어 있다면, 맨 처음 나오는 값 “하나”만 넣는다.
  • 처음에 주어진 필수과목 순서와 큐가 일치하면 YES, 그렇지 않으면 NO

다른 풀이

from collections import deque
def process(i):
    q = deque(must) # 처음에 주어진 필수과목을 큐 형태로
    lst = list(input())

    for x in lst:
        if x in q: # 똑같은 문자 두 번 이상 있을 때 q에서 이미 pop 
            if x != q.popleft():
                print('#{} {}'.format(i, 'NO'))
                return
        if len(q) == 0:
            print('#{} {}'.format(i, 'YES'))
            return
    print('#{} {}'.format(i, 'NO'))
    return

must = input()
N = int(input())

for i in range(N):
    process(i+1);

  • 처음에 주어진 필수과목 순서를 큐에 넣는다.
  • 현수의 플랜을 순회하면서 해당 과목이 큐 안에 있다면 popleft()
    • 만약 현수의 플랜 중 같은 필수과목이 두 개 이상 있다면, 처음 나올 때 그 값은 큐에서 사라진다.
    • 두 번째 값부터는 필수과목이 아닌게 되어 고려대상이 되지 않는다.
  • 순회하면서 큐에서 꺼낸 값과 현수의 플랜에서 꺼낸 필수과목이 같지 않으면 NO
  • 순회를 마치고도 큐 안에 값이 남아있으면 그 필수과목은 수강하지 않은 것이기 때문에 NO
  • 무사히 순회를 마치고 큐의 길이가 0이라면 YES

다른 풀이

로직은 바로 위와 같다.

from collections import deque
def process(i):
    q = deque(must) # 처음에 주어진 필수과목을 큐 형태로
    lst = list(input())

    for x in lst:
        if x in q: # 똑같은 문자 두 번 이상 있을 때 q에서 이미 pop 
            if x != q.popleft():
                print('#%d NO' %i) # ✅ 필수과목 순서가 다른 경우
                break
    else: # ✅ for~else
        if len(q) == 0:
            print('#%d YES' %i)
        else:
            print('#%d NO' %i) # ✅ 필수과목이 남은 경우

must = input()
N = int(input())

for i in range(N):
    process(i+1);


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기