[3강 누적합>이모스1법> 백준 17611] 런타임에러 질문드립니다!
import sys
sys.stdin = open('BackJoon/3강_누적합/5_17611.txt','r')
input = sys.stdin.readline
n = int(input())
vertex = [list(map(int, input().split())) for _ in range(n)]
######## (x_min, y_min) -> (0, 0)으로 이동
x_min, x_max = 500000, -500000
y_min, y_max = 500000, -500000
for x,y in vertex:
x_min = min(x, x_min)
x_max = max(x, x_max)
y_min = min(y, y_min)
y_max = max(y, y_max)
x_diff = 0 - x_min
y_diff = 0 - y_min
for i in range(n):
vertex[i][0] = vertex[i][0] + x_diff
vertex[i][1] = vertex[i][1] + y_diff
##### 수평선 조사 (강의에서와 같이 왼쪽으로 돌려서 봄)
vertex_x_incre = sorted(vertex, key = lambda x: (x[0], x[1])) #
y_range = y_max-y_min+1
x_range = x_max-x_min+1
x_sum_list = [0] * (y_range+1) # x축 방향으로 [1, 0, 0, ..., -1] 더함
for i in range(0,n,2): # 선분은 2개의 꼭지점으로 이루어짐
v1 = vertex_x_incre[i]
v2 = vertex_x_incre[i+1]
if v1[0] != v2[0]: # 디버깅
print('x point does not match!!')#만약 선분이 직선이 아니라면(혹은 sort가 잘못됨)
break
if v1[1] >= v2[1]:
print('y point does not align!!')#sort가 잘못됨
print('v1:', v1)
print('v2:', v2)
break
x_sum_list[v1[1]] += 1
x_sum_list[v2[1]] -= 1
x_sum_list = x_sum_list[:-1] #범위밖의 맨 마지막 -1 자리 버림
prefix = [0]*(y_range+1)
for i in range(y_range):
prefix[i+1] = prefix[i] + x_sum_list[i]
prefix = prefix[1:]
h = max(prefix)
##### y축 방향으로 조사 (수직선 조사)
vertex_y_incre = sorted(vertex, key = lambda x: (-x[1], x[0]))
y_sum_list = [0] * (x_range+1) # y축 방향으로 [1, 0, 0, ..., -1] 더함
for i in range(0,n,2):
v1 = vertex_y_incre[i]
v2 = vertex_y_incre[i+1]
if v1[1] != v2[1]:
print('y point does not match!!')
break
if v1[0] >= v2[0]:
print('x point does not align!!')
print('v1:', v1)
print('v2:', v2)
break
y_sum_list[v1[0]] += 1
y_sum_list[v2[0]] -= 1
y_sum_list = y_sum_list[:-1]
prefix = [0]*(x_range+1)
for i in range(x_range):
prefix[i+1] = prefix[i] + y_sum_list[i]
prefix = prefix[1:]
v= max(prefix)
print(max(h,v))
답변 1
1
일반 글이 작성이 안되서 댓글로 남깁니다!
백준에서 계속 런타임에러가 나는데 혹시 제 코드 어느 부분에 문제가 있는지 질문드립니다!
챗 GPT한테 물어보고 또 GPT가 생성해주는 테스트 케이스도 모두 통과하는데 백준에서 채점만 하면 런타임 에러가 나네요.
혹시 메모리 문제일까요??
오랜 고민끝에 글 남깁니다 알려주시면 감사하겠습니다!!
0
늦게 답변드려서 죄송합니다!
백준에 넣어보니 인덱스 에러가 나네요? 조금 더 살펴보고 추가 답들 달겠습니다. ( 아마도 범위 설정에서 문제가 있지 않을까 싶네요.. )
아래는 제가 제출한 코드인데 혹시라도 참고가 될까해서 올려둡니다 ㅎㅎ
# https://www.acmicpc.net/problem/17611
# 관찰 :
# 수직이동, 수평이동이 반복된다.
# 위로 기둥이 나오면, 이어서 아래로 기둥이 나온다.
# 가장 우측 지점에 도달하면 suffix로 변경된다. ( 하지만 무시해도 계산된다. )
# 개똥벌레 문제랑 동일한 로직이지만, 수직 + 수평 2번 반복된다.
# 아이디어 :
# 먼저 횡이동을 무시하고 모든 기둥을 나열해서 카운팅 해준다.
# -500,000 ~ 500,000
hn = [0]*1001000
wn = [0]*1001000
# 입력을 먼저 받는 방법(o)
# 입력을 받으면서 하는 방법
height = []
width = []
for n in range(int(input())):
x, y = map(int, input().split())
y = y + 500000
x = x + 500000
width.append(x)
height.append(y)
maxW = max(width)
minW = min(width)
maxH = max(height)
minH = min(height)
#마지막줄은 계산하지 못하기 때문에 미리 더해주고 빼준다.
a1, b1 = width[0],width[-2]
a2, b2 = height[0],height[-2]
wn[min(a1,b1)] += 1
wn[max(a1,b1)] -= 1
hn[min(a2,b2)] += 1
hn[max(a2,b2)] -= 1
#반복문을 돌려서 프리픽스를 하기 위해 1과 -1을 더해준다
for i in range(n-1):
# 홀수는 무조건 x값은 동일, y값만 변경된다.
# if i % 2 == 0:
a = min(height[i], height[i+1])
b = max(height[i], height[i+1])
if a != b:
hn[a] += 1
hn[b] -= 1
# 짝수는 반대다!
# if i % 2 == 1:
c = min(width[i], width[i+1])
d = max(width[i], width[i+1])
if c != d:
wn[c] += 1
wn[d] -= 1
#프리픽스 배열을 만든다.
prefix_h = [0]*1001000
prefix_w = [0]*1001000
# 정답을 출력한다.
# answer = 0
for h in range(minH-2, maxH):
prefix_h[h+1] = prefix_h[h] + hn[h+1]
# print("h",prefix_h[h+1])
# answer = max(answer, prefix_h[h+1])
for k in range(minW-2, maxW):
prefix_w[k+1] = prefix_w[k] + wn[k+1]
# print("k",prefix_w[k+1])
# answer = max(answer, prefix_w[k+1])
print(max(max(prefix_h),max(prefix_w)))
dp[x]가 최대값이라고 확신할수 있는 이유
0
44
1
1090번 문제 질문
0
148
1
유니온파인드
0
111
1
투포인터 25:15 질문
1
127
1
#1090번 문제 반례가 궁금합니다.
0
145
1
예제코드 자바입니다
1
186
1
정수론 파트 #2247 문제에 대한 질문입니다!
0
101
0
코드 오류
0
185
1
2강 정수론 문제3 #1407 질문
0
126
0
이차원 배열 (int형)dp로 0 혹은 -1로 체크하는 방법 말고 boolean형 배열로 체크해서 바로 리턴해줄 수 없나요?
0
154
0
1717번 최적화
0
112
0
백준 22988 문제 질문
1
192
2
[Python] 백준 1090번 문제
1
223
3
강의자료에서
1
161
2
2503 문제 제한 조건 질문!
1
248
2
백준 22988 번 문제
1
191
1
추가 강의 순서
1
179
2
(*문제 풀이)1090 테스트케이스 1번 C++
1
220
2
7강 RGB 색칠하기 질문 있습니다.
1
160
2
정수론 약수 빠르게 구하기 질문
1
255
1
1090 문제의 2, 3번째 아이디어는 결국 같은거 아닌가요?
1
372
2
1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.
1
222
2
누적합 문제 3번 질문
1
214
2
기억 ( 누적합 ) 강의 11660 문제
1
162
2





