๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][BAEKJOON][๋ธŒ๋ฃจํŠธํฌ์Šค] 3085๋ฒˆ ์‚ฌํƒ• ๊ฒŒ์ž„

ibelieveinme 2021. 9. 21. 20:00
728x90

[๋ฌธ์ œ]

 

3085๋ฒˆ: ์‚ฌํƒ• ๊ฒŒ์ž„

์˜ˆ์ œ 3์˜ ๊ฒฝ์šฐ 4๋ฒˆ ํ–‰์˜ Y์™€ C๋ฅผ ๋ฐ”๊พธ๋ฉด ์‚ฌํƒ• ๋„ค ๊ฐœ๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค.

www.acmicpc.net

 

[๋ฌธ์ œ์„ค๋ช…]
์ธ์ ‘ํ•œ ๋‘ ์นธ์„ ๊ณจ๋ผ์„œ  ์‚ฌํƒ•์„ ๊ตํ™˜ํ•œ ํ›„, ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ถ€๋ถ„(ํ–‰ ๋˜๋Š” ์—ด)์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

[๋ฌธ์ œํ’€์ด]
์ด ๋ฌธ์ œ์˜ ํ•จ์ •์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰๊น”์˜ ์ธ์ ‘ํ•œ ๋‘ ์นธ์ด ์•„๋‹Œ ๊ฑ ์ธ์ ‘ํ•œ ๋‘ ์นธ์ด๋ผ๋Š” ์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค.
PPPP ์ฒ˜๋Ÿผ ๊ตํ™˜ํ•˜์ง€ ์•Š์„ ๋•Œ ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ถ€๋ถ„์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‚˜๋Š” ์ธ์ ‘ํ•œ ๋‘ ์นธ์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด int dir[2][2] = { {0,1},{1,0} } ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฉํ–ฅํ‚ค ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  2์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•ด์คฌ๋‹ค.(brute force) 

for (int i = 0; i < n; i++) {
	for (int j = 0; j < n-1; j++) {
	}
}


๊ทธ ๋‹ค์Œ ํƒ์ƒ‰๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1) (์‚ฌํƒ•์˜ ์ƒ‰์ด ๋‹ค๋ฅธ) ์ธ์ ‘ํ•œ ๋‘ ์นธ์„ ๊ณ ๋ฅธ๋‹ค.

for (int d = 0; d < 2; d++) {
	int next_x = i + dir[d][0];
	int next_y = j + dir[d][1];
}


2) ๊ณ ๋ฅธ ์นธ์— ๋“ค์–ด์žˆ๋Š” ์‚ฌํƒ•์„ ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค.

swap(map[i][j], map[next_x][next_y]);


3) ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ถ€๋ถ„(ํ–‰ ๋˜๋Š” ์—ด)์„ ์ฐพ๋Š”๋‹ค.
2์ค‘ for๋ฌธ ๋‘๊ฐœ๋กœ ํ–‰ ๊ณ„์‚ฐ๊ณผ ์—ด ๊ณ„์‚ฐ์„ ๋‘˜๋‹ค ํ•ด์คฌ๋‹ค.

๊ฐ ํ–‰์„ ๊ณ„์‚ฐํ•œ ๋ถ€๋ถ„์„ ๋ณด๋ฉด,
๊ฐ ํ–‰์˜ ์ฒซ๋ฒˆ์งธ ์ปฌ๋Ÿฌ(0์—ด)๋ฅผ ๋น„๊ต ์ปฌ๋Ÿฌ๋กœ ๋‘๊ณ , ์˜†์˜ ์ปฌ๋Ÿฌ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ปฌ๋Ÿฌ ๊ฐœ์ˆ˜(count)๋ฅผ 1 ๋Š˜๋ ค์คฌ๋‹ค.

count = 1;
color = map[i][0];
if (map[i][j] == color) count++;


๋งŒ์•ฝ ์˜†์˜ ์ปฌ๋Ÿฌ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ํ˜„์žฌ ์ปฌ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋น„๊ต์ปฌ๋Ÿฌ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์ปฌ๋Ÿฌ ๊ฐœ์ˆ˜๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ  ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ count์™€ ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ตํ•ด์„œ ๊ฐฑ์‹ ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

else {
	color = map[i][j];
	if (candy_max < count) candy_max = count;
	count = 1;
}


๊ทธ๋ฆฌ๊ณ  ํ•œ ํ–‰์ด ๋๋‚˜๋Š” ์ง€์ ์— ์‚ฌํƒ• ์ƒ‰๊น”์ด ๊ฐ™์œผ๋ฉด ์ตœ๋Œ€๊ฐ’ ๊ฐฑ์‹ ๋ถ€๋ถ„ ์ง„์ž…์„ ๋ชปํ•˜๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๋ ค๊ตฌ ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ ๋” ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ต๊ฐฑ์‹ ์คฌ๋‹ค.

if (candy_max < count) candy_max = count;


4) ๋‹ค์‹œ ์‚ฌํƒ•์„ ๊ตํ™˜ํ•ด์„œ ์›๋ž˜๋Œ€๋กœ ๋ฐ”๊ฟ”๋†“๊ณ  ์žฌํƒ์ƒ‰ํ•˜๋ฉฐ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

swap(map[i][j], map[next_x][next_y]);


5) ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

cout << candy_max << "\n";


[์ฝ”๋“œ]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void ChooseCandy(char **map, int n);
void CountCandy(char **map, int n);

int candy_max;

