코테 노트/SWEA

SWEA5648 [모의 SW 역량테스트] 원자 소멸 시뮬레이션 C++

화요밍 2021. 10. 23. 00:56
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRFInKex8DFAUo&categoryId=AWXRFInKex8DFAUo&categoryType=CODE&problemTitle=모의&orderBy=PASS_RATE&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=2&&&&&&&&& 

 

최종 코드

 

GitHub - hwayeon351/SWEA-Algorithms: SWEA 알고리즘 소스 코드 모음

SWEA 알고리즘 소스 코드 모음. Contribute to hwayeon351/SWEA-Algorithms development by creating an account on GitHub.

github.com

//
//  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
반응형