알고리즘/문제 풀이

백준 23358번: Quack Strikes Back (Easy)

Themion 2022. 6. 30. 16:42

https://www.acmicpc.net/problem/23358

 

23358번: Quack Strikes Back (Easy)

Two years ago the IPSC contestants had a hard time to understand a piece of code written in PostScript. Last year wasn't any better as we introduced a queue-based programming language. If you didn't participate last year (and even if you did :), this pract

www.acmicpc.net

굳이 따지자면 큐를 쓰는 문제이긴 하지만, 알고리즘 문제라기 보단 CS 문제에 가깝다. 큐와 레지스터를 주고 피보나치 수열을 계산하는 문제인데, 큐에 남아있는 원소를 모두 관리하는 것이 가장 중요하다.

입력이 큐에 존재한다고 가정하므로, 이 입력을 우선 레지스터로 옮겨야 한다. 피보나치의 계산을 위해 P0과 P1을 각각 큐에 넣고, 피보나치의 계산이 끝난 뒤 이동하기 위한 end 태그를 선언하면 준비는 끝난다.

>n
0
1

:end

큐에 존재하는 두 원소의 합을 연속해서 구하기 위해 loop 태그를 선언한다. 루프할 횟수 n이 0이라면 end로 점프한다. 그 후 큐에 남아있는 두 원소를 각각 레지스터 a와 b에 옮긴 뒤, a와 b를 차례로 put하고 + 연산을 다음 그 결과를 레지스터 c로 옮기면 c = a + b와 빈 큐를 얻게 된다. 이제 n과 1을 차례로 put하고 - 연산을 진행한 다음 그 결과를 n에 옮기면 n--를 진행한 것과 같게 된다. 이제 b와 c를 차례로 큐에 넣고 a를 출력하면 한 단계의 피보나치 연산이 끝났으므로, 다시 loop 태그로 점프하면 된다.

>n
0
1

:loop
Znend

>a >b <a <b + >c

<n 1 - >n

<b <c
Pa

Jloop

:end