QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

[level 2] 카펫 - 42842

문제 링크

성능 요약

메모리: 76.7 MB, 시간: 0.02 ms

구분

코딩테스트 연습 > 완전탐색

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2023년 12월 5일 0:12:44

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

carpet.png

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://school.programmers.co.kr/learn/challenges

💡 Solutions

📄 카펫.java

// 1. 초기 width와 height는 전체 크기를 바탕으로 만들 수 있는 정사각형을 기준으로 생성한다.
// 1-1 이렇게 하게된다면 width * height 는 무조건 brown + yellow 보다 작거나 같다.
// 2. 이때, width는 항상 height 보다 크다
// 4. 따라서, width * height < whole 일 경우, width를 올려준다.
// 3. 그리고 width * height > whole 일 경우, height를 내려준다.
// 5. 그렇게된다면 모든 케이스를 통과할 수 있게된다.

class Solution {
    public int[] solution(int brown, int yellow) {
        int whole = brown + yellow;
        int width = (int)Math.sqrt(whole);
        int height = width;

        while (width * height != whole || (width - 2) * (height - 2) != yellow) {
            if (width * height > whole) {
                height--;
            } else {
                width++;
            }
        }

        return new int[]{width, height};
    }
}


// 투포인터가 일방적인 방식이 아니길래 하라는거 그대로 따라 내려갔다...
class Solution {
    public int[] solution(int brown, int yellow) {
        int whole = brown + yellow;

        for (int width = whole; width >= 3; width--) {
            if (whole % width == 0) { // 세로 길이 계산 가능
                int height = whole / width;
                if ((width - 2) * (height - 2) == yellow) {
                    return new int[]{width, height};
                }
            }
        }
        return new int[]{0, 0}; // 정답을 찾지 못한 경우
    }
}

// 그런데 수식적으로 풀 수 있는 방법이 있더라...! 찾아보길 바란다