본문 바로가기
코테 스터디

완전탐색 문제해결법

by HIIDO 2023. 5. 9.
반응형

문제

- 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤다.

- 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했다.

- 카펫의 갈색 격자의 수 brwon, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성하라.

 

제한사항

- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수

- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수

- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.

 

입출력 예

 

참고 - 1.

https://easybrother0103.tistory.com/110 

 

풀이

- 카펫 사이즈 경우의 수를 구하기 위해서 brwon 격자 수 + yellow 격자 수의 약수를 구한다.

- brown = 10, yellow = 2라고 가정할 때, 12의 약수를 구한다 (1, 12), (2, 6), (3, 4), (4, 3), (6, 2), (12, 1)

- 이렇게 구한 경우의 수 중에서 정답을 골라야 한다.

- 제한사항에 가로의 길이가 세로보다 길거나 같다고 있으므로, (4, 3), (6, 2), (12, 1)로 줄어든다.

- 가운데에 노란색 격자가 위치하기 위해선 가로, 세로 길이가 모두 3 이상이여야 하므로 (6, 2), (12, 1)는 걸러진다.

- 해당 카펫이 입력으로 주어진 yellow의 개수만큼 노란색 격자가 가운데에 위치할 수 있는지 구해야 한다.

(가로 - 2) * (세로 - 2) = yellow의 개수이므로 (4 - 2) * (3 - 1) = 2

class Solution {
	public int[] solution(int brown, int yellow) {
		int[] answer = new int[2];

		int area = brown + yellow; // 전체 격자 개수
		for (int i = 1; i <= area; i++) {
			int row = i; // 세로
			int col = area / row; // 가로
	
			// 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.
			if (row > col)
				continue;
			
			if ((row - 2) * (col - 2) == yellow) {
				answer[0] = col;
				answer[1] = row;
				return answer;
			}

		}

		return answer;
	}
}
class Solution {
	public int[] solution(int brown, int yellow) {
		int[] answer = new int[2];
		int sum = brown + yellow; // 전체 격자 개수

		for (int i = 3; i < sum; i++) {
			int j = sum / i;
			
			if (sum % i == 0 && j >= 3) {
				int col = Math.max(i, j);
				int row = Math.min(i, j);
				int center = (col - 2) * (row - 2);

				if (center == yellow) {
					answer[0] = col;
					answer[1] = row;
					return answer;
				}
			}
		}
		return answer;
	}
}
반응형