문제 링크
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
brown | yellow | return |
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
문제 풀이
우선 카펫의 전체 너비는 갈색 격자와 노란 격자를 합한 값이 되고, 그건 가로*세로와 같다.
전체 너비(total) = brown + yello = 가로 * 세로
그리고 카펫의 테두리의 1줄은 갈색으로 칠해져 있다고 했으므로,
노란 격자의 양 옆과 위, 아래로 갈색 격자가 1개씩 있어야 하기때문에 아래와 같은 식이 성립한다.
노란 격자(yellow) = (가로 - 2) * (세로 - 2)
두 식을 통해 갈색 격자는 아래와 같은 식을 만족한다.
갈색 격자(brown) = 총 너비(total) - yello
결국, 노란 격자와 갈색 격자의 식을 모두 만족하는 가로, 세로 조합을 구하면 되는 문제!
[알고리즘, 구현방법]
이 문제는 가로*세로 조합에 대한 탐색이 필요하므로, 완전 탐색으로 풀었다.
[풀이 과정]
- 가로*세로 조합 탐색 (가로가 큰 기준)
- 총 너비를 가로로 나누었을때, 나머지가 생기지 않는 경우, 즉 나누어 떨어지는 경우만 탐색
- 각 조합마다 가로와 세로가 yellow, brown 식에 대입했을때 모두 true인 경우가 정답
- 정답이 나올때까지 반복
[구현시 고려한 사항]
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길기때문에 조합을 탐색할때 가로가 큰 경우부터 확인한다.
코드
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int total = brown + yellow;
// 가로 길이 <= 세로 길이 이므로, 가로 길이가 큰 것 부터 탐색
for (int width=total; width>0; width--) {
if (total % width != 0) continue; // 나누어 떨어지지 않는 경우 넘어가기
int height = total / width;
int y = (width-2) * (height-2);
if (brown == total - y && yellow == y) {
answer[0] = width;
answer[1] = height;
break;
}
}
return answer;
}
}
'⚒️ Coding Test' 카테고리의 다른 글
[프로그래머스] 연속된 부분 수열의 합 - 자바(Java) (4) | 2024.02.28 |
---|---|
[프로그래머스] 올바른 괄호 - 자바(Java) (2) | 2024.02.27 |
[프로그래머스] 더 맵게 - 자바(Java) (0) | 2024.02.22 |
[프로그래머스] 이모티콘 할인행사 - 자바(Java) (0) | 2024.02.21 |
[백준] 1500번: 최대 곱 - Java (0) | 2020.12.31 |