본문 바로가기

짜잘한 기록

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

비트마스킹을 해볼까? 하고 잡은 문제이다. 제목이 길어서 뭔가 호기심이 생겼다.

문제는 비트연산을 많이 쓰는 구현이다.

메모리 구조를 한번에 입력받고, PC를 움직여 가면서 메모리 안의 명령어들을 실행하면 된다.

 

크게 삽질을 했던게 3가지 정도 있다.

첫번째로, 메모리를 한번에 받는다는 것. 왜 처음에 한 줄씩 입력받고 매 번 입력받은걸 처리한다고 생각했는지 모르겠다.

두번째, AC와 PC의 범위가 넘으면 리셋된다는 것. 처음엔 AC 범위 넘는것만 구현하고 아 왜 안되지... 이러고 있었는데 PC도 범위가 넘으면 0으로 초기화를 해 줘야 한다...

마지막. Bit 연산을 잘못 생각했다. 마지막 출력 단에서 AC의 값을 각 비트마다 계산해서 1이면 출력하려고 했는데, 마스킹 한 값이 배열 []연산처럼 그 값만 나오는것 처럼 작성했었다. 스윽 수정하니 잘 작동했다.

 

빡 구현 문제라서 그래도 좀 수월했다.


#include <iostream>
#include <cstring>
#include <string>
#include <fstream>

int strToBin(std::string s)
{
    int ret = 0;
    for (int i = 0; i < 8 ; i++)
    {
        if (s[7 - i] == '1')
            ret = ret | (1 << i);
    }
    return ret;
}

int main()
{
    int mem[32];
    memset(mem, 0, sizeof(mem));
    

    // std::ofstream fout("6568.out");
    
    // for(int i = 0; i < 32 ; i++)
    // {
    //     std::string tmp;
    //     std::cin >> tmp;
    //     int memEnt = strToBin(tmp);
    //     mem[i] = memEnt;
    // }
    int AC = 0;
    int PC = 0; 
    bool first = 1;
    while(!std::cin.eof())
    {
        if (first)
        {
            for(int i = 0; i < 32 ; i++)
            {
                std::string tmp;
                std::cin >> tmp;
                int memEnt = strToBin(tmp);
                mem[i] = memEnt;
            }
            first = false;
        }
        // std::string tmp;
        // std::cin >> tmp;
        // int inst = strToBin(tmp);
        // std::cout << inst;
        int inst = mem[PC];
        PC++;
        PC = PC % 32;
        int op = inst & 0b11100000;
        int opnd = inst & 0b00011111;
        if (op == 0b00000000) // STA x
        {
            mem[opnd] = AC;
        }
        else if (op == 0b00100000)
        {
            AC = mem[opnd];
        }
        else if (op == 0b01000000)
        {
            if (AC == 0)
                PC = opnd;
        }
        else if (op == 0b01100000)
        {
            continue;
        }
        else if (op == 0b10000000)
        {
            AC--;
            AC = AC % 256;
        }
        else if (op == 0b10100000)
        {
            AC++;
            AC = AC % 256;
        }
        else if (op == 0b11000000)
        {
            PC = opnd;
        }
        else if (op == 0b11100000)
        {
            for (int i = 7; i >= 0; i--)
            {
                // std::cout << (1 << i) << '\n';
                if ((AC & (1 << i)))
                    std::cout << 1;
                else
                    std::cout << 0;
            }
            std::cout << '\n';
            AC = 0;
            PC = 0;
            first = true;
        }
    }
    
    
}

 

최근 OS를 다시 보고 있는데, 그 와중에 이런 문제를 잡아서 신기하다. 컴구때 기억도 새록새록 나는것 같고...

이제부턴 비트마스킹 문제를 슬쩍 보려 한다. 후후후...

 

오늘도 평온한 하루가 되길. 슨민.

'짜잘한 기록' 카테고리의 다른 글

백준 11578 팀원 모집  (0) 2021.10.20
백준 13701 중복 제거  (0) 2021.10.19
백준 1126 같은 탑  (0) 2021.10.16
백준 2618 경찰차  (0) 2021.10.15
백준 2098 외판원 순회  (0) 2021.10.14