728x90
[문제링크]
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
class Solution {
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int area = brown + yellow; //12
for(int w = area; w > 1; w--){
if(area % w == 0) { //12, 6, 4, 3, 2
int h = area / w; //1, 2, 3, 4, 6
if(w*2 + ((h-2) * 2) == brown) {
answer[0] = w;
answer[1] = h;
break;
}
}
}
return answer;
}
}
접근법
- brown과 yellow 값을 더해서 넓이인 area를 구한다.
- 가로가 큰 값이므로 w (width) 값을 최대값인 넓이에서부터 시작하여 값을 줄이며 반복문을 실행한다. (이때, w는 1이 될 수 없다.)
- 가로의 값이 넓이의 약수인 수를 찾는다.
- 이때, 가로의 값에 따라 '넓이/가로'를 수행하여 세로의 값도 구한다.
- 이때, 세로와 가로의 값을 2배하여 모두 더했을 때(겹치는 부분 제외), brown 값과 같으면 답이다.
- 큰 값부터 시작하였으므로 answer 값이 정해졌을 때, 바로 break 한다.
⬇️ 이해하기 쉽게 나타낸 그림이다.
'가로값이 1이 될 수 없다',
'넓이의 약수값이다' 정도의 내용은 이해했지만
어떻게 코드를 짜야할지 감이 잘오지 않았다.
겹치는 값을 제외하는 h-2 부분을 생각하지 못해서
생각이 막혔다는 것을 깨달았다.
또한, 완전 탐색으로 풀면
효율성에서 실패할 것이라 생각한 점도 큰 것 같다.
프로그래머스 스쿨에 뜨는 것처럼
무식해보여도 사실은 최고의 방법일 때도 있는 것 같다.
생각으로 안될 것 같다고 멈추는 것이 아니라
일단 도전해보는 것이 좋은 것 같다.
728x90
'💻코딩 > 💡Programmers' 카테고리의 다른 글
[프로그래머스|JAVA] 점프와 순간 이동 (0) | 2025.03.21 |
---|---|
[프로그래머스|JAVA] 구명보트 | 탐욕법 (1) | 2025.03.12 |
[프로그래머스|JAVA] 짝지어 제거하기 | Stack | 설명⭕️ | 효율성🥲 (1) | 2025.03.07 |
[프로그래머스|JAVA] 피보나치 수 | 시간초과 유의 (2) | 2025.02.27 |
[프로그래머스|JAVA] 다음 큰 숫자 | 효율성 높이기 (1) | 2025.02.16 |