Bronze/Bronze I

BOJ 22403 - 阿吽の呼吸 (Python 3)

nflight11 2022. 11. 16. 05:04

처음으로 번역을 했다. 지금까지는 번역문을 보면서 문제를 풀어 왔는데 이렇게라도 기여를 할 수 있으면 좋겠다 싶어 안 되는 일본어를 해 봤다.

이 글을 보는 독자들은 속이 터지지 않게 한 줄 한 줄 한국어 해석을 붙이니 너무 걱정하지는 말자.

 

그럼 본격적으로 풀이에 돌입해 보자.


문제

時は進んで 2060 年,共に 70 歳を迎える前田さんと後藤さんは長い付き合いの友人であり,大学時代にACM-ICPCで共に戦った仲間でもある.

시간이 흘러 2060년, 이제는 70살이 된 마에다와 고토는 오래 된 친구이며, 대학생 때 ACM-ICPC에서 한 팀이 되어 최고의 호흡을 자랑했던 바 있다.

二人は今でもよく一緒にお茶を飲みつつ,競技プログラミングの話で盛り上がっている.

두 사람은 요즘도 함께 차를 마시며 프로그래밍 대회 이야기를 하고는 한다.

二人で一緒にお茶を飲む時,前田さんが 1 回Aと言うと,その発言の後に後藤さんがちょうど 1 回Unと返事をする習慣がいつのまにか出来た.

함께 차를 마실 때 마에다가 한 번 A라고 말하면, 그 발언 뒤에 고토도 딱 한 번 Un이라고 반응하는 것이 어느 새 두 사람 사이의 습관이 되었다.

しかし最近後藤さんは物忘れや勘違いをすることが多く,前田さんがAと言っても,後藤さんはたまにUnの返事を忘れたり,余計に返事をしたりする.

그러나 요즘 고토는 건망증이나 착각이 늘어, 마에다가 A라고 해도 자신의 반응 Un을 잊거나 쓸데없이 대답을 한 번 더 하기도 한다.

ついこの間も前田さんと後藤さんはお茶を飲みながら,二人のお気に入りのデータ構造について話し込んでいたようだ.

지금도 마에다와 고토는 차를 마시며, 두 사람이 좋아하는 데이터 구조에 관하여 이야기를 하고 있는 것 같다.

この時の会話の中から,Aで表される前田さんの発言と,Unで表される後藤さんの返事のみからなる記録が時系列で与えられたとき,後藤さんが習慣通りに反応したとみなすことが出来るかチェックしてほしい.

이 대화 중 A로 표시되는 마에다의 발언과 Un으로 표시되는 고토의 반응을 나타내는 기록이 시간 순으로 나열되어 있다. 이 기록만 보고 고토가 습관대로 반응하였는지 점검을 하고 싶다.

注意点として,前田さんの発言に対し,後藤さんの返事が多少遅れても,後藤さんは習慣通りに反応したとみなせる場合がある,ということが挙げられる. 例えば,前田さんが2回連続してAと言った後,後藤さんが 2 回連続してUnと返事をして会話が終了した場合は,後藤さんが習慣通りの返事をしたとみなされる (Sample Input 2 参照).

다만, 마에다의 발언에 대해 고토의 대답이 조금 지연되었다고 하더라도 습관대로 반응하였다고 치자. 예를 들어 마에다가 두 번 연속 A라고 발언한 뒤 고토가 두 번 연속 Un이라 반응하고 대화가 종료되었을 경우에는 고토가 습관대로 반응하였다고 간주한다.(예제 입력 2를 보라.)

また,会話が終了した時点で,前田さんがAと言った回数と,後藤さんがUnと返事した回数が一致しても,後藤さんが習慣通りに返事をしたとはみなされない場合もあるので注意すること. 例えば,前田さんが1回Aと言った後,後藤さんが 2 回連続してUnと返事し,その後で前田さんが 1 回Aと言って会話が終了した場合は,後藤さんが習慣通りの返事をしたとはみなされない (Sample Input 3 参照).

