Code Beat

[SWEA] 5648 (모의 SW 역량테스트) 원자 소멸 시뮬레이션 본문

Code/SWEA

[SWEA] 5648 (모의 SW 역량테스트) 원자 소멸 시뮬레이션

코-빗 2024. 3. 4. 22:34
728x90

원자력 발전소라는 스토리를 가져왔지만

좌표위의 점에 대한 움직임을 정해진 대로 수행하는 시뮬레이션 문제이다.

 

산문형식으로 풀어쓰여진 내용을 논리적으로 정리하고

조건을 빠트리지 않는 함수들을 구현한 뒤,

정해진 순서에 맞게 움직이는 문제다.

 

이런 문제는 코딩 전 조건들을 옮겨적어 정리하고 고민하는 시간이 길어야한다.

중간에 엣지케이스를 찾아서 디버깅하는 것이 엄청 오래걸리고 헷갈리기 때문이다.

물론 한 번에 완전한 코드를 짠다는 건 더 어렵지만 오히려 큰 로직을 틀리더라도

작은 조건을 빠트리지 말자.

 

아래는 문제를 푼 후 조금 다듬은 코드이다. 

#include<iostream>
#include<vector>
 
using namespace std;
 
struct Atom {
    int i;
    int j;
    int dir;
    int k;
 
    Atom() {}
    Atom(int i, int j, int dir, int k) {
        this->i = i;
        this->j = j;
        this->dir = dir;
        this->k = k;
    }
};
 
int board[4001][4001];
vector<Atom> atoms;
int di[4] = { 1, -1, 0, 0 };
int dj[4] = { 0, 0, -1, 1 };
int N;
int answer;
 
void move() {
    for (int index = 0; index < N; index++) {
        Atom now = atoms[index];
        int i = now.i;
        int j = now.j;
         
        int dir = now.dir;
        int k = now.k;
        board[i][j]--;
        int ni = i + di[dir];
        int nj = j + dj[dir];
        if (ni < 0 || nj < 0 || ni > 4000 || nj > 4000) {
            atoms.erase(atoms.begin() + index);
            index--; N--;
            continue;
        }
 
 
        board[ni][nj]++;
        atoms[index] = Atom(ni, nj, dir, k);
    }
}
 
void crash() {
    vector< pair<int, int> > er_list;
    for (int index = 0; index < N; index++) {
        Atom now = atoms[index];
        int i = now.i;
        int j = now.j;
        int dir = now.dir;
        int k = now.k;
        int b_size = board[i][j];
        if (b_size == 1) continue;
        answer += k;
        atoms.erase(atoms.begin() + index);
        er_list.push_back(make_pair(i, j));
        index--; N--;
    }
    int size = er_list.size();
    for (int index = 0; index < size; index++) {
        int i = er_list[index].first;
        int j = er_list[index].second;
        board[i][j] = 0;
    }
}
 
int main(int argc, char** argv)
{
    int test_case;
    int T;
    cin >> T;
 
    for (test_case = 1; test_case <= T; ++test_case)
    {
        answer = 0;
        cin >> N;
 
        for (int index = 0; index < N; index++) {
            int i, j, dir, k;
            cin >> i >> j >> dir >> k;
            i *= 2;
            j *= 2;
            i += 2000;
            j += 2000;
            board[j][i] = 1;
            atoms.push_back(Atom(j, i, dir, k));
        }
 
        while (!atoms.empty()) {
            move();
            crash();
        }
 
        cout << "#" << test_case << " " << answer << "\n";
 
        atoms.clear();
    }
    return 0;
}
728x90

'Code > SWEA' 카테고리의 다른 글

숫자 만들기  (0) 2024.03.24