https://www.acmicpc.net/problem/2380
24/11/12
오랜만에 파이썬 외의 다른 언어로 풀어보는 문제다. Isolang 중 하나인 Befunge언어를 사용하여 주어진 그림을 출력하면 되는 문제다.
문제 접근 방식:
문제는 간단하다. 주어진 Output을 비펀지언어로 구현하면 끝.
처음에는 귀찮아서 GPT한테 맡겼더니 해결을 못했다. 모델을 바꿔서 해도 해결이 안되길래, GPT한테 해당 언어의 주요 기능을 알려달라고 했다.
비펀지는 2차원 그리드 위에서 실행되는 스택기반 언어로, 공백이 더 들어가거나 탭이 잘못들어가면 이상하게 꼬인다.
주요기능은 다음과 같다.
1. 숫자(0~9)
해당 숫자를 스택에 넣는다.
2. 산술연산자(+,-,*,/,%)
스택에 들어있는 두 숫자를 pop하고 연산을 수행한 후, 수행 결과를 스택에 push한다.
3. 논리연산자
!(논리 부정) 스택에서 pop하고, 그 값이 0이면 1을, 아니라면 0을 push한다.
```(비교 연산) 두 숫자를 pop하고, 두번째 값이 첫번째 값보다 크면 1을, 그렇지 않으면 0을 push한다.
4. 스택 조작
: (스택조작) 스택의 최상단 값을 복제하여 push한다.
\ (스택교환) 스택의 최상단 두 값을 서로 교환한다.
$ (버리기) 스택의 최상단의 값을 버린다.
5. 입출력
. (숫자 출력) 스택에서 값을 pop하여 해당 값을 정수로 출력한다.
, (문자 출력) 스택에서 값을 pop하여 해당 아스키코드의 문자를 출력한다.
& (숫자 입력) 사용자로부터 값을 입력받아 스택에 push한다.
~ (문자 입력) 사용자로부터 문자를 입력받아 아스키코드로 변환해서 스택에 push한다.
6. 제어 흐름
> (우측 이동): 명령어 포인터를 오른쪽으로 이동한다.
< (좌측 이동): 명령어 포인터를 왼쪽으로 이동한다.
^ (상단 이동): 명령어 포인터를 위쪽으로 이동한다.
v (하단 이동): 명령어 포인터를 아래쪽으로 이동한다.
? (무작위 이동): 명령어 포인터의 이동 방향을 무작위로 설정한다 (상하좌우 중 하나).
_ (수평 조건 분기): 스택에서 값을 팝하고, 값이 0이면 명령어 포인터를 오른쪽으로, 그렇지 않으면 왼쪽으로 이동한다.
| (수직 조건 분기): 스택에서 값을 팝하고, 값이 0이면 명령어 포인터를 아래로, 그렇지 않으면 위로 이동한다.
# (스킵): 다음 한 칸을 건너뛴다 (명령어 포인터를 한 칸 더 이동).
@ (프로그램 종료): 프로그램 실행을 종료한다.
7. 문자열 관련
" (문자열 모드 토글): 문자열 모드로 진입하거나 종료한다. 문자열 모드에서는 "를 다시 만날 때까지의 모든 문자의 ASCII 코드가 스택에 푸시된다.
예를 들어, "Hello World!"는 문자열 모드로 진입하여 H, e, l, l, o, , W, o, r, l, d, !의 ASCII 코드가 스택에 순서대로 푸시됩니다.
8. 메모리 조작
p (메모리 저장): 스택에서 세 개의 값을 팝하여, 특정 좌표에 값을 저장한다.
첫 번째 값: y 좌표
두 번째 값: x 좌표
세 번째 값: 저장할 값 (ASCII 코드)
g (메모리 읽기): 스택에서 두 개의 값을 팝하여, 특정 좌표의 값을 가져와 스택에 푸시한다.
첫 번째 값: y 좌표
두 번째 값: x 좌표
9. 기타
스페이스 (공백): 아무 동작도 하지 않음 (NOP, No Operation).
예외 처리: 스택이 비어있는 상태에서 값을 팝하려고 하면, 0을 반환함.
10. 명령어 포인터 이동 규칙
명령어 포인터(IP, Instruction Pointer)는 현재 이동 방향으로 한 칸씩 이동한다.
방향 전환 명령어(>, <, ^, v)를 만나면 해당 방향으로 이동한다.
프로그램은 그리드의 경계를 넘어가면 반대편으로 순환한다.
이렇게 되어있고, 여기서 사용하는 주요 기능은 7번 문자열 관련 기능과 5번 입출력 정도가 될 것이다.
한 줄을 출력한다 치면, 줄바꿈은 어떻게 출력하나 싶은데, 줄바꿈에 해당하는 아스키코드는 10이므로, 숫자랑 산술연산자를 통해 10을 만들고 출력하면 된다.
검색하면 비펀지로 구현한 Hello, world! 예제들이 있으니, 이를 참고해서 구현하면 쉽게 해결할 수 있을 것이다.
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 2418번 단어 격자 (0) | 2024.11.14 |
---|---|
[Python] 1520번 내리막 길 (0) | 2024.11.13 |
[Python] 32645번 동까뚱뽭 게임 (0) | 2024.11.11 |
[Python] 32299번 게임을 만들어요 (0) | 2024.11.10 |
[Python] 4354번 문자열 제곱 (0) | 2024.11.09 |