프로그래머스 - 카펫
문제부터 살펴보자
카펫
에 속한 두 타일 색
으로 전체 카펫 크기를 도출하면 되는 문제
입력값으로는 두 타일 색인, 갈색 타일, 노란색 타일, 각각의 갯수가 주어진다
중앙의 타일은 항상 노란 타일 이며, 바깥 부분은 갈색 타일 로 둘러쌓여진 형태
풀이⌗
먼저 갈색 타일에 대해 좀 더 살펴보자
갈색 타일 은 전체 카펫의 테두리 부분이며
전체 카펫 타일 갯수를 $ 가로 X 세로 $ 라 칭할 수 있을 때
갈색 타일 갯수는
$$ 갈색 타일 갯수 = 2 X ( 가로 + 세로) - 4 = (가로 + 세로 + 가로 + 세로) - 4$$
여기서 -4
를 한 이유는 가로 갯수 세로 갯수를 더했을 경우,
모서리의 갯수를 중복해서 더하게 되므로 각 모서리의 갯수를 빼주었다.
그렇다면 노란 타일도 같은 방식으로 표현해보자
노란 타일의 경우 전체 카펫의 중앙 부분으로
전체 타일 에서 테두리 부분(갈색 타일) 제외한 나머지 부분으로
$$ 노란 타일 갯수 = 가로 X 세로 - (2 X ( 가로 + 세로) -4) $$
로도 표현할 수 있으나 좀 더 보기 편하게 바꿔보자
$$ 노란 타일 갯수 = (가로 - 2) X (세로 - 2)$$
이와 같은 이유가 나온 이유는
테두리 부분을 제외하기 때문에 기존 카펫의 가로
, 세로
길이에서 테두리 크기 만큼 제외하면
나머지 노란 타일의 범위인 사각형의 가로
, 세로
길이가 되기에
기존 카펫 길이에서 각각 -2
만큼 빼주어 계산한다.
이와 같은 표현식으로 계산을 편하게 하기 위해 다음과 같은 식을 표현할 수 있다.
$$ (가로 + 세로) = (갈색 타일 + 4) / 2 $$
이제 나온 표현식으로 가로+세로 범위 내에서 순회하면서 각 표현식을 검사하면서 확인하면 끝
아래는 풀이 코드 예시
식 도출 외에는 간단한편…
public int[] solution(int brown, int yellow) {
int[] answer = new int[2];
int borderSize = (int) (brown + 4) / 2; // 가로 + 세로
for (int i = 3; i <= borderSize; i++) { // i 가로 , j 세로
// 가로 + 세로 길이를 유추하였기 때문에 해당 조건에 맞는 범위 내에서 순회 처리
int j = borderSize - i;
if (j < i) { // 문제상 조건으로 추가
continue;
}
// 노란 타일 갯수 표현 식
int isYellowCnt = (i - 2) * (j - 2);
if (yellow == isYellowCnt) { // 표현식이 모두 맞을 경우 정답처리.
answer[0] = j;
answer[1] = i;
break;
}
}
return answer;
}