백준 온라인 저지(BOJ) 3954번 Brainfuck 문제
안녕하세요 호호만두에요
이번에는 백준 온라인 저지(BOJ)의 3954번 문제인 Brainfuck을 풀어봤어요
이름이 너무 웃기지 않나요?? 들어가보면 사실 Brainf**k로 표현되어있어요
찾아보니까 이런 단어가 존재하더라구요??? 그게 더 신기...
알고보니까 93년도에 우어반 뮐러라는 사람이 만든 프로그래밍 언어라고 ㅋㅋㅋㅋㅋㅋ
이름 한 번 잘지었네 위키에서 명령어들 같은거 보면 그대로 규칙이 그대로 나왔어요
궁금하신 분은 쭉 훑어보세요
brainfuck 이란??
이 문제는 골드1로 분류되어 있는 난이도가 조금 있는 문제였어요
BOJ 3954번 Brainfuck
이 문제의 유형을 분류하자면 주어진 사항을 잘 읽고 구현하는 시뮬레이션
그리고 규칙 찾기 문제로 분류 할 수 있을 것 같아요
그러면 풀어 봅시다!!
문제의 핵심
문제 풀이
이 문제는 주어진 사항을 그대로 구현하는 문제에요
- 먼저 '['와 ']' 쌍을 for문을 돌면서 모두 찾습니다. 찾아서 쌍의 index를 배열에 저장합니다.
- 그 다음 program 명령에 맞게 switch문을 이용해 판단하여 수행합니다
- 2-1. '-'와 '+'는 포인터가 가리키고 있는 메모리의 값을 1 감소, 증가 시켜줍니다(% 256)
- 2-2. '<' '>'는 포인터의 위치를 감소, 증가 시킵니다. 인덱스를 넘어가는 경우 예외처리를 해줍니다
- 2-3. '['와 ']'는 메모리 배열의 숫자를 참조하여 jump를 하거나 순차적으로 program 명령을 진행합니다.
- 2.4 '.'은 그냥 넘어가고 ','는 input string의 한 문자를 읽어서 아스키 코드 값 메모리 배열에 저장합니다. (input을 다 읽은 경우 255 저장)
- loop문이 몇번 도는지 검사하며 50000000이 넘으면 무한루프에 빠졌다고 인식하여 Loops 출력
- 그렇지 않고 모든 program code를 다 읽은 경우에는 Terminates를 출력합니다
백준 3954번 자바 풀이 코드
class Pair{
int left;
int right;
}
class Main {
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static int mem_size;
static int code_len;
static int input_size;
}