굥뷰를 햡시댜

[모의 SW 역량테스트 - 2382] 미생물 격리 본문

알고리즘 문제 풀이/SW Expert Academy 문제 풀이

[모의 SW 역량테스트 - 2382] 미생물 격리

GodZ 2019. 8. 9. 23:59

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl&categoryId=AV597vbqAH0DFAVl&categoryType=CODE

 

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;
}

 

Comments