Programmers | Level 2 | 카펫
Programmers | Level 2 | 카펫
Problems
- 📘 Src: Programmers
- 🗂️ Cat: Brute Force
Description
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
Constraints
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
Examples
brown | yellow | return |
---|---|---|
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
Solutions
- ⏳ Time Complexity: O(sqrt(n))
- 💾 Space Complexity: O(1)
Solution.java
import java.util.*;
class Solution {
public int[] solution(int brown, int yellow) {
int width = 1; // 노란색 타일의 가로 길이 초기화
int height; // 노란색 타일의 세로 길이
int totalWidth; // 전체 카펫의 가로 길이
int totalHeight; // 전체 카펫의 세로 길이
int area = brown + yellow; // 전체 타일의 수
while (true) {
// 노란색 타일의 가로 길이가 유효한 경우
if (yellow % width == 0) {
height = yellow / width; // 노란색 타일의 세로 길이 계산
totalWidth = height + 2; // 갈색 타일을 포함한 전체 카펫의 가로 길이
totalHeight = width + 2; // 갈색 타일을 포함한 전체 카펫의 세로 길이
// 전체 카펫의 면적이 주어진 타일의 총합과 일치하는지 확인
if (totalWidth * totalHeight == area) {
return new int[]{totalWidth, totalHeight}; // 조건을 만족하는 경우 반환
}
}
width++; // 다음 가로 길이로 이동
}
}
}
Approaches
이 문제는 주어진 노란색과 갈색 타일의 개수를 기반으로 카펫의 가로와 세로 길이를 찾는 문제입니다. 완전탐색을 통해 가능한 모든 가로와 세로 조합을 확인하여 조건에 맞는 카펫의 크기를 찾습니다.
문제를 해결하는 과정은 다음과 같습니다:
- 카펫의 가로와 세로 길이를 저장할 변수를 초기화합니다.
- 가능한 모든 가로 길이에 대해 탐색을 수행합니다. 이때 가로 길이는 1부터 시작하여 증가시킵니다.
- 현재 가로 길이가 노란색 타일의 개수를 나누어 떨어지는지 확인합니다. 나누어 떨어지면 해당 가로 길이에 대응하는 세로 길이를 계산합니다.
- 가로 길이와 세로 길이에 각각 2를 더하여 전체 카펫의 가로와 세로 길이를 계산합니다. 이는 테두리 갈색 타일을 포함하기 위함입니다.
- 계산된 전체 카펫의 가로와 세로 길이를 곱하여 전체 면적이 주어진 갈색과 노란색 타일의 총합과 일치하는지 확인합니다.
- 조건을 만족하는 가로와 세로 길이를 찾으면 해당 값을 반환합니다.
이 알고리즘의 시간 복잡도는 O(sqrt(n))이며, 공간 복잡도는 O(1)로, 추가적인 메모리 사용 없이 문제를 해결할 수 있습니다.
- Algorithm
- Brute Force