문제부터 살펴보자

카펫에 속한 두 타일 색으로 전체 카펫 크기를 도출하면 되는 문제

입력값으로는 두 타일 색인, 갈색 타일, 노란색 타일, 각각의 갯수가 주어진다

중앙의 타일은 항상 노란 타일 이며, 바깥 부분은 갈색 타일 로 둘러쌓여진 형태


풀이

먼저 갈색 타일에 대해 좀 더 살펴보자

갈색 타일전체 카펫의 테두리 부분이며

전체 카펫 타일 갯수를 $ 가로 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;
}

참조