Zero to Hero
article thumbnail
Published 2021. 10. 5. 22:26
2477번: 참외밭 Algorithm
 

2477번: 참외밭

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

www.acmicpc.net

 

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
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!