[ 문제 해석 ]

갈색 격자수, 노란색 격자 수 yellow 가 매개변수로 주어질 때,
카펫의 가로/세로 크기를 수너대로 담은 배열을 나타내라

- 단, 중앙에는 노란색, 테두리 1줄은 갈색으로 칠해져 있음

 

[ 풀이 방법 ]

1) 갈색,노란색 격자 수를 더한 값의 약수를 구한다.
2) 그 약수 중에 정답이 있다.
3) (가로-2) * (세로-2) = 노란색의 개수이다.

* 조건 : 가로 길이 >= 세로 길이

 

 

[ 처음 시도 한 소스 코드 ]

import java.util.ArrayList;

public class 카펫 {

    /**
    - 문제 해석:
     갈색 격자수, 노란색 격자 수 yellow 가 매개변수로 주어질 때,
     카펫의 가로/세로 크기를 수너대로 담은 배열을 나타내라

     - 단, 중앙에는 노란색, 테두리 1줄은 갈색으로 칠해져 있음

     - 풀이 방법:
     1) 갈색,노란색 격자 수를 더한 값의 약수를 구한다.
     2) 그 약수 중에 정답이 있다.
     3) (가로-2) * (세로-2) = 노란색의 개수이다.

     * 조건 : 가로 길이 >= 세로 길이
    **/

    static int brown;
    static int yellow;

    public static void main(String[] args) {
        brown = 10;
        yellow = 2;
        int[] solution = solution();
        System.out.println(solution[0] + " " + solution[1]);
    }

    public static int[] solution() {
        int[] answer = new int[2];
        int sum = brown + yellow;
        ArrayList<String> calNumber = cal(sum);
        for (String i : calNumber) {
            String[] strArr = i.split(" ");
            int x = Integer.parseInt(strArr[0]);
            int y = Integer.parseInt(strArr[1]);

            if ((x - 2) * (y - 2) == yellow) {
                answer[0] = x;
                answer[1] = y;
            }
        }
        return answer;
    }

    public static ArrayList<String> cal(int n) {
        ArrayList<String> cal = new ArrayList<>();

        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                if (i * j == n) {
                    if (i >= j) {
                        cal.add(i + " " + j);
                    }
                }
            }
        }

        return cal;
    }


}

[ 테스트 결과 ]

몇몇 테스트 코드에서 시간 초과가 발생함을 알 수 있습니다.

 

다른 사람의 코드를 가져와 비교해 보겠습니다.

 

class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int sum = brown + yellow;
        
        for (int i = 3; i < sum; i++) {
            // 노란 격자가 가운데에 위치하기 위해 세로,가로가 모두 3이상이여야 하므로 3부터 시작
            int j = sum / i;
            // 가로길이를 바로 합에 나눠줘버려 세로를 구해줌
            
            if (sum % i == 0 && j >= 3) { 
            // 약수가 되고, j 길이도 3이상인 것을 선택
                int col = Math.max(i, j);
                int row = Math.min(i, j);
                // i,j 중 더 큰 값이 가로 길이가 됨
                
                int center = (col - 2) * (row - 2);
				// 가로-2 * 세로-2 = 노란색 격자 수 공식을 사용
                
                if (center == yellow) {
                    answer[0] = col;
                    answer[1] = row;
                    return answer;
                }
            }
        }
        return answer;
    }
}

 

* 출처 : https://easybrother0103.tistory.com/110

'프로그래머스' 카테고리의 다른 글

N개의 최소공배수  (0) 2022.10.26
두 큐 합 같게 만들기  (0) 2022.10.09
괄호 문제  (0) 2022.10.07
타겟넘버  (0) 2022.10.06
줄 서는 방법  (0) 2022.10.04

+ Recent posts