[Java] 프로그래머스 완전탐색 > 카펫 자바

: ) YOUNG·2022년 3월 31일
3

알고리즘

목록 보기
76/370
post-thumbnail

프로그래머스 > 완전탐색 > 카펫
https://programmers.co.kr/learn/courses/30/lessons/42842?language=java


문제

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

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

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


제한사항

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

입출력 예

brownyellowreturn
102[4,3]
81[3,3]
2424[8,6]

생각하기

부르트포스문제 자체가 부담이 적어서 그런지 어렵게 느껴지지는 않았다.

먼저 생각해야할 조건이 첫 번째가

  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

의 조건을 만족하기 위해
if(yellow_row >= yellow_col) 해당 조건을 만족하는 곳 안에서 동작하도록 구현을 했다.
아닐경우 return 처리

두 번째는 전체사각형을 비교해야되는데, 나는 기준으로 yellow로 잡아서 했다.

가장먼저, yellow를 기준으로 반복하며 i에 따라 yellow_row의 크기를 조금씩 줄여나가면서
yellow_col 비율을 맞춰나갔다.

그리고 전체 사각형의 갯수를 파악하기 위해

brown_row = yellow_row + 2;
brown_col = yellow_col + 2;

를 넣어주었다. + 2를 해주는 이유는 yellow 기준이기 때문에 brown으로 yellow를 덮어준다고 생각하면서 서로 2개씩필요하다.

물론 진짜 덮어서 계산할 때는 한쪽만 + 2를 해주면되지만 필요한 전체 사각형을 계산하기 위해서 + 2를 양변에 해주었다.

Carpet() 함수를 return 후에 answer[] 배열에 가로 세로 순서에 맞게 넣어주면 된다.

answer[0] = brown_row;
answer[1] = brown_col;


TMI

간단한 듯 보이지만 복잡한 문제
오류 계속 나서 식겁했는데 다행히 풀었다



코드

public class Solution {
	static int brown_row;
	static int brown_col;

   public int[] solution(int brown, int yellow) {

        Carpet(brown, yellow);

        int answer[] = new int[2];
        answer[0] = brown_row;
        answer[1] = brown_col;

        return answer;
    }

   static void Carpet(int brown, int yellow) {

	   for(int i=1; i<=yellow; i++) {
		   int yellow_row = yellow/i;
		   int yellow_col = i;
		   brown_row = 0;
		   brown_col = 0;

		   if(yellow_row >= yellow_col) {
			   if(yellow % yellow_row > 0)  {
				   yellow_col++;
			   }

			   brown_row = yellow_row + 2;
			   brown_col = yellow_col + 2;

			   if((brown_row * brown_col) == (brown + yellow)) {
				   return;
			   }
		   }
		   else {
			   return;
		   }

	   }
   }
}

0개의 댓글