[문제 설명]

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

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]

>문제 풀이

코드를 짜는 시간= 문제 이해시간 *?;

코드 짜는건 5분도 안걸렸는데, 문제를 잘못 이해해서 더 걸린 문제...

저는 저 위의 있는 모양처럼, 안에는 노란색 타일로 채워져있고 겉에는 갈색으로 둘러쌓인 타일 여러개가 카펫을 이루고 있다고 생각했어요. 그래서 잠시 막혔었는데, 그게 아니라 카펫 자체가 안에는 노랑이고 겉에가 갈색으로 둘러쌓인 카펫인 것...

문제 이해하고 나니까 이게 왜 level 2인지 모르겠더라고요. ?-?

간단하게 풀이를 적자면,

안에 노란색이 가로 X, 세로 Y 일 때, X x Y= yellow 니까 X, Y는 yellow의 약수 이고, 카펫의 가로 길이는 세로 길이보다 길거나 같다고 했으니까, X>=Y 인 수를 찾아주면 됩니다.

우리가 구해야할 것은 카펫의 가로, 세로 길이

즉, 찾은 X, Y에 +2씩 더해주어야 합니다.

 

>전체 코드

 

class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        int x=0, y=0; //x가로, y세로
        int bsum;
        
        for(int i=1; i<=Math.sqrt(yellow); i++){
            bsum=0;
            if(yellow%i==0){
                bsum+=2*i+2*(yellow/i)+4;
                if(bsum==brown){
                    answer[0]=yellow/i+2;
                    answer[1]=i+2;
                    break;
                }
            }
        }
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

 

+ Recent posts