250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- code tree
- 모드코드
- 화성학응용
- 삼성기출
- 취준
- 코테
- 삼성SW Expert Academy
- 대중음악화성
- 드럼Tab악보
- 코드차용
- syncroom
- 음정이론
- mode chord
- 삼성전자
- ableton live 12
- SW 직군
- 코딩테스트
- 코드트리
- 모달진행
- DP
- 공대생 자소서
- 평행조
- 무료 악보 프로그램
- 마법사상어와 블리자드
- 음계구조
- 스케일분석
- 알고리즘
- Java
- 화음분석
- 음악작곡기초
Archives
- Today
- Total
Code Beat
[SWEA] 5648 (모의 SW 역량테스트) 원자 소멸 시뮬레이션 본문
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