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;
    }
}

접근법

  1.  brown과 yellow 값을 더해서 넓이인 area를 구한다.
  2. 가로가 큰 값이므로 w (width) 값을 최대값인 넓이에서부터 시작하여 값을 줄이며 반복문을 실행한다. (이때, w는 1이 될 수 없다.)
  3. 가로의 값이 넓이의 약수인 수를 찾는다.
  4. 이때, 가로의 값에 따라 '넓이/가로'를 수행하여 세로의 값도 구한다.
  5. 이때, 세로와 가로의 값을 2배하여 모두 더했을 때(겹치는 부분 제외), brown 값과 같으면 답이다.
  6. 큰 값부터 시작하였으므로 answer 값이 정해졌을 때, 바로 break 한다.

 

 

⬇️ 이해하기 쉽게 나타낸 그림이다.

마지막 조건문 설명 내용

 


 

'가로값이 1이 될 수 없다',

'넓이의 약수값이다' 정도의 내용은 이해했지만

어떻게 코드를 짜야할지 감이 잘오지 않았다.

 

겹치는 값을 제외하는 h-2 부분을 생각하지 못해서

생각이 막혔다는 것을 깨달았다.

 

또한, 완전 탐색으로 풀면

효율성에서 실패할 것이라 생각한 점도 큰 것 같다.

 

프로그래머스 스쿨에 뜨는 것처럼

무식해보여도 사실은 최고의 방법일 때도 있는 것 같다.

 

생각으로 안될 것 같다고 멈추는 것이 아니라

일단 도전해보는 것이 좋은 것 같다.

 

 

 

 

728x90

+ Recent posts