명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
| 명함 번호 | 가로 길이 | 세로 길이 |
|---|---|---|
| 1 | 60 | 50 |
| 2 | 30 | 70 |
| 3 | 60 | 30 |
| 4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// sizes_rows는 2차원 배열 sizes의 행 길이, sizes_cols는 2차원 배열 sizes의 열 길이입니다.
int solution(int** sizes, size_t sizes_rows, size_t sizes_cols) {
int answer = 0;
int Rmax = 0;
int Cmax = 0;
int temp;
for(int i=0;i<sizes_rows;i++){
if(sizes[i][0]>sizes[i][1]){
temp = sizes[i][0];
sizes[i][0]=sizes[i][1];
sizes[i][1]=temp;
}
}
for(int i=0;i<sizes_rows;i++){
if(sizes[i][0]>Cmax)
Cmax = sizes[i][0];
if(sizes[i][1]>Rmax)
Rmax = sizes[i][1];
}
answer = Rmax * Cmax;
return answer;
}
명함을 돌릴 수 있기 때문에 돌리는 경우를 제외하고자 세로의 길이가 가로의 길이보다 작아지도록 변경하였다.(첫번째 for문)
세로의 최대값을 Cmax로 놓고 가로의 최대값을 Rmax로 둔 뒤 각각의 최대 값을 찾았다.(두번째 for문)
처음에 for문에서의 i의 범위를 sizes_rows가 아닌 sizes_cols로 두었더나 잘못된 결과나 나왔다. 열의 길이가 아닌 행의 길이로 두어야 한다는 것을 뒤늦게 깨달았다.
열의 길이 : 열이 몇개가 있는가?
행의 길이 : 행이 몇개가 있는가?