PS (C, C++)

[백준/C & C++] 2477 참외밭

최연재 2023. 1. 25. 10:00

https://www.acmicpc.net/problem/2477

 

2477번: 참외밭

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

www.acmicpc.net

C

#include <stdio.h>
#include <math.h>

int main()
{
	int k, max, input[6][2], minus;
	scanf("%d", &k);
	for (int i = 0; i < 6; i++) scanf("%d %d", &input[i][0], &input[i][1]);

	for (int i = 0; i < 6; i++)
	{
		if (input[i][0] == input[(i + 2) % 6][0] && input[(i + 1) % 6][0] == input[(i + 3) % 6][0])
		{
			minus = input[(i + 1) % 6][1] * input[(i + 2) % 6][1];
			max = input[(i + 4) % 6][1] * input[(i + 5) % 6][1];
			break;
		}
	}
	printf("%d",(max - minus)* k);
	return 0;
}

C++

#include <iostream>
using namespace std;

int main()
{
	int k, max=0, input[6][2], minus=0;
	cin >> k;
	for (int i = 0; i < 6; i++) cin >> input[i][0] >> input[i][1];

	for (int i = 0; i < 6; i++)
	{
		if (input[i][0] == input[(i + 2) % 6][0] && input[(i+1)%6][0] == input[(i+3)%6][0])
		{
			minus = input[(i + 1) % 6][1] * input[(i + 2) % 6][1];
			max = input[(i + 4) % 6][1] * input[(i + 5) % 6][1];
			break;
		}
	}
	cout << (max - minus) * k;
	return 0;
}

코드설명

밭이 가진 선의 개수는 6, 밭의 모양은 4종류, 반시계 방향으로만 값이 주어진다는 점을 고려하면  짧게 코드를 쓸 수 있다.

아래의 두 그림으로 패턴을 찾을 수 있다, arr[i]와 arr[(i+2)%6]이 같고, arr[(i+1)%6]와 arr[(i+3)%6]이 같으면 빼야 할 면적은 arr[(i+1)%6]×[arr(i+2)%] 이다. 이 면적을 arr[(i+4)%6]×arr[(i+5)%6]에서 빼면 밭의 면적을 구할 수 있다. 

값들을 전부 입력받고, 반복문을 돌면서 빼야 할 면적의 가로와 세로를 구해서 minus에 면적을 저장한다. if문에서 사용되지 않은 값이 밭의 전체 가로와 세로이므로 이들을 곱해서 max에 저장하고 반복문을 탈출한다.

 

전체면적(==max)-빼야 할 면적(==minus)를 한 값에 k를 곱한 값을 출력하고 프로그램을 종료한다.

 

느낀 점

처음에는 경우를 일일이 다 고려해보려고 했는데 아무리 생각해도 안 될 것 같았다. 그래서 이동하는 경로의 경우를 모두 작성하고 패턴을 찾아서 이를 코드로 표현하니 바로 통과했다! 패턴을 찾는 연습이 필요하다고 느꼈던 문제다.