1. 문제

ㄱ자 모양을 여러 각도로 돌린 모양의 참외밭에서 자라는 참외의 수를 출력하는 문제이다. 1m^2당 참외의 개수는 k로 입력 받고 참외밭의 면적은 동서남북으로 선 하나하나 입력 받는다.
2. 풀이
이번 포스트에서는 큰 직사각형 면적에서 작은 직사각형 면적을 빼는 방식으로 풀었다.
큰 직사각형 면적은 가장 긴 가로 길이와 가장 긴 세로 길이의 곱으로 구할 수 있다.
그리고 작은 직사각형 면적은 큰 직사각형 면적에서 제외하는 방식으로 구할 수 있다.
즉, 가장 긴 가로 길이와 반대편에 위치한 동/서 방향의 가로 길이와 가장 긴 세로 길이와 반대편에 위치한 남/북 방향의 세로 길이의 곱으로 구한다. 반대편 길이를 구하기 위해 두 가지를 알아야한다.
- 변이 6개, 육각형으로 가정
- 가장 긴 길이의 위치를 찾음
- 이 변의 바로 3칸 뒤에 있는 변이 작은 사각형을 만듦
따라서 가장 긴 길이의 위치를 j라고 하면 반대편 길이의 위치는 (j+3)%6이 된다. (5까지 순환)
최종 면적에 해당하는 참외 수는 (큰 직사각형의 면적 - 작은 직사각형의 면적) * 1m^2당 참외 수 가 된다.
3. 코드
C 코드
#include <stdio.h>
#include <math.h>
int main() {
int k;
int arr[6][2];
scanf("%d", &k);
int maxX=0, maxY=0, xIndex, yIndex;
// 가장 긴 길이들과 길이들의 인덱스 저장
for(int i=0; i<6; i++){
scanf("%d %d", &arr[i][0], &arr[i][1]);
if(arr[i][0] < 3 && maxX < arr[i][1]){
maxX = arr[i][1];
xIndex = i;
}
if(arr[i][0] > 2 && maxY < arr[i][1]){
maxY = arr[i][1];
yIndex = i;
}
}
// 반대편에 위치한 작은 직사각형의 가로/세로 길이
int minX = arr[(xIndex + 3)%6][1];
int minY = arr[(yIndex + 3)%6][1];
// (큰 직사각형 - 작은 직사각형) * k
printf("%d", (maxX * maxY - minX * minY) * k);
return 0;
}
2차원 배열을 선언하고 값을 입력 받는다. 앞에 입력 받는 수는 방향이고, 뒤에 입력 받는 수는 길이이기 때문에 반복문에서 앞에 입력 받는 방향이 동/서인지 남/북인지 구별한 뒤 동/서이면 maxX와 비교를, 남/북이면 maxY와 비교한다.
maxX, maxY는 각각 가장 긴 가로/세로 길이를 저장하고 xIndex, yIndex는 길이들의 인덱스 번호를 저장한다.
minX에 maxX와 반대편에 위치한 가로 길이를 저장하고 minY에는 maxY와 반대편에 위치한 세로 길이를 저장한다.
Python 코드
k = int(input())
#_ : 단순히 6번 반복
arr = [list(map(int, input().split())) for _ in range(6)]
maxX = maxY = 0
xIndex = yIndex = 0
for i in range(6):
if arr[i][0] < 3 and maxX < arr[i][1]: # 동/서 방향
maxX = arr[i][1]
xIndex = i
if arr[i][0] > 2 and maxY < arr[i][1]: # 남/북 방향
maxY = arr[i][1]
yIndex = i
minX = arr[(xIndex + 3) % 6][1]
minY = arr[(yIndex + 3) % 6][1]
print((maxX * maxY - minX * minY) * k)
list와 map을 이용하여 배열을 선언하고 로직은 C와 동일하다.

감사합니다 (∪.∪ )...zzz
'Algorithm' 카테고리의 다른 글
| [Algorithm] 그리디 알고리즘 (Greedy Algorithm) + 백준 1931번 (0) | 2025.04.09 |
|---|---|
| [Java] 백준 1914번 : 하노이 탑 (0) | 2025.03.06 |
| [Java] 백준 10827번 : a^b (0) | 2025.03.04 |
| [C/C++] 백준 2960번 : 에라토스테네스의 체 (0) | 2025.02.20 |
| [C/C++] 백준 2740번 : 행렬 곱셈 (0) | 2025.02.01 |