프로그래머스: 최소직사각형

kgh128·2023년 2월 12일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Programmers/%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95.java


1. 명함 회전시키기

주어진 명함의 가로 길이와 세로 길이 중 더 긴 것이 가로 길이가 되도록 명함을 회전시킨다. 이렇게 하면 나중에 지갑의 가로 길이와 세로 길이를 구할 때, 다른 카드의 가로 길이보다 짧은데 세로 길이들 중에서는 제일 길어서 지갑의 세로 길이가 되는 경우를 없앨 수 있다. 즉, 지갑의 크기를 최소화 할 수 있다.

  • 가로(size[0]) > 세로(size[1]): swap 하지 않고 그대로 사용함.
  • 가로(size[0]) < 세로(size[1]): swap 하여 세로가 가로가 되도록 함.
if (size[0] < size[1]) {
	int tmp = size[0];
	size[0] = size[1];
	size[1] = tmp;
}

아래의 다른 풀이를 보면 알겠지만, 불필요한 코드이다.


2. 가로의 최대 길이와 세로의 최대 길이 구하기

모든 카드의 가로가 세로보다 길도록 만들어 놓았으니, 가로의 최대 길이와 세로의 최대 길이를 구한다. 각각의 최대 길이가 지갑의 가로 길이와 세로 길이가 될 것이다.

maxWidth = Math.max(maxWidth, size[0]);
maxHeight = Math.max(maxHeight, size[1]);

[다른 풀이]

굳이 swap을 할 필요 없이 가로와 세로 중에서 긴 것들끼리(Math.max(size[0], size[1])) 비교하여 최대 길이를 구하고, 짧은 것들끼리Math.min(size[0], size[1])) 비교하여 최대 길이를 구하면 된다. swap을 하는 것보다 효율적이다.

maxLength = Math.max(maxLength, Math.max(size[0], size[1]));
maxHeight = Math.max(maxHeight, Math.min(size[0], size[1]));

0개의 댓글