본문으로 건너뛰기

2477번: 참외밭

· 약 2분
Seokjae Lee
Software engineer

원문: https://doljae.tistory.com/244

[2477번: 참외밭

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

www.acmicpc.net](https://www.acmicpc.net/problem/2477)

import sys

r = sys.stdin.readline

target = int(r())
x, y, i1, i2 = 0, 0, 0, 0
list1 = []
for i in range(6):
direction, length = map(int, r().split())
list1.append((direction, length))
if direction in [3, 4] and y < list1[i][1]:
y = list1[i][1]
i2 = i
if direction in [1, 2] and x < list1[i][1]:
x = list1[i][1]
i1 = i

a = abs(list1[(i2 + 1) % 6][1] - list1[(i2 - 1)][1])
b = abs(list1[(i1 + 1) % 6][1] - list1[(i1 - 1)][1])

print((x * y - a * b) * target)

작년 이맘때쯤이었나 당시 다니고 있던 학원에서 과제로 풀고 풀이법을 인증하는 이벤트(?)를 했었다.

총 스무 문제 정도였던 걸로 기억하고 문제 난이도는 높지 않았었는데 그 당시 풀지 못했던 문제 중 하나다.

굉장히 단순한데 도대체 뭐가 문제일까 했지만 굳이 해답을 찾아보진 않고 넘겼다.

갑자기 보여서 풀어봤고 똑같은 삽질을 하고 있어서 그냥 구글링 해서 코드를 비교해봤다.

이 문제가 통과되지 않는다면 입력된 6개의 변의 길이를 정렬을 해서 가장 큰 값을 뽑아내고 그 변의 index 기준으로 2번째, 혹은 4번째에 해당하는 변이 작은 직사각형의 가로, 세로 길이 같은 식의 접근법을 사용하고 있을 확률이 굉장히 높다.

위 방법은 큰 직사각형의 가로, 세로 길이를 구할 수는 있지만, 정확히 어떤 형태의 입력이 들어오더라도 만족하는 작은 직사각형의 가로, 세로 길이를 구할 수 없다.

그래서 가장 큰 변 2개를 구하고 그 두 개의 변을 입력받은 index를 기준으로 +1, -1 한 index에 입력된 변의 길이의 차의 절댓값을 이용해서 계산해야 예외 없이 요구하는 넓이를 구할 수 있다.

사실 이런 문제는 그냥 안 풀리면 빨리 답 찾아보고 내 접근법이 고려하지 못하는 예외가 무엇일지 생각하는 게 훨씬 생산적이다. 설령 예외를 찾지 못하더라도 다음에 이런 문제는 이렇게 변의 길이를 구해야겠다 하고 털어버리는 게 낫다고 본다.