https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl
조건대로 시뮬레이션을 해주면 된다.
이동할 때, 이동한 개체와 앞으로 이동해야 하는 개체가 겹치는 처리를 하기 위해서 임시적으로 이차원 배열을 만들어서 이동할 때 사용했다.
이동 결과를 임시 배열에 저장해두고, 여러 개체가 들어있는 좌표를 처리해준 이후에, 원래의 map에 옮겨준다.
낚시왕, 나무재테크 문제와 비슷한 방식이 사용되었다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include<iostream> #include<vector> #include<algorithm> using namespace std; const int dr[4] = { -1,1,0,0 }; const int dc[4] = { 0,0,-1,1 }; struct Info { int num; int dir; //상하좌우 1234 }; vector<Info> map[101][101]; vector<Info> tmp[101][101]; //이동할 때 사용 int n, Time, k; bool cmp(Info a, Info b) { return a.num > b.num; } int main(void) { //setbuf(stdout, NULL); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin >> T; for (int t = 1; t <= T; t++) { cin >> n >> Time >> k; for (int i = 0; i < k; i++) { int r, c, cnt, dir; cin >> r >> c >> cnt >> dir; map[r][c].push_back({ cnt, dir }); } for (int i = 0; i < Time; i++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { //이동 if (map[i][j].size() != 0) { Info cur = map[i][j][0]; int nr = i + dr[cur.dir - 1]; int nc = j + dc[cur.dir - 1]; if (nr == 0) { cur.dir = 2; cur.num /= 2; } else if (nr == n - 1) { cur.dir = 1; cur.num /= 2; } else if (nc == 0) { cur.dir = 4; cur.num /= 2; } else if (nc == n - 1) { cur.dir = 3; cur.num /= 2; } tmp[nr][nc].push_back({ cur.num, cur.dir }); map[i][j].clear(); //초기화 } } } //tmp에 들어있는 복수개 병합, 방향 설정 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (tmp[i][j].size() >= 2) { sort(tmp[i][j].begin(), tmp[i][j].end(), cmp); //개체수 내림차순 int Sum = 0; for (int k = 0; k < tmp[i][j].size(); k++) Sum += tmp[i][j][k].num; Info merged = { Sum, tmp[i][j][0].dir }; //가장 많이 가진 것의 방향 map[i][j].push_back(merged); tmp[i][j].clear(); //초기화 } else if (tmp[i][j].size() == 1) { map[i][j].push_back(tmp[i][j][0]); tmp[i][j].clear(); //초기화 } } } } int ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (map[i][j].size() != 0) { ans += map[i][j][0].num; map[i][j].clear(); //초기화 } cout << "#" << t << ' ' << ans << '\n'; } return 0; } | cs |
'알고리즘 문제 풀이 > 삼성 SW Expert Academy' 카테고리의 다른 글
SWEA 5653:줄기세포배양 (C++) (0) | 2019.10.16 |
---|---|
SWEA 2117: 홈 방범 서비스 (C++) (0) | 2019.10.16 |
SWEA 2383: 점심 식사시간 (C++) (0) | 2019.10.15 |
SWEA 4014: 활주로 건설 (C++) (0) | 2019.10.15 |
SWEA 2105: 디저트 카페 (C++) (0) | 2019.10.15 |