[프로그래머스] 카펫

Jhanoo·2024년 10월 2일

알고리즘 스터디

목록 보기
48/80

[level 2] 카펫 - 42842

문제 링크

성능 요약

메모리: 65.9 MB, 시간: 0.08 ms

구분

코딩테스트 연습 > 완전탐색

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 10월 02일 11:36:57

문제 설명

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

carpet.png

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]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges


풀이

  • 주석의 풀이 방법대로 수학적으로 접근
  • 약수 중에서 중간값 찾기 && brown, yellow 개수 맞는지 확인(개수 체크 안했다가 4,6,7번 테케 틀렸음;;)

코드

class Solution {
    public int[] solution(int brown, int yellow) {
		// x: 가로, y: 세로
		// brown: B = 2x+2(y-2) = 2x+2y-4
		// 2(x+y) = B+4

		// yellow: Y = (x-2)*(y-2) = xy-2(x+y)+4
		// xy = Y+2(x+y)-4 = Y+B
		// 즉, xy = B+Y
		// 단, x >= y >= 3

		// 카펫 모양이므로 길쭉한 모양보다는 정사각형 모양으로 나와야 하므로
		// 중간에 있는 약수의 곱 구하기

		int xy = brown + yellow;
		int y = (int) Math.sqrt(xy); // 중간 값 찾기
		int x = 0;

		while (true) {
			// 약수인 경우 && brown 개수가 맞으면
			if (xy % y == 0 && brown == 2 * (xy / y + y - 2)) {
				x = xy / y;
				break;
			}
			y--;
		}

		int[] answer = { x, y };
		return answer;
	}
}
profile
어떻게든 해내는 사람

0개의 댓글