프로그래머스 카펫

박은빈·2022년 10월 22일

코딩

목록 보기
10/19

레벨2 카펫
https://school.programmers.co.kr/learn/courses/30/lessons/42842

해결방식

처음에 카펫의 전체 크기는 brown+yellow인 것을 알았다
그 다음 카펫의 가로는 무조건 brown의 절반을 넘지않기때문에 그것을 가지고 이중for문으로 하나하나 탐색하는 코드를 작성했다

		for(int w=sum/2; w>2; w--) {
            for(int h=3; h<=w; h++){
                if(w*h == sum && (w-2)*(h-2) == yellow) {
                    answer[0] = w;
                    answer[1] = h;
                    return answer;
                }
            }
        }

w를 2까지 준 이유는 안에 yellow타일이 들어가는 최소크기가 1이고 그것을 감싸는 brown의 최소크기가 2이기때문이다.
또한 같은 이유로 h가 3부터 시작한다. 그리고 문제에서 세로가 가로를 넘을 수 없다고해서 h<=w를 주었다

그렇게 이중 for문을 돌리면서 곱의 결과가 sum이면서 yellow타일의 크기가 같은 것을 찾았다

하지만 저거는 시간초과가 나버린다..

그렇기때문에 이중for문이 아닌 하나의 for문으로 구성해야됐고
수학적으로 찾아보자는 마음으로 이리저리 값을 옮겨봤다

sum == brown + yellow
w * h == sum
h == sum/w

그러다 이렇게 식을 구하면 h를 찾지 않아도 h의 값을 얻어낼 수 있었다

하지만 이렇게 h를 구하면 결과가 실수형으로도 나올때가 있고 계산이 지저분해진다

그래서 w * h의 값이 sum이 될때만 h를 구하는 if문을 작성했다
여기서 필요했던게 나머지 연산이었다.

나머지 연산을통해 sum % h == 0이면 w * h == sum 이라는 소리이다

그리고 그 안에서 yellow의 크기와 맞는지 비교를 해주었다

코드

	public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];

        int sum = brown + yellow;
        int h = 0;

        for(int w=sum/2; w>2; w--){
            if(sum%w == 0) {
                h = sum/w;
                if((w-2)*(h-2) == yellow) {
                    answer[0] = w;
                    answer[1] = h;
                    return answer;
                }
            }
        }

        return answer;
profile
안녕하세요

0개의 댓글