[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/42842) ### 성능 요약 메모리: 77.4 MB, 시간: 0.04 ms ### 구분 코딩테스트 연습 > 완전탐색 ### 채점결과 Empty ### 문제 설명
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] |
※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.
> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
import java.util.*;
class Solution {
public int[] solution(int brown, int yellow) {
// brown(10) - 4 -> 6
// yellow - 2
// 6 / 2 -> 3의 약수 확인(1,3)
// 2 - (1,2) -> 합이 3이 됨 그러면 4,3이 됨
// brown(8) - 4 -> 4
// yellow - 1
// 4 / 2 -> 2의 약수 확인(1,2)
// yellow - 1 -> 2씩 더해줌 (3,3);
// brown(24) - 4 -> 20
// yellow - 24
// 20 / 2 -> 10의 약수 확인(1,2,5,10)
// 24 - (1, 24), (2,12), (3,8), (4,6) v - 2씩 더해줌
int brownCore = brown - 4;
brownCore /= 2;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 1; i <= Math.sqrt(brownCore); i++){
if(brownCore % i== 0){
list.add(i);
list.add(brownCore/i);
}
}
int x = 0;
int y = 0;
for(int i = 1 ; i <= Math.sqrt(yellow); i++){
if(yellow % i == 0){
x = i;
y = yellow / i;
if(list.contains(x+y)){
break;
}
}
}
x += 2;
y += 2;
return new int[]{Math.max(x,y),Math.min(x,y)};
}
}
'알고리즘 - Programmers > Lv 2' 카테고리의 다른 글
[level 2] 구명보트 - 42885 (0) | 2023.09.10 |
---|---|
[level 2] 영어 끝말잇기 - 12981 (0) | 2023.09.10 |
[level 2] 짝지어 제거하기 - 12973 (0) | 2023.09.10 |
[level 2] 피보나치 수 - 12945 (0) | 2023.09.10 |
[level 2] 다음 큰 숫자 - 12911 (0) | 2023.09.10 |