int main() {
	int n = 0;//๋งต ํฌ๊ธฐ. 3 ≤ n ≤ 50
	cin >> n;

	//๋งต ๋™์ ํ• ๋‹น
	char **map = new char*[n];
	for (int i = 0; i < n; i++)
		map[i] = new char[n];

	//์‚ฌํƒ•์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	ChooseCandy(map, n);
	cout << candy_max << "\n";
}

void ChooseCandy(char **map, int n) {
	int dir[2][2] = { {0,1},{1,0} };//ํ˜„์žฌ์นธ์˜ ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์„ ์„ ํƒํ•˜์—ฌ ์ƒ‰์ด ๋‹ค๋ฅธ์ง€ ํŒ๋‹จํ• ๊ฑฐ์•ผ.
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n-1; j++) {
			//1. (์‚ฌํƒ•์˜ ์ƒ‰์ด ๋‹ค๋ฅธ) ์ธ์ ‘ํ•œ ๋‘ ์นธ์„ ๊ณ ๋ฅธ๋‹ค.
			for (int d = 0; d < 2; d++) {
				int next_x = i + dir[d][0];
				int next_y = j + dir[d][1];
				if (next_x >= 0 && next_x < n && next_y >= 0 && next_y < n) {
					//2. ๊ณ ๋ฅธ ์นธ์— ๋“ค์–ด์žˆ๋Š” ์‚ฌํƒ•์„ ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค.
					swap(map[i][j], map[next_x][next_y]);
					//3. ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ถ€๋ถ„(ํ–‰ ๋˜๋Š” ์—ด)์„ ์ฐพ๋Š”๋‹ค.
					CountCandy(map, n);
					//4. ๋‹ค์‹œ ์‚ฌํƒ•์„ ๊ตํ™˜ํ•ด์„œ ์›๋ž˜๋Œ€๋กœ ๋ฐ”๊ฟ”๋†“๊ณ  ์žฌํƒ์ƒ‰ํ•˜๋ฉฐ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
					swap(map[i][j], map[next_x][next_y]);
				}
			}
		}
	}
}

void CountCandy(char **map, int n) {
	char color;
	int count;

	//ํ–‰ ์นด์šดํŠธ
	for (int i = 0; i < n; i++) {//ํ–‰
		count = 1;
		color = map[i][0];//๊ฐ ํ–‰์˜ ์ฒซ๋ฒˆ์งธ ์ปฌ๋Ÿฌ(0์—ด)๋ฅผ ๋น„๊ต ์ปฌ๋Ÿฌ๋กœ ๋‘”๋‹ค.
		for (int j = 1; j < n; j++) {//์—ด
			if (map[i][j] == color) count++;//์˜†์˜ ์ปฌ๋Ÿฌ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ปฌ๋Ÿฌ ๊ฐœ์ˆ˜(count)๋ฅผ 1 ๋Š˜๋ ค์ค€๋‹ค. 
			else {//์˜†์˜ ์ปฌ๋Ÿฌ๊ฐ€ ๋‹ค๋ฅด๋ฉด, ํ˜„์žฌ ์ปฌ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋น„๊ต์ปฌ๋Ÿฌ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์ปฌ๋Ÿฌ ๊ฐœ์ˆ˜๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
				color = map[i][j];
				if (candy_max < count) candy_max = count;//ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ count์™€ ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ตํ•ด์„œ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
				count = 1;
			}
		}
		if (candy_max < count) candy_max = count;//ํ•œ ํ–‰์ด ๋๋‚˜๋Š” ์ง€์ ์— ์‚ฌํƒ• ์ƒ‰๊น”์ด ๊ฐ™์œผ๋ฉด ์œ„ else๋ฌธ์˜ ์ตœ๋Œ€๊ฐ’ ๊ฐฑ์‹ ๋ถ€๋ถ„ ์ง„์ž…์„ ๋ชปํ•˜๋ฏ€๋กœ, ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ๋” ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ต๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
	}

	//์—ด ์นด์šดํŠธ
	for (int j = 0; j < n; j++) {//์—ด
		count = 1;
		color = map[0][j];//๊ฐ ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์ปฌ๋Ÿฌ(0ํ–‰)๋ฅผ ๋น„๊ต ์ปฌ๋Ÿฌ๋กœ ๋‘”๋‹ค.
		for (int i = 1; i < n; i++) {//ํ–‰
			if (map[i][j] == color) count++;//์•„๋ž˜์˜ ์ปฌ๋Ÿฌ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ปฌ๋Ÿฌ ๊ฐœ์ˆ˜(count)๋ฅผ 1 ๋Š˜๋ ค์ค€๋‹ค. 
			else {//์•„๋ž˜์˜ ์ปฌ๋Ÿฌ๊ฐ€ ๋‹ค๋ฅด๋ฉด, ํ˜„์žฌ ์ปฌ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋น„๊ต์ปฌ๋Ÿฌ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์ปฌ๋Ÿฌ ๊ฐœ์ˆ˜๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
				color = map[i][j];
				if (candy_max < count) candy_max = count;//ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ count์™€ ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ตํ•ด์„œ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
				count = 1;
			}
		}
		if (candy_max < count) candy_max = count;//ํ•œ ์—ด์ด ๋๋‚˜๋Š” ์ง€์ ์— ์‚ฌํƒ• ์ƒ‰๊น”์ด ๊ฐ™์œผ๋ฉด ์œ„ else๋ฌธ์˜ ์ตœ๋Œ€๊ฐ’ ๊ฐฑ์‹ ๋ถ€๋ถ„ ์ง„์ž…์„ ๋ชปํ•˜๋ฏ€๋กœ, ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ๋” ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ต๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
	}
}
728x90