• Feed
  • Explore
  • Ranking
/
/
    Problem Solving

    [Baekjoon] Brainf**k 인터프리터

    Brainf**k 인터프리터_3954 [골드 1]
    ImplementationSimulationStack백준
    h
    hyeonZIP
    2026.03.09
    ·
    3 min read

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

    import java.io.*;
    import java.util.*;
    
    public class Main {
        static StringBuilder answer = new StringBuilder();
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int testcase = Integer.parseInt(br.readLine());
            StringTokenizer st;
    
            while (testcase-- > 0) {
                st = new StringTokenizer(br.readLine());
    
                int memoryAmount = Integer.parseInt(st.nextToken());
                int codeLength = Integer.parseInt(st.nextToken());
                int inputLength = Integer.parseInt(st.nextToken());
    
                String[] cmd = br.readLine().split("");
                String[] input = br.readLine().split("");
    
                sol(memoryAmount, codeLength, inputLength, cmd, input);
            }
            print();
        }
    
        static void sol(int memoryAmount, int codeLength, int inputLength, String[] cmd, String[] input) {
            int[] memory = new int[memoryAmount];
    
            int pointerIdx = 0;
            int timeOutCheck = 0;
    
            int maxIdx = -1;
            int inputIdx = 0;
    
            int[] pair = new int[codeLength];
            Deque<Integer> loopStack = new ArrayDeque<>();
    
            for (int i = 0; i < codeLength; i++) {
                if (cmd[i].equals("[")) {
                    loopStack.push(i);
                } else if (cmd[i].equals("]")) {
                    int left = loopStack.pop();
                    pair[left] = i;
                    pair[i] = left;
                }
            }
    
            for (int cmdIdx = 0; cmdIdx < cmd.length && timeOutCheck <= 100_000_000; cmdIdx++) {
                String command = cmd[cmdIdx];
                timeOutCheck++;
    
                switch (command) {
                    case "+":
                        memory[pointerIdx] = (memory[pointerIdx] + 1) % 256;
                        break;
                    case "-":
                        memory[pointerIdx] = memory[pointerIdx] - 1 < 0 ? 255 : memory[pointerIdx] - 1;
                        break;
                    case "<":
                        pointerIdx = (pointerIdx - 1 + memoryAmount) % memoryAmount;
                        break;
                    case ">":
                        pointerIdx = (pointerIdx + 1) % memoryAmount;
                        break;
                    case "[":
                        if (memory[pointerIdx] == 0) {
                            cmdIdx = pair[cmdIdx];
                        }
                        break;
                    case "]":
                        if (memory[pointerIdx] != 0) {
                            if (timeOutCheck > 50_000_000) {
                                maxIdx = Math.max(maxIdx, cmdIdx);
                            }
                            cmdIdx = pair[cmdIdx];
                        }
                        break;
                    case ".":
                        // 포인터가 가리키는 수 출력
                        break;
                    case ",":
                        if (inputIdx < inputLength) {
                            memory[pointerIdx] = input[inputIdx].charAt(0);
                            inputIdx++;
                        } else {
                            memory[pointerIdx] = 255;
                        }
                        break;
                }
            }
    
            if (timeOutCheck <= 50_000_000) {
                answer.append("Terminates");
            } else {
                answer.append("Loops")
                        .append(" ")
                        .append(pair[maxIdx])
                        .append(" ")
                        .append(maxIdx);
            }
            answer.append("\n");
        }
    
        static void print() throws IOException {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            bw.write(String.valueOf(answer));
            bw.close();
        }
    }

    주요 개념

    • 시뮬레이션

    • 구현

    • 스택

    풀이 과정

    • 먼저, 정수를 담는 하나의 배열(unsigned 8-bit 정수)에서 오버플로우,언더플로우가 발생할 경우 0~255 값이 유지되도록 한다.

    • 그리고 전처리 과정으로 Loop 짝을 구하도록 한 다음 테스트 케이스에 대해서 동작하도록 한다.

      • 이는 Stack 자료구조를 활용하여 짝을 구한다.







    - 컬렉션 아티클