https://www.acmicpc.net/problem/2477
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를 곱한 값을 출력하고 프로그램을 종료한다.
느낀 점
처음에는 경우를 일일이 다 고려해보려고 했는데 아무리 생각해도 안 될 것 같았다. 그래서 이동하는 경로의 경우를 모두 작성하고 패턴을 찾아서 이를 코드로 표현하니 바로 통과했다! 패턴을 찾는 연습이 필요하다고 느꼈던 문제다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 1269 대칭차집합 (0) | 2023.01.27 |
---|---|
[백준/C & C++] 1764 듣보잡 (0) | 2023.01.26 |
[백준/C & C++] 21921 블로그 (0) | 2023.01.24 |
[백준/C & C++] 1213 팰린드롬 만들기 (0) | 2023.01.11 |
[백준/C & C++] 1158 요세푸스 문제 (0) | 2023.01.08 |