본문 바로가기
CS/알고리즘 & 문제풀이

[Python] 백준 6568 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다

by mintropy 2021. 9. 19.

문제 링크 : https://www.acmicpc.net/problem/6568

 

6568번: 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다

그래서 여러분도 크리스마스날 심심해서 컴퓨터를 하나 만들었다. 이 컴퓨터는 아주 적은 수의 명령어를 사용하는 하나의 프로세서, 32바이트 메모리, 8비트짜리 가산기, 5비트짜리 프로그램 카

www.acmicpc.net

 

1. 접근 방법

처음 문제를 읽고 잘 이해하지 못해 많이 당황했다.

이번 문제는 잘 읽고 이해하는 것부터 시작했다. 컴퓨터의 이론과도 연관 있는 것 같아, 관련한 내용을 공부하면 좋을 것 같다.

 

 

2. 해결 코드

  • python 코드
import sys
input = sys.stdin.readline

while True:
    try:
        memory = [0] * 32
        # 메모리에 먼저 저장
        for i in range(32):
            memory[i] = int(input().strip(), 2)
        # 가산기, pc
        adder = 0
        pc = 0
        while True:
            cmd = memory[pc] // 32
            num = memory[pc] % 32
            pc = (pc + 1) % 32
            # 각 명령어
            # 메모리주소의 주소에 값 저장
            if cmd == 0:
                memory[num] = adder
            # 메모리 주소의 값 가져오기
            elif cmd == 1:
                adder = memory[num]
            # 가산기 값이 0이면 pc 바꾸기
            elif cmd == 2:
                if not adder:
                    pc = num
            # 아무 행동 ㄴㄴ
            elif cmd == 3:
                continue
            # 가산기 값 '1' 감소
            elif cmd == 4:
                adder = (adder - 1) % 256
            # 가산기 값 '1' 증가
            elif cmd == 5:
                adder = (adder + 1) % 256
            # pc값 변경
            elif cmd == 6:
                pc = num
            # 프로그램 종료
            elif cmd == 7:
                break
        print(bin(adder)[2:].zfill(8))
    except:
        break
  • 풀이 과정

입력을 32줄 받으며 메모리에 저장을 하고, EOF면 종료한다. 따로 EOF만 선언하지 않아도 상관없어서 모든 예외에 종료하도록 했다.

처음 pc값과 가산기 값을 지정하고, pc가 가리키는 메모리의 값을 3비트, 5비트를 각각 나누어뒀다. 메모리를 받을 때, 10진수로 받았기 때문에 32로 나눈 나머지와 몫으로 그 값을 지정했다.

문제에 따라 진행 전 pc값을 1증가시키고, 나머지는 각 명령에 따라 진행했다.

 

 

3. 생각 정리

문제를 잘 읽는 것도 중요하지만, 그만큼 배경지식도 중요한 것 같다.

그리고 동시에 이런 경험이 하나둘 쌓여 더 실력이 늘어나는 것 같다.

 

댓글