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에 입력된 변의 길이의 차의 절댓값을 이용해서 계산해야 예외 없이 요구하는 넓이를 구할 수 있다.
사실 이런 문제는 그냥 안 풀리면 빨리 답 찾아보고 내 접근법이 고려하지 못하는 예외가 무엇일지 생각하는 게 훨씬 생산적이다. 설령 예외를 찾지 못하더라도 다음에 이런 문제는 이렇게 변의 길이를 구해야겠다 하고 털어버리는 게 낫다고 본다.
'Algorithm' 카테고리의 다른 글
34. Find First and Last Position of Element in Sorted Array (0) | 2021.10.11 |
---|---|
타겟 넘버 (0) | 2021.10.07 |
567. Permutation in String (0) | 2021.10.02 |
189. Rotate Array (0) | 2021.09.28 |
367. Valid Perfect Square (0) | 2021.09.26 |