본문 바로가기
백준(C언어)/23년 2월

기하 1 - 2477번

by C0MPAS 2023. 2. 1.

2월 1일(수) - 기하1 (2477번).........

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

최초 생각 정리

- 육각형의 변들이 입력되기 때문에, int direction[6] 과 int length[6] 으로 입력받을 배열의 크기를 선언

- 배열에 방향과 길이를 하나씩 입력받으면서, 가장 긴 가로길이 max_row 와 세로길이 max_col 를 알아내도록 함

- 마지막 출력에서는 k x (큰 직사각형) - k x (작은 직사각형) 의 형태로 참외밭의 넓이를 구할 예정

- 큰 직사각형은 max_row 와 max_col 의 곱으로 표현

- 작은 직사각형은 sub_row 와 sub_col 를 알아내서 표현

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

1. sub_row 와 sub_col 을 각각 구하기 위해서, direction 값에 따른 if 조건문을 추가하는 과정이 불필요하고 판단

-> 초기값이 1인 sub_area 라는 변수를 선언하고, 구하게되는 변의 길이를 sub_area 에 곱하는 것으로 변경

 

2. sub_area 에 곱해야하는 변의 길이를 구해야한다

    즉 i 번째와 i+2 번째의 direction 값이 같다면, 중간값인 length[ i+1 ] 가 sub_area 의 가로 혹은 세로길이가 된다

    하지만 int direction[6], int length[6]으로 선언했기에, 6번째 길이인 length[5] 와 첫번째 길이인 length[0] 는

    sub_area의 가로 혹은 세로길이가 될 수 없는 상황이 발생한다

-> sub_area 의 가로 혹은 세로길이가 카운팅된 경우에 변수 count 에 1을 더하고, 만약 count 변수가 2보다 작은 경우

    에는 (= 가로길이 1번, 세로길이 1번 이렇게 총 2번) lengh[5] 를 sub_area에 곱하는 것으로 변경

for (int i = 0; i < 4; i++)
	{
		if (direction[i] == direction[i + 2])
		{
			count += 1;
			sub_area = sub_area * length[i + 1];
		}
	}

	if (count < 2)
	{
		sub_area = sub_area * length[5];
	}

 

3. 풀이를 제출한 결과 오답이 발생했고, length[0] 이 sub_area 의 길이 중 하나인 경우가 빠졌다는 것을 확인

-> int direction[8], int length[8] 처럼 배열의 크기를 변경

-> direction[6] 과 direction[7]에는, 각각 direction[0] 과 direction[1] 의 값을 넣고

-> length[6] 과 length[7]에는, 각각 length[0] 과 length[1] 의 값을 넣는다

-> 또한 sub_area 의 가로 혹은 세로길이를 찾는 for 문 또한 (int i=0; i<4; i++) 에서 (int i=0, i<6, i++)로 변경

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>

int main(void)
{
	int k;
	scanf("%d", &k);

	int direction[8];
	int length[8];

	int max_row = 0;
	int max_col = 0;
	int sub_area = 1;

	for (int i = 0; i < 6; i++)
	{
		scanf("%d %d", &direction[i], &length[i]);

		if (direction[i] == 1 || direction[i] == 2)
		{
			if (length[i] > max_row)
			{
				max_row = length[i];
			}
		}

		if (direction[i] == 3 || direction[i] == 4)
		{
			if (length[i] > max_col)
			{
				max_col = length[i];
			}
		}
	}

	direction[6] = direction[0];
	direction[7] = direction[1];
	length[6] = length[0];
	length[7] = length[1];
	for (int i = 0; i < 6; i++)
	{
		if (direction[i] == direction[i + 2])
		{
			sub_area = sub_area * length[i + 1];
		}
	}

	printf("%d", (k * max_row * max_col) - (k * sub_area));
	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(C언어) > 23년 2월' 카테고리의 다른 글

정수론 및 조합론 - 1037번  (0) 2023.02.06
정수론 및 조합론 - 5086번  (0) 2023.02.06
기하 1 - 1004번  (0) 2023.02.03
기하 1 - 1002번  (0) 2023.02.02
기하 1 - 3053번  (0) 2023.02.01

댓글