-
프로그래머스 카펫(자바) - 완전탐색 (약수 구하기)코딩테스트 2022. 4. 19. 14:35
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
10 2 [4, 3] 8 1 [3, 3] 24 24 [8, 6]
풀이
1. 노란색을 갈색이 한줄로 덮고 있다고 했으므로
노란색의 가로 길이 + 2 = 갈색 가로 길이, 노란색의 세로 길이 + 2 = 갈색 세로 길이 이다.
2. 즉, 노란색의 가로, 세로 길이가 결정되면 그에 따라 갈색의 가로, 세로 길이가 결정된다.
3. 노란색은 직사각형을 이루기 때문에 yellow = 노란색 가로 * 세로 길이이다.
즉, yellow의 약수들 중 큰 수와 작은 수의 짝이 노란색의 가로, 세로 길이이다. 예를 들어 yellow가 24라면 (1,24) (2, 12) (3, 8) (4,6) 이 4개가 노란색 가로, 세로 길이가 될 수 있는 것들이다.
4. 노란색의 가로 세로 길이의 후보들을 모두 찾았으므로 그 후보들 중 brown 값을 만족하는 경우를 찾으면 된다.
노란색 가로 세로 길이를 각각 x, y라고 할 때 brown = (x+2) * 2 + y * 2 으로 구할 수 있다.
소스 코드
class Solution { public int[] solution(int brown, int yellow) { int[] answer = new int[2]; for (int i = 1; i <= Math.sqrt(yellow); i++) { //약수 구할 때 if (yellow % i == 0) { if ((i+2) * 2 + (yellow/i) * 2 == brown) { answer[1] = i + 2; answer[0] = yellow/i +2; } } } return answer; } }
'코딩테스트' 카테고리의 다른 글
백준 15644 구슬탈출3(자바) - bfs (0) 2022.04.20 백준 13460 구슬 탈출2(자바) - BFS (삼성 sw 역량 기출)*** (0) 2022.04.20 프로그래머스 소수찾기(자바) - 완전 탐색 * (0) 2022.04.18 프로그래머스 단속카메라(자바) - 그리디 (0) 2022.04.16 프로그래머스 섬 연결하기(자바) - 그리디 / 크루스칼 알고리즘** (0) 2022.04.14