프로그래머스 코딩테스트/JAVA

[프로그래머스] 카펫 JAVA

Coding-Su 2024. 9. 5. 10:10
728x90

문제

[프로그래머스] 카펫

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

 

정답

import java.util.*;
class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = {0, 0};
        int total = brown / 2 + 2;
        List<Integer> carpetList = new ArrayList<>();
        
        for(int i = total-3; i > 1; i--) {
            if( i >= total - i) {
                carpetList.add(i);
            }
        }
        
        for(int i = 0; i < carpetList.size(); i++) {
            int yelloSize = (carpetList.get(i)-2) * (total - carpetList.get(i) - 2);
            if(yellow == yelloSize) {
                answer[0] = carpetList.get(i);
                answer[1] = total - carpetList.get(i);
                break;
            }
        }
        
        return answer;
    }
}

 

 

 

풀이

        int total = brown / 2 + 2;
        List<Integer> carpetList = new ArrayList<>();

 

우선 카펫의 경우 brown 이 yellow 를 감싸고 있고 직사각형 혹은 정사각형 임으로 brown /2 +2 를 통해 두 변의 길이의 합을 구할 수 있습니다. 그리고 carpetList 를 선언하여 만들어질 수 있는 모든 카펫의 한 변의 길이(가로)를 저장하였습니다.

 

        for(int i = total-3; i > 1; i--) {
            if( i >= total - i) {
                carpetList.add(i);
            }
        }

 

그 다음 for문을 이용하여 전에 저장한 total 을 반복하여 카펫의 모든 가로의 길이를 저장하였는데 이때 -3을 한 이유는 yellow가 1이상임으로 갈색만 존재하는 경우는 제외해야하기 때문입니다.
(ex. total이 7인경우 [7, 0], [6, 1], [5, 2] 이 3가지는 yellow가 존재하지 않기 때문에 불가능한 경우입니다.)

 

        for(int i = 0; i < carpetList.size(); i++) {
            int yelloSize = (carpetList.get(i)-2) * (total - carpetList.get(i) - 2);
            if(yellow == yelloSize) {
                answer[0] = carpetList.get(i);
                answer[1] = total - carpetList.get(i);
                break;
            }
        }

 

마지막 부분에서 yelloSize가 yello와 같으면 break를 하고 그때 가로와 세로를 answer에 저장하여 문제를 풀었습니다.

728x90