728x90
반응형
최종 코드
//
// main.cpp
// SWEA5648
//
// Created by Hwayeon on 2021/10/21.
//
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
int N;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int visit[4001][4001] = {0, };
struct Atom{
bool gone = false;
int x = -1;
int y = -1;
int d = -1;
int K = 0;
};
vector<Atom> atoms;
int energy = 0;
void move_atom(){
while(true){
bool check = true;
for(int i=0; i<atoms.size(); i++){
if(!atoms[i].gone){
check = false;
break;
}
}
if(check) break;
for(int i=0; i<atoms.size(); i++){
int nx = atoms[i].x + dx[atoms[i].d];
int ny = atoms[i].y + dy[atoms[i].d];
if(nx < 0 || nx > 4000 || ny < 0 || ny > 4000)
atoms[i].gone = true;
else if(!atoms[i].gone){
visit[ny][nx] ++;
atoms[i].x = nx;
atoms[i].y = ny;
}
}
for(int i=0; i<atoms.size(); i++){
if(visit[atoms[i].y][atoms[i].x] > 1) {
for(int j=0; j<atoms.size(); j++){
if(!atoms[j].gone && atoms[i].x == atoms[j].x && atoms[i].y == atoms[j].y){
energy += atoms[j].K;
atoms[j].gone = true;
}
}
}
visit[atoms[i].y][atoms[i].x] = 0;
}
}
}
int main(int argc, const char * argv[]) {
int test_case;
int T;
cin >> T;
for(test_case=1; test_case<=T; ++test_case){
energy = 0;
atoms.clear();
cin >> N;
for(int i=0; i<N; i++){
Atom atom;
cin >> atom.x >> atom.y >> atom.d >> atom.K;
atom.x = 2*(atom.x+1000);
atom.y = 2*(atom.y+1000);
atom.gone = false;
atoms.push_back(atom);
}
move_atom();
cout << "#" << test_case << " " << energy << endl;
}
return 0;
}
풀이 과정
#include <iostream>
#include <vector>
using namespace std;
int N;
//0-하, 1-상, 2-좌, 3-우
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int visit[4001][4001] = {0, };
struct Atom{
//gone = true -> 소멸된 상태, gone = false -> 소멸되지 않은 상태
bool gone = false;
int x = -1;
int y = -1;
//방향
int d = -1;
//에너지
int K = 0;
};
vector<Atom> atoms;
int energy = 0;
void move_atom(){
while(true){
//1. 모든 원자가 소멸되었는지 체크
bool check = true;
for(int i=0; i<atoms.size(); i++){
if(!atoms[i].gone){
check = false;
break;
}
}
//모든 원자가 소멸된 경우, 함수를 종료한다
if(check) break;
//2. 원자 이동 - 한 칸 이동한다(0.5초)
for(int i=0; i<atoms.size(); i++){
int nx = atoms[i].x + dx[atoms[i].d];
int ny = atoms[i].y + dy[atoms[i].d];
//다른 원자랑 더이상 만나지 않는 경우, 해당 원자를 소멸 상태로 만든다
if(nx < 0 || nx > 4000 || ny < 0 || ny > 4000)
atoms[i].gone = true;
//소멸된 원자가 아닌 경우, 원자를 이동시킨다
else if(!atoms[i].gone){
visit[ny][nx] ++;
atoms[i].x = nx;
atoms[i].y = ny;
}
}
//3. 부딪힌 원자를 체크한다
for(int i=0; i<atoms.size(); i++){
//해당 칸에 2개 이상의 원자가 있는 경우
if(visit[atoms[i].y][atoms[i].x] > 1) {
//해당 칸에 있는 원자들을 소멸시킨다
for(int j=0; j<atoms.size(); j++){
if(!atoms[j].gone && atoms[i].x == atoms[j].x && atoms[i].y == atoms[j].y){
energy += atoms[j].K;
atoms[j].gone = true;
}
}
}
//visit을 0으로 바꿔준다
visit[atoms[i].y][atoms[i].x] = 0;
}
}
}
int main(int argc, const char * argv[]) {
int test_case;
int T;
cin >> T;
for(test_case=1; test_case<=T; ++test_case){
//초기화
energy = 0;
atoms.clear();
cin >> N;
for(int i=0; i<N; i++){
Atom atom;
cin >> atom.x >> atom.y >> atom.d >> atom.K;
//0.5초에 한 칸씩 움직이는 시뮬레이션을 위해 위치를 2배로 조정한다
atom.x = 2*(atom.x+1000);
atom.y = 2*(atom.y+1000);
atom.gone = false;
atoms.push_back(atom);
}
move_atom();
cout << "#" << test_case << " " << energy << endl;
}
return 0;
}
728x90
반응형
'코테 노트 > SWEA' 카테고리의 다른 글
SWEA 1949 등산로 조정 C++ (0) | 2022.04.30 |
---|---|
SWEA 2117 [모의 SW 역량테스트] 홈 방범 서비스 C++ (0) | 2021.10.21 |
SWEA5644 [모의 SW 역량테스트] 무선 충전 C++ (0) | 2021.10.21 |
SWEA [모의 SW 역량테스트] 점심 식사시간 C++ (0) | 2021.10.20 |
SWEA2477 [모의 SW 역량테스트] 차량 정비소 C++ (0) | 2021.10.19 |