[백준] 2477번 참외밭

거북이·2023년 1월 27일
0

백준[실버2]

목록 보기
27/81
post-thumbnail

💡문제접근

  • 처음엔 브루트포스 알고리즘으로 생각해서 2차원 배열을 그만큼 만들어줘야 했나 했는데 범위를 보고 이건 브루트포스 알고리즘이 아닌 다른 수학적 방법을 이용해야되겠다고 생각했다. 동서 방향의 밭경계 길이 최댓값과 남북 방향의 밭경계 길이 최댓값을 곱해 전체 밭 면적을 구해준다. 그 다음 동서/남북 방향의 밭경계 길이 최솟값을 구해 전체 밭 면적에서 빼주면 해당 참외밭의 면적이 나온다.

💡코드(메모리 : 30616KB, 시간 : 36ms)

import sys
input = sys.stdin.readline

K = int(input().strip())
li = []
for _ in range(6):
    direction, val = map(int, input().strip().split())
    li.append([direction, val])

width = []
height = []
for i in li:
    if i[0] == 3 or i[0] == 4:
        height.append(i[1])
    elif i[0] == 1 or i[0] == 2:
        width.append(i[1])

lownum = []
for i in range(6):
    if li[i][0] == li[(i+2) % 6][0]:
        lownum.append(li[(i+1) % 6][1])

print((max(width) * max(height) - lownum[0] * lownum[1]) * K)

📌 잘못된 코드(IndexError)

import sys
input = sys.stdin.readline

K = int(input().strip())
li = []
for _ in range(6):
    direction, val = map(int, input().strip().split())
    li.append([direction, val])

width = []
height = []
for i in li:
    if i[0] == 3 or i[0] == 4:
        height.append(i[1])
    elif i[0] == 1 or i[0] == 2:
        width.append(i[1])

lownum = []
for i in range(4):
    if li[i][0] == li[i+2][0]:
        lownum.append(li[i+1][1])

print((max(width) * max(height) - lownum[0] * lownum[1]) * K)

위 코드가 IndexError인 이유 : [반례]

입력

7
3 20
1 100
4 50
2 160
3 30
1 60

출력

IndexError

  • 이 문제의 답은 50 × 160 - 20 × 60 = 6800이다. 하지만 위의 코드대로라면 남북 방향은 [3, 4, 3]으로 인접하는 값이 일치하지 않고 동서 방향은 [1, 2, 1]으로 역시 인접하는 값이 일치하지 않아 lownum에 append될 수 있는 값이 없어 리스트가 비어있게 된다. 그렇기에 IndexError가 출력되는 것이다.

💡소요시간 : 31m

0개의 댓글