또, 대화가 끝난 시점에서 마에다의 발언 횟수와 고토의 반응 횟수가 일치한다 하더라도 고토가 습관대로 반응하였다고 할 수 없음에 유의하라. 예를 들면, 마에다가 한 번 A라고 말한 뒤, 고토가 두 번 연속 Un이라 반응하고, 다시 마에다의 발언 A로 대화가 종료되었을 경우, 고토가 습관대로 반응하였다고 간주할 수 없을 것이다.(예제 입력 3을 보라.)

 

입력

入力は以下の形式で与えられる.

입력은 이하의 형식을 따른다.

\(N\)

\(S_1\)

\(S_2\)

\(\cdots\)

\(S_N\)

最初の行はひとつの整数からなる. N は,記録に含まれる前田さんがAと発言した回数と後藤さんがUnと返事した回数の合計を表し,1 ≤ N ≤ 100 を満たす.

처음의 행은 하나의 정수 N으로, 마에다의 발언 횟수와 고토의 반응 횟수를 합산한 양을 나타내며 1≤N≤100을 만족한다.

その後 N 行に,文字列 \(S_i\) が続き,各 \(S_i (1 \leq i \leq N)\) はAかUnのどちらかに一致する.ここでAは前田さんの発言,Unは後藤さんの返事を表す. 

그 후 N행에 걸쳐 문자열 \(S_i (1\le i\le N)\)가 입력된다. 각 \(S_i\)는 A 혹은 Un 둘 중 하나이다. 여기서 A는 마에다의 발언, Un은 고토의 반응을 표시한다. 

i の小さい順に \(S_i\) が記録されたものとする. 前田さんと後藤さんが同時に発言することは無かったとする.

i가 작은 순으로 \(S_i\)가 기록되었다고 하며, 마에다와 고토가 동시에 말을 하는 경우는 없다고 가정한다.

 

예제 입력)

# 예제 입력 1
4
A
Un
A
Un

# 예제 입력 2
4
A
A
Un
Un

# 예제 입력 3
4
A
Un
Un
A

# 예제 입력 4
1
Un

 

출력

後藤さんが習慣通りに反応したとみなすことが出来ればYES,出来なければNOを1行で出力すること.

고토가 습관대로 반응하였을 경우에는 YES, 아닌 경우는 NO를 한 행에 출력할 것.

 

예제 출력)

# 예제 출력 1
YES

# 예제 출력 2
YES

# 예제 출력 3
NO

# 예제 출력 4
NO

 


내 코드

stack,answer = [],'YES'
for _ in range(int(input())):
    if input()=='A':
        stack.append('A')
    else:
        try:
            stack.pop()
        except IndexError:
            answer = 'NO'
if len(stack)!=0: answer="NO"
print(answer)

 

별 문제 없으면 YES를, 문제가 생기면 NO를 출력하는 식으로 코드를 짰다.

NO를 출력하는 경우는 다음 두 가지다.

하나. 마에다가 A라고 말하지도 않았는데 고토가 Un이라 말한 경우.

둘. 마에다가 A라고 분명 말했는데 그에 따른 대답이 돌아오지 않을 경우.

 

첫 번째 경우는 for 문 내의 else 구문에서, try except 구문에서 걸러진다.

마에다가 A라고 말할 때마다 stack에도 'A'가 하나씩 쌓이고, 고토가 Un이라고 할 때마다 stack에서 'A' 하나가 사라진다.

그런데 마에다가 말하지도 않았는데 고토의 반응이 돌아온다면 완전히 비어버린 stack에서 뭔가를 꺼내야 한다. IndexError가 발생하고, answer가 "NO"가 된다.

두 번째 경우는 마지막에 stack에 쌓인 "A"가 있는지만 따지면 된다.

만약 비어 있지 않으면 고토가 대답을 까먹은 것이고, 답은 'NO'가 된다.

 

이로서 22403번의 풀이를 마친다.

그럼, 오늘도 당신의 코딩 실력이 상승하기를.

728x90