๐Ÿ“ Coding Test Study/Algorithm Problem

[Baekjoon][C++] 14500๋ฒˆ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ๋ฌธ์ œ์„ค๋ช… ๋ฐ ์ฝ”๋“œ

ibelieveinme 2021. 3. 6. 22:33
728x90
 

14500๋ฒˆ: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€

www.acmicpc.net

โ–ท ๋ฌธ์ œ์„ค๋ช…

NxM ํฌ๊ธฐ์˜ ์ข…์ด ์œ„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ ํ•˜๋‚˜ ๋†“์•„์„œ ๋†“์ธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜์˜ ํ•ฉ์„ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ๋ฌธ์ œ

N, M์˜ ๋ฒ”์œ„๋Š” 4 <= N, M <= 500 ์ด๋‹ค.

 

โ–ท ๋ฌธ์ œํ’€์ด

ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ ํšŒ์ „ ๋ฐ ๋Œ€์นญํ•˜์—ฌ ๋ฏธ๋ฆฌ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„(19๊ฐœ)ํ•˜๊ณ  NxM ์ข…์ด ์œ„์— ๋†“๊ณ  MAX ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

 

์ฆ‰,

(0,0) (0,1) (0,2) (0,3)

=> {{0,0}, {0,1}, {0,2}, {0,3}}

 

1) ์œ„์™€ ๊ฐ™์ด ๋†“์„ ์ˆ˜ ์žˆ๋Š” ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ 3์ฐจ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ํšŒ์ „ ๋ฐ ๋Œ€์นญ์„ ํฌํ•จํ•ด์„œ ์ด 19๊ฐœ

2) NxM ์ข…์ด์˜ 0,0 ์ขŒํ‘œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

3) ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•œ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ 19๊ฐœ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ NxM ์ข…์ด์— ๋†“๋Š”๋‹ค.

4) ์ด ๋•Œ, ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ ํ•œ ์ขŒํ‘œ์”ฉ ๋†“์œผ๋ฉด์„œ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๊ฐ€ ๋†“์ธ ๊ณณ์ด ํ–‰๋ ฌ์˜ x, y๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

5) ๋ฒ”์œ„ ์•ˆ์— ์žˆ์œผ๋ฉด ํ•œ ์ขŒํ‘œ์”ฉ SUM๊ฐ’์— ์ €์žฅํ•œ๋‹ค.

6) 4์นธ ๋ชจ๋‘ ํ–‰๋ ฌ์— ๋†“์•„์ง€๋ฉด SUM๊ฐ’๊ณผ MAX๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

6) ๋งˆ์ง€๋ง‰ ์ขŒํ‘œ๊นŒ์ง€ ํ™•์ธํ•˜๊ณ  ์ตœ์ข… MAX๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


โ–ท ์‹œ๊ฐ„๋ณต์žก๋„

ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋Š” ์ด 19๊ฐ€์ง€๊ฐ€ ์žˆ๊ณ , ํ•˜๋‚˜์˜ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋‹น ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜๋Š” ์•ฝ O(NM)๊ฐ€์ง€์ด๋‹ค.

์ฆ‰, NxM ์ข…์ด์— 19๊ฐœ์˜ ๋„ํ˜•์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” O(19*N*M) = O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

โ–ท ์ •๋‹ต์ฝ”๋“œ

#include <iostream>
#include<algorithm>
#define SIZE 500
using namespace std;

void Input();
void StartCalculation(int arr[SIZE][SIZE], int N, int M);

int main() {
	Input();
}

void Input() {
	int N, M;
	int arr[SIZE][SIZE] = { {0,0}, };

	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> arr[i][j];
		}
	}
	StartCalculation(arr, N, M);
}

void StartCalculation(int arr[SIZE][SIZE], int N, int M) {
	int tetro[19][4][2] = {
		// โ–กโ–กโ–กโ–ก
		{{0,0}, {0,1}, {0,2}, {0,3}},
		{{0,0}, {1,0}, {2,0}, {3,0}},
		// โ–กโ–ก
		// โ–กโ–ก
		{{0,0}, {1,0}, {0,1}, {1,1}}, 
		// โ–ก
		// โ–ก
		// โ–กโ–ก
		{{0,0}, {1,0}, {2,0}, {2,1}},
		{{0,0}, {1,0}, {0,1}, {0,2}},
		{{0,0}, {0,1}, {1,1}, {2,1}},
		{{0,0}, {1,0}, {2,0}, {2,-1}},
		{{0,0}, {0,1}, {0,2}, {-1,2}},
		{{0,0}, {1,0}, {2,0}, {0,1}},
		{{0,0}, {1,0}, {1,1}, {1,2}},
		{{0,0}, {0,1}, {0,2}, {1,2}},
		// โ–ก
		// โ–กโ–ก
		//  โ–ก
		{{0,0}, {1,0}, {1,1}, {2,1}},
		{{0,0}, {1,0}, {-1,1} , {0,1}},
		{{0,0}, {0,1}, {-1,1}, {-1,2}},
		{{0,0}, {0,1}, {1,1}, {1,2}},
		// โ–กโ–กโ–ก
		//  โ–ก
		{{0,0}, {0,1}, {0,2}, {1,1}},
		{{0,0}, {1,-1}, {1,0}, {1,1}},
		{{0,0}, {1,0}, {2,0}, {1,1}},
		{{0,0}, {1,0}, {2,0}, {1,-1}},
	};

	int answer = 0;
	for (int i = 0; i < N; i++) {//Nํ–‰
		for (int j = 0; j < M; j++) {//M์—ด
			for (int k = 0; k < 19; k++) {//๋ชจ์–‘ 19๊ฐœ ํ•˜๋‚˜์”ฉ ์„ ํƒํ•˜๊ธฐ
				int sum = 0;
				for (int l = 0; l < 4; l++) {//์„ ํƒํ•œ ๋ธ”๋Ÿญ๋ชจ์–‘ ํ•œ ์นธ์”ฉ ๊ฐ’ ๋”ํ•˜๊ธฐ
					int x = i + tetro[k][l][0];//ํ˜„์žฌ ์œ„์น˜์˜ x๊ฐ’ + k๋ชจ์–‘ 1์นธ์— ํ•ด๋‹นํ•˜๋Š” x๊ฐ’
					int y = j + tetro[k][l][1];//ํ˜„์žฌ ์œ„์น˜์˜ y๊ฐ’ + k๋ชจ์–‘ 1์นธ์— ํ•ด๋‹นํ•˜๋Š” y๊ฐ’
					if (0 <= x && N > x && 0 <= y && M > y) {//x,y๊ฐ’์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ
						sum += arr[x][y];//๋ฒ”์œ„์•ˆ์— ์žˆ์œผ๋ฉด sum๊ฐ’์œผ๋กœ ๋”ํ•˜๊ธฐ
					}
					else {//๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฒ„๋ฆฌ๋ฉด ๋ฐ”๋กœ ๋‚˜์™€์„œ ๋‹ค์Œ ๋ชจ์–‘ ํƒ์ƒ‰ํ•˜๊ธฐ
						break; 
					}
				}
				answer = max(answer, sum);//์ •์ƒ์ ์œผ๋กœ ๋”ํ•œ ๊ฐ’์ด ํ˜„์žฌ๊นŒ์ง€์˜ max ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๊ฐ’ ์ฒด์ธ์ง€
			}
		}
	}
	cout << answer << '\n';
}
728x90