완전탐색
카펫 - Level 2
https://school.programmers.co.kr/learn/courses/30/lessons/42842
풀이1
class Solution {
public int[] solution(int brown, int yellow) {
int[] ret = new int[2];
for (int x = 3; x <= 5000; x++) {
int y = (brown + yellow) / x;
if ((x - 2) * (y - 2) == yellow) {
ret[0] = y;
ret[1] = x;
break;
}
}
return ret;
}
}
ㄴ 첫 번재 코드는 가로를 기준으로만 하여 확인하도록 코드를 작성하였다.
풀이2
public class Solution {
public int[] solution(int brown, int yellow) {
for (int x = 3; x <= 5000; x++) {
for (int y = 3; y <= x; y++) {
int boundary = (x + y - 2) * 2;
int center = x * y - boundary;
if (brown == boundary && yellow == center) {
return new int[] {x, y};
}
}
}
return null;
}
}
ㄴ 두 번째 코드는 모든 가능한 조합을 확인하도록 코드를 작성하였다.
ㄴ yellow 는 1이상이라고 명시되어 있으므로 가로 세로의 길이가 모두 최소 3 이상이라는 것을 의미한다.
ㄴ brown 이 8 이상, 5000 이하라는 조건이 있다.
=> x (가로 길이) 조건에 주어진 5000은 임의로 선택한 숫자로, 이는 가능한 범위 내에서 충분한 크기로 선택한 것이다.
=> brown 이 8 이상이고 yellow 는 1이상이므로 가로와 세로의 길이의 최소값은 3이다.
ㄴ 가로 길이가 세로 길이보다 크거나 같다는 조건을 이용하여 세로 길이는 3 이상, 가로 길이 이하라는 범위를 찾아냈다.
ㄴ brown 으로 표시된 격자는 x * 2 + (y - 2) * 2 개이다. => (x + y - 2) * 2 개 : boundary
ㄴ yellow 로 표시된 격자는 x * y - (x + y -2) * 2 개이다. => center = x * y - boundary
ㄴ 첫 번째 코드에서는 int[] ret = new int[2]; 를 코드 첫 번째에 선언한 후 ret[0] = y; ret[1] = x; 를 설정해주도록 하여 ret 을 return 하도록 작성했는데, 두 번째 코드에서는 new int[] {x, y} 를 바로 return 하도록 코드를 작성했다.
'코딩테스트 > programming_JAVA' 카테고리의 다른 글
[Java] 프로그래머스_42839 : 소수 찾기 (2) | 2023.11.21 |
---|---|
[Java] 프로그래머스_67257 : 수식 최대화 (2) | 2023.11.20 |
[Java] 프로그래머스_42840 : 모의고사 (0) | 2023.11.20 |
[Java] 프로그래머스_181858 : 무작위로 K개의 수 뽑기 (0) | 2023.09.12 |
[Java] 프로그래머스_12935 : 제일 작은 수 제거하기 (0) | 2023.09.11 |