굥뷰를 햡시댜
[모의 SW 역량테스트 - 2382] 미생물 격리 본문
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
로그인을 한 뒤 위 링크로 들어가면 문제를 볼 수 있습니다.
구현 난이도가 쉬운 시뮬레이션 문제.
하지만 디버깅은 최악;;(케이스의 반복 횟수가 너무 많음)
그래서 디버깅을 따로 하지 않고 머릿속으로 코드를 시뮬레이션하면서 했다.
시간은 딴짓 + 문제 풀이 해서 3시간 정도 걸렸다.
- 풀이 방법
1. 미생물을 나타내는 구조체(좌표 값, 미생물 군집 내 미생물 수, 이동방향)를 만들어준 뒤 입력을 받는다.
2. 문제의 조건에 따라 방향에 맞게 한 칸씩 이동을 해주고 이동한 칸이 경계일 때 절반을 나눠준다.
3. 한 번의 이동이 끝나고 같은 위치에 있는 미생물 군집의 수를 더해주기 위해 2중 for문을 선언해줬다.
4. 이동이 완전히 끝난 뒤 남은 미생물 군집의 수를 더했다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct CELL {
int y, x, num, dir;
};
int t, n, m, k, res;
int main(void) {
scanf("%d", &t);
for (int tc = 1; tc <= t; tc++) {
CELL cell[1000];
res = 0;
scanf("%d %d %d", &n, &m, &k);
for (int y, x, num, dir, i = 0; i < k; i++) {
scanf("%d %d %d %d", &y, &x, &num, &dir);
cell[i] = { y,x,num,dir };
}
while (1) {
m -= 1;
if (m < 0) break;
//모든 미생물 군집 이동
for (int i = 0; i < k; i++) {
if (cell[i].num == 0) continue;
//상
if (cell[i].dir == 1) {
if (cell[i].y - 1 >= 0) {
cell[i].y -= 1;
if (cell[i].y == 0) {
cell[i].num /= 2;
}
}
else {
cell[i].dir = 2;
cell[i].y += 1;
}
}
//하
else if (cell[i].dir == 2) {
if (cell[i].y + 1 <= n - 1) {
cell[i].y += 1;
if (cell[i].y == n - 1) {
cell[i].num /= 2;
}
}
else {
cell[i].dir = 1;
cell[i].y -= 1;
}
}
//좌
else if (cell[i].dir == 3) {
if (cell[i].x - 1 >= 0) {
cell[i].x -= 1;
if (cell[i].x == 0) {
cell[i].num /= 2;
}
}
else {
cell[i].dir = 4;
cell[i].x += 1;
}
}
//우
else if (cell[i].dir == 4) {
if (cell[i].x + 1 <= n - 1) {
cell[i].x += 1;
if (cell[i].x == n - 1) {
cell[i].num /= 2;
}
}
else {
cell[i].dir = 3;
cell[i].x -= 1;
}
}
}
for (int i = 0; i < k - 1; i++) {
if (cell[i].num == 0) continue;
int temp_sum = cell[i].num;
for (int j = i + 1; j < k; j++) {
if (cell[j].num == 0) continue;
if (cell[i].y == cell[j].y && cell[i].x == cell[j].x) {
if (cell[i].num < cell[j].num) {
cell[i].dir = cell[j].dir;
cell[i].num = cell[j].num;
}
temp_sum += cell[j].num;
cell[j].num = 0;
}
}
cell[i].num = temp_sum;
}
}
for (int i = 0; i < k; i++) {
if (cell[i].num != 0) {
res += cell[i].num;
}
}
printf("#%d %d\n", tc, res);
}
getchar();
getchar();
return 0;
}
'알고리즘 문제 풀이 > SW Expert Academy 문제 풀이' 카테고리의 다른 글
[모의 SW 역량테스트 - 4008] 숫자 만들기 (0) | 2019.08.31 |
---|---|
[모의 SW 역량테스트 - 2105] 디저트 카페 (0) | 2019.08.19 |
[모의 SW 역량테스트 - 1953] 탈주범 검거 (0) | 2019.08.09 |
[모의 SW 역량테스트 - 1949] 등산로 조성 (0) | 2019.08.07 |
Comments