πŸ“• Algorithm/Solved

[μ•Œκ³ λ¦¬μ¦˜ 작슀] offset (C++, μ™„μ „ 탐색)

ν•œμ½”λ”© 2020. 7. 7. 13:17
728x90
728x90

문제

5x5 2차원 배열이 μ£Όμ–΄μ§ˆ λ•Œ μ–΄λ–€ μ›μ†Œκ°€ μƒν•˜μ’Œμš°μ— μžˆλŠ” μ›μ†Œλ³΄λ‹€ μž‘μ„ λ•Œ ν•΄λ‹Ή μœ„μΉ˜μ— * 을 ν‘œμ‹œν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 경계선에 μžˆλŠ” μˆ˜λŠ” μƒν•˜μ’Œμš° 쀑 μ‘΄μž¬ν•˜λŠ” μ›μ†Œλ§Œμ„ λΉ„κ΅ν•œλ‹€.

 

μž…λ ₯

5x5 ν–‰λ ¬μ˜ 정보가 25 개의 수둜 주어진닀. 각 μˆ˜λŠ” 0 μ—μ„œ 9 사이 μˆ˜μ΄λ‹€.

 

좜λ ₯

*λ₯Ό ν¬ν•¨ν•œ 행렬을 좜λ ₯예의 ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€.

 

 


#include <iostream>
#include <vector>

#define MAX 10

using namespace std;

vector<vector <int>> arr(5, vector<int>(5, 0));
vector<vector <int>> chk(5, vector<int>(5, 0));

// 5x5 λ°°μ—΄ μž…λ ₯ 
void input() {
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
			cin >> arr[i][j];
}

// μž…λ ₯받은 2차원 λ°°μ—΄μ˜ μ›μ†Œλ₯Ό ν•˜λ‚˜μ”© κ²€μ‚¬ν•˜μ—¬ 또 λ‹€λ₯Έ 2차원 λ°°μ—΄ chk의 κ²°κ³Ό μ €μž₯
void compare() {

	// μ‚¬κ°ν˜• 각 꼭지점 μ›μ†Œ 비ꡐ
	if (arr[0][0] < arr[1][0] && arr[0][0] < arr[0][1]) 
		chk[0][0] = MAX;
	if (arr[4][0] < arr[3][0] && arr[4][0] < arr[4][1]) 
		chk[4][0] = MAX;
	if (arr[4][4] < arr[3][4] && arr[4][4] < arr[4][3]) 
		chk[4][4] = MAX;
	if (arr[0][4] < arr[1][4] && arr[0][4] < arr[0][3]) 
		chk[0][4] = MAX;
	
	// μ‚¬κ°ν˜•μ˜ 꼭지점을 μ œμ™Έν•œ λ³€ μ›μ†Œ 비ꡐ
	for (int i = 1; i < 4; i++) {
		if (arr[i][0] < arr[i - 1][0] && arr[i][0] < arr[i + 1][0] && arr[i][0] < arr[i][1]) 
			chk[i][0] = MAX;
		if (arr[4][i] < arr[4][i - 1] && arr[4][i] < arr[4][i + 1] && arr[4][i] < arr[3][i]) 
			chk[4][i] = MAX;
		if (arr[i][4] < arr[i - 1][4] && arr[i][4] < arr[i + 1][4] && arr[i][4] < arr[i][3]) 
			chk[i][4] = MAX;
		if (arr[0][i] < arr[0][i + 1] && arr[0][i] < arr[0][i - 1] && arr[0][i] < arr[1][i]) 
			chk[0][i] = MAX;
	}

	int tmp;

	// μ‚¬κ°ν˜• λ³€ μ œμ™Έ λ‚΄λΆ€ μ›μ†Œ 비ꡐ
	for (int i = 1; i < 4; i++) {
		for (int j = 1; j < 4; j++) {
			tmp = arr[i][j];
			if (tmp < arr[i][j - 1] && tmp < arr[i][j + 1] && tmp < arr[i - 1][j] && tmp < arr[i + 1][j]) 
				chk[i][j] = MAX;
		}
	}
}

// 비ꡐ κ²°κ³Όκ°€ μ €μž₯된 chk 배열을 μ‚¬μš©ν•˜μ—¬ 좜λ ₯
void print() {
	for (int i = 0; i < 5; i++) 
	{
		for (int j = 0; j < 5; j++) 
		{
			if (chk[i][j] == MAX)
				cout << "* ";
			else
				cout << arr[i][j] << " ";
		}
		cout << endl;
	}
}

int main() {

	ios_base::sync_with_stdio(false); 
	cin.tie(NULL); 
	cout.tie(NULL);
	
	input();
	compare();
	print();
}

 

μ™„μ „ 탐색을 기반으둜 2차원 λ°°μ—΄μ˜ μ›μ†Œλ“€μ„ κ²€μ‚¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. μ½”λ“œμ˜ 길이λ₯Ό 쀄이고 νš¨μœ¨μ„±μ„ 높이기 μœ„ν•΄ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ 접근을 ν•΄λ³΄μ•˜μœΌλ‚˜, 5x5 2차원 λ°°μ—΄μ΄λΌλŠ” 정해진 크기가 μ£Όμ–΄μ Έ 있기 λ•Œλ¬Έμ— 문제 μžμ²΄μ—μ„œλŠ” μ™„μ „ 탐색을 μ‚¬μš©ν•˜μ—¬ ν‘ΈλŠ” 것이 κ°€μž₯ 효율적인 것 κ°™μŠ΅λ‹ˆλ‹€.

 

 

꼭지점과 꼭지점을 μ œμ™Έν•œ 변에 μ‘΄μž¬ν•˜λŠ” μ›μ†Œλ₯Ό κ²€μ‚¬ν•˜κ³  λ‚˜μ„œ, λ‚΄λΆ€μ˜ μ›μ†Œλ“€μ„ 검사할 λ•Œ μ²˜μŒμ—λŠ” arr[i][j] * 4 < arr[i+1][j] + arr[i-1][j] + arr[i][j+1] + arr[i][j-1] 의 쑰건문을 μ‚½μž…ν•˜μ—¬ μ ‘κ·Όν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 λ°©λ²•μ˜ 단점은 μ£Όλ³€ μ›μ†Œ 쀑에 숫자의 차이가 크게되면 λΆ€μ •ν™•ν•œ κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ μœ„μ™€ 같이 μ ‘κ·Όν•˜μ—¬ ν‘ΈλŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•