본문 바로가기
항해

[Day21]JAVA 프로그래머스 카펫(완전탐색) (6,7,8,9 만 오류인 경우)

by neVerThe1ess 2024. 11. 17.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


🌘문제 이해하기 

노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫

 

갈색 격자 의 가로는 노란색 격자의 가로 길이 + 2 

갈색 격자 의 세로는 노란색 격자의 세로 길이 + 2 

 

갈색 격자의 가로,세로 길이는 전체카펫의 가로,세로 길이 이기도 하다.

갈색 격자 개수 = 전체 카펫의 격자 개수 - 노란색 격자의 개수 의 규칙을 찾아내면 된다.

🚨6,7,8,9 문제만 오류가 발생하는 경우

노란색 격자의 가로,세로 길이를 구할 때 약수인지 확인해야한다.
예를 들어 노란색 격자가 총 15개 일때
세로를 2 로 계산하면 15/2 = 7 가로가 7로 계산 될수 가 있다.
2 x 7 = 14 != 15 
노란색 격자의 개수가 동일하지 못한 경우를 주의해야한다. 

🌗문제 자세히보기

1.  노란색 격자의 개수로 세로 , 가로 길이를 임의로 구한다. (세로길이는 1부터 시작한다)

세로의 길이가 노란색 총 격자의 개수의 약수가 아닌경우 세로의 길이를 증가해서 다시 계산

int y_height = 1;       //노란색 세로 길이
int y_width = 0;        //노란색 가로 길이

 // yellow 의 height 1 부터 그에 맞춘 width될 수 있는 경우로 크기를 구한다.      
if(yellow % y_height == 0)
    y_width = yellow/y_height;
else
{
    y_height++;
    continue;
}

 

2. 노란색 길이가 구해지면 이에 맞게 전체 카펫의 가로 , 세로 길이 계산

int c_height = 0;       //카펫 세로 길이
int c_width = 0;        //카펫 가로 길이

//전체카펫의 크기는  yellow 의 height+2 , width+2 이다
c_height = y_height+2;
c_width = y_width+2;

 

3. 전체카펫 개수 - 노란색 격자 개수 = 갈색 격자 개수 

int brown_carpet = 0;   //갈색 격자 총 개수
int carpet = 0;         //총 카펫 개수
        
//전체카펫 - yellow = brwon 
carpet = c_height * c_width;
brown_carpet = carpet - yellow;

 

4. 계산된 갈색 격자 개수가 주어진 갈색 격자 개수와 동일하면 종료

다르면 노란색 세로 길이 증가 해서 다시 계산 

//동일하다면 카펫의 가로 , 길이 
if(brown_carpet == brown)
{
    answer = new int[]{c_width,c_height};            
}  
else
{   
    //노란색 height 1증가 
    y_height++;
}

 

위의 방식을 while문을 돌려 계산된 갈색 격자 와 주어진 갈색 격자의 개수가 동일할때까지 구한다. 


 

🌕 최종코드

public static int[] solution(int brown, int yellow)
    {
        int[] answer = {};
        int y_height = 1;       //노란색 세로 길이
        int y_width = 0;        //노란색 가로 길이
        int c_height = 0;       //카펫 세로 길이
        int c_width = 0;        //카펫 가로 길이
        int brown_carpet = 0;   //갈색 격자 총 개수
        int carpet = 0;         //총 카펫 개수

        while(brown != brown_carpet)
        {
            // yellow 의 height 1 부터 그에 맞춘 width될 수 있는 경우로 크기를 구한다.      
            if(yellow % y_height == 0)
                y_width = yellow/y_height;
            else
            {
                y_height++;
                continue;
            }

            //전체카펫의 크기는  yellow 의 height+2 , width+2 이다
            c_height = y_height+2;
            c_width = y_width+2; 
            
            //전체카펫 - yellow = brwon 
            carpet = c_height * c_width;
            brown_carpet = carpet - yellow;              
        
            //동일하다면 카펫의 가로 , 길이 
            if(brown_carpet == brown)
            {
                answer = new int[]{c_width,c_height};            
            }  
            else
            {   
                //노란색 height 1증가 
                y_height++;
            }
            
        }
       
        return answer;
    }