5648. [모의 SW 역량테스트] 원자 소멸 시뮬레이션
본문 바로가기
알고리즘 모음집/New 알고리즘

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

by KyeongMin 2020. 9. 23.
728x90
반응형

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRFInKex8DFAUo

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int N, ret;// 원자수, 결과값
int dy[] = { 1,-1,0,0 };
int dx[] = { 0,0,-1,1 };
struct Data {
	int y, x, dir, energy;
};
//int board[4005][4005];
vector<Data>board;
void init() {
	N = ret = 0;
	board.clear();
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		int x, y, dir, energy;
		scanf("%d %d %d %d", &x, &y, &dir, &energy);
		board.push_back({ y * 2, x * 2, dir, energy });
	}
}
bool cmp(Data a, Data b) {
	if (a.y == b.y)return a.x < b.x;
	return a.y < b.y;
}
void play() {
	int time = 4001;
	while (1) {//끝날 때 까지 반복
		for (int i = 0; i < board.size(); i++) {//보드에 있는 원자수 만큼 돌리기
			if (board.size() == 0)break;//없으면 탈출
			Data n;
			board[i].y = board[i].y + dy[board[i].dir];//이동 시키기
			board[i].x = board[i].x + dx[board[i].dir];
			if (board[i].y ==-2001 || board[i].x ==-2001 || board[i].y==2001 || board[i].x ==2001) {//범위를 넘어가는 경우 없애기
				board.erase(board.begin() + i);
				i--;
			}
		}
		//같은 위치 원자 확인
		sort(board.begin(), board.end(), cmp);//일단 정렬
		//for (int i = 0; i < board.size() - 1; i++) {
		//	if (board.size() == 0)break;
		//	int cnt = 1;
		//	int j = i + 1;
		//	while (board[i].x == board[j].x&&board[i].y == board[j].y) {//같은 위치인경우
		//		cnt++;
		//		ret += board[j].energy;//에너지 방출
		//		board.erase(board.begin() + j);//제거
		//		if (board.size() == 1)break;
		//		j--;
		//		if (i == j)break;
		//	}
		//	if (cnt >= 2) {
		//		ret += board[i].energy;//에너지 방출 포함
		//		board.erase(board.begin() + i);
		//		i--;
		//	}
		//}

		for (int i = 0; i < board.size(); i++) {
			int c = 0;
			while (board.size() >= 2 && i < board.size() - 1) {
				if (board[i].y == board[i + 1].y && board[i].x == board[i + 1].x) {
					c = 1;
					ret += board[i + 1].energy;
					board.erase(board.begin() + i + 1);
				}
				else break;
			}
			if (c == 1) {
				ret += board[i].energy;
				board.erase(board.begin() + i);
				i--;
			}
		}
		if (board.size() == 0) break;//종료 시점
	}
}
int main(int argc, char** argv)
{
	int test_case;
	int T;

	scanf("%d", &T);
	for (test_case = 1; test_case <= T; ++test_case)
	{
		init();
		play();
		printf("#%d %d\n", test_case, ret);

	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

이문제는 좀 잘못 구현을 하면 시간초과가 납니다. 그러니 조건을 잘 생각해야하고 0.5초 개념이 있기 때문에 그것도 

잘 처리 해줘야 성공합니다.

728x90
반응형

댓글