티스토리 뷰

백준

백준 14713: 앵무새 - 파이썬

곽츠비 2023. 8. 16. 11:07

문제

자가용 비행기를 타고 세계 일주를 하던 pps789와 cseteram은 어느 날 엔진 고장으로 인해 이름 모를 섬에 불시착하게 된다. 그들은 이 섬을 탐험하는 도중 아주 신기한 사실을 알게 되었는데, 바로 이 섬에 사는 앵무새들은 놀라울 정도로 인간의 말을 흉내 내는 데 뛰어나다는 것이다. 그들은 서로 떨어져 섬을 탐험하기로 하였으며, 필요하다면 앵무새를 이용해 서로에게 연락하기로 약속하였다.

1개월 후, pps789는 섬의 비밀을 밝힐 결정적인 증거를 찾게 된다. 그는 이 세기의 대발견을 cseteram에게 공유하고자 하였으나, 그의 발견은 방대하여 앵무새 한 마리가 기억하기에는 너무 많은 양이었다. 그렇기 에 pps789는 앵무새 한 마리 대신 앵무새 N마리를 이용하여 자신의 발견을 기록하였으며, 이 앵무새들을 cseteram을 향해 날렸다.

한편 섬의 반대편에서 탐험을 계속하던 cseteram은 앵무새 N마리가 자신에게 날아와 각자 할 말을 하는 것을 보고 당황하였다. pps789가 긴 글을 전달하고 싶었던 것은 알아차렸지만, 각각의 앵무새들이 말하는 것을 차례대로 기록하다 보니 원문이 무엇인지 알 수 없을 정도로 단어의 순서가 엉켜버린 것이다. 대신 그는 관찰을 통해 몇 가지 규칙을 발견할 수 있었다.

  1. 한 앵무새는 한 문장을 기억하고 있다. 문장은 여러 단어로 이루어져 있는데, 앵무새는 이 단어들을 순서대로 말한다.
  2. 한 앵무새가 단어를 말하고 그다음 단어를 말하기 전에는 약간의 간격이 있는데, 이때 다른 앵무새가 말을 가로채고 자신의 문장을 말할 수 있다.
  3. 한 앵무새가 단어를 말하는 도중에는, 다른 앵무새가 말을 가로채지 않는다.
  4. 어떤 단어도 앵무새가 말하는 모든 문장을 통틀어 2번 이상 등장하지 않는다.

앵무새는 자신이 기억하고 있는 문장을 끝까지 말한 다음 pps789에게 돌아가며, cseteram은 모든 앵무새가 돌아갈 때 까지 단어를 받아적는다. pps789가 각각의 앵무새들에게 전달한 문장 Si와, cseteram이 받아 적은 문장 L이 주어진다. 이때 문장 L이 위 규칙들을 이용하여 나올 수 있는 문장인지 판별하시오.

입력

첫 번째 줄에 앵무새의 수 N (1 ≤ N ≤ 100) 이 주어진다.

두 번째 줄부터 N개의 줄에 걸쳐 각 앵무새가 말한 문장 Si (1 ≤ i ≤ N) 가 주어지는데, 각 문장을 이루는 단어는 스페이스 한 칸을 구분으로 하여 주어진다. 문장 Si를 이루는 단어의 수는 1개 이상 100개 이하이며, 각 단어는 1개 이상 32개 이하의 영문 소문자로 구성되어있다.

N + 2 번째 줄에는 cseteram이 받아 적은 문장 L이 주어진다. 문장 L을 이루는 단어의 수는 1개 이상 10000개 이하이며, 각 단어는 1개 이상 32개 이하의 영문 소문자로 구성된다.

출력

 

문장 L이 가능한 문장이라면 Possible을, 불가능한 문장이라면 Impossible을 출력한다.

 

 
 
내 코드
import sys

n=int(sys.stdin.readline())
arr=[]

length=0 #앵무새가 말한 단어의 총 개수

for i in range(n):
    arr.append(sys.stdin.readline().split())
    length+=len(arr[i])
    arr[i].append(0)

res=sys.stdin.readline().split() #정답 문장

for word in res:
    isOk=0 #단어가 있어서 pop하면 1로 바꿀것임
    for i in range(n):
        if arr[i][0]==word:
            arr[i].pop(0)
            isOk=1
            break
    if isOk==0:
        break

if isOk==0 or length!=len(res):
    print("Impossible")
elif isOk==1 and length==len(res):
    print("Possible")

 

풀이 및 접근

- 앵무새의 문장을 2차원 배열로 저장하되 단어 단위로 한 원소를 이루게 저장

- 앵무새 말을 저장하면서 총 단어의 개수를 length에 저장하여 나중에 비교하는데 사용

- 각 문장의 첫번째 원소를 비교할때 arr[i][0]으로 접근하게 되는데, 모두 pop되면 특정 arr[i]가 비어서 접근시 null point exception이 나므로 배열 생성시에 맨뒤에 append(0)으로 절대 빈 배열이 되지 않도록 한다.

- for문 탈출 조건은 pop이 한번도 이루어지지 않거나 정답문장의 단어들을 다 돌았을 때이다.

- possible을 출력하려면 처음에 저장한 length와 정답 문장의 단어 개수가 같고 isOk가 1이어야 한다.

- isOk가 0인채로 for문을 나오거나 애초에 전체 정답 문장 단어 개수와 length가 다르면 비교할 필요도 없이 impossible이다.

'백준' 카테고리의 다른 글

백준 11279: 최대 힙 - 파이썬  (0) 2023.08.18
백준 1927: 최소 힙 - 파이썬  (0) 2023.08.17
백준 1918: 후위 표기식 - 파이썬  (0) 2023.08.17
백준 1874: 스택 수열 - 파이썬  (0) 2023.08.16
백준 13335: 트럭 - 파이썬  (0) 2023.08.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함