728x90
반응형
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRFInKex8DFAUo
#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
반응형
'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글
백터에 같은 위치의 값 제거하기 (0) | 2020.09.26 |
---|---|
5653. [모의 SW 역량테스트] 줄기세포배양 (0) | 2020.09.23 |
프로그래머스 - 문자열 압축 (0) | 2020.09.11 |
3109 뱀 (0) | 2020.09.11 |
5656. [모의 SW 역량테스트] 벽돌 깨기 (0) | 2020.09.10 |
댓글