[Java] 프로그래머스 - 카펫 (2단계)

배똥회장·2022년 7월 22일
0
post-custom-banner

📝 문제

프로그래머스 > 코딩테스트 연습 > 완전탐색 > 카펫


📝 답안

📌 작성 코드

class Solution {
    public int[] solution(int brown, int yellow) {
        for (int i = 1; i <= yellow / i; i++) {
        	if (yellow % i != 0) continue;
            
            int num = yellow / i;
            
            //num+2는 갈색 블록의 가로 한 줄의 길이임
            //위 아래로 두르고 있기 때문에 * 2를 해줌
            //i는 그냥 * 2를 해주는데
            //이유는 둘레의 길이가 아니고 블록의 개수이기 때문임
            //만약 둘레의 길이였다면 세로의 길이 역시 i + 2를 해주고 * 2를 해야함
            //어쨋든 계산한 것이 갈색 격자 개수와 동일하다면 끝
            if ((num + 2) * 2 + i * 2 == brown) return new int[]{num+2, i+2}; 
        }
        
        //만들 수 없는 경우는 없지만 for문 안에서 리턴되기 때문에 그냥 임시로 만들어놓음
        return new int[]{0, 0};
    }
}

📌 코드 풀이

for (int i = 1; i <= yellow / i; i++) {
...
}

  • i는 노란 격자의 세로 길이이고, yellow / i 는 노란 격자의 가로 길이를 의미함

  • 가로 길이는 세로 길이보다 크거나 같아야 한다는 조건이 있기 때문에 i의 조건이 가로보다 작거나 같도록 설정함

if (yellow % i != 0) continue;

  • 만약 i로 딱 나누어 떨어지지 않으면 continue
  • 예를 들어 yellow가 9일 경우에는 2로 나누었을 때 0으로 나누어 떨어지지 않음. 그럼 사각형을 만들 수 없기 때문에 넘어가야함

if ((num + 2) 2 + i 2 == brown) return new int[]{num+2, i+2};

  • num+2는 갈색 블록의 가로 한 줄의 개수이고, 위 아래로 두르고 있기 때문에 * 2를 해줌
  • i는 그냥 2를 해주는데 이유는 둘레의 길이가 아니고 블록의 개수이기 때문임. 만약 둘레의 길이였다면 세로의 길이 역시 i + 2를 해주고 2를 해야함
  • 어쨋든 계산한 것이 갈색 격자 개수와 동일하다면 끝
profile
어쩌면 개발자
post-custom-banner

0개의 댓글