[C/Python] 백준 2477번 : 참외밭

2025. 3. 5. 20:26·Algorithm

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
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 그리디 알고리즘 (Greedy Algorithm) + 백준 1931번
  • [Java] 백준 1914번 : 하노이 탑
  • [Java] 백준 10827번 : a^b
  • [C/C++] 백준 2960번 : 에라토스테네스의 체
knhye
knhye
  • 전체
    오늘
    어제
  • knhye
    3n1hye_
    knhye
  • 링크

    • GitHub
    • 분류 전체보기 (61)
      • Development (28)
        • Back-end (21)
        • DB (3)
        • CS (4)
      • Algorithm (6)
      • DevOps (10)
        • git (1)
        • Cloud Platform (5)
        • CICD (1)
        • Cloud Native (2)
      • Internet (2)
      • 매일메일 (6)
      • 회고 (5)
        • Capstone (2)
        • Hackathon (1)
        • 2025 (2)
      • 자격증 (1)
      • 블로그 리딩 (3)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
knhye
[C/Python] 백준 2477번 : 참외밭
상단으로

티스토리툴바