완전탐색 1090번 시간초과
589
投稿した質問数 2
예제 문제는 잘 풀리는데 백준에 제출하니까 시간초과가 뜹니다
강의 자료랑 큰 차이는 없어 보이는데 어느 부분을 고쳐야 시간 안에 계산 가능할까요?
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char **argv) {
int n;
int minX, minY, maxX, maxY;
cin >> n;
int arr[n][2];
for(int i=0; i<n; i++){
cin >> arr[i][0] >> arr[i][1];
}
minX = arr[0][0]; maxX = arr[0][0];
minY = arr[0][1]; maxY = arr[0][1];
for(int i=1; i<n; i++){
if(arr[i][0]>maxX){
maxX = arr[i][0];
}
else if(arr[i][0]<minX){
minX = arr[i][0];
}
if(arr[i][1]>maxY){
maxY = arr[i][1];
}
else if(arr[i][1]<minY){
minY = arr[i][1];
}
}
int arr_answer[n];
int arr_dis[n];
for(int i=minY; i<=maxY; i++){
for(int j=minX; j<= maxX; j++){
for(int l=0; l<n; l++){
int subY= 0, subX=0;
subY = i-arr[l][1];
subX = j-arr[l][0];
arr_dis[l] = abs(subX) + abs(subY);
}
int sum = 0;
for(int k=0; k<n; k++){
sum+=arr_dis[k];
if(i==minY && j ==minX){
arr_answer[k] =sum;
}
else if(sum < arr_answer[k]){
arr_answer[k] = sum;
}
}
}
}
for(int i=0; i<n; i++){
cout << arr_answer[i] << " ";
}
return 0;
}
回答 2
0
다른 질문글에서는 2차원일 때 집 뿐만아니라 minx, miny 사이 값을 탐색해야한다고 하셨던 것 같은데 (첫 입력예시에 의하면 9개 경우의수) 제가 이해한게 맞을까요?
저도 시간초과 나와서 질문 남깁니다
0
보여주신 코드에서 X Y좌표의 min값과 max값을 계산해서 배열에 담고, 그 사이 범위를 모두 확인하도록 계산했지만 수업에서 설명한것처럼 각각의 집이 있는 좌표만 확인해주면 됩니다.
제가 작성한 코드는 아래와 같이 처음에 입력을 받은 좌표를 이용해서 바로 계산을 하지만,
n = int(input())
arr = []
arr_y = []
arr_x = []
answer = [-1]*n
# 입력 받기
for _ in range(n):
a,b = map(int,input().split())
arr.append([a,b])
arr_y.append(b)
arr_x.append(a)
# 만날 장소 정하기
for y in arr_y:
for x in arr_x:
dist = []
# 만날 장소로 각각의 점들이 오는 비용 계산하기
for ex,ey in arr:
d = abs(ex-x) + abs(ey-y)
dist.append(d)
# 가까운 순서대로 정렬하기
dist.sort()
tmp = 0
for i in range(len(dist)):
d = dist[i]
tmp += d
if answer[i] == -1:
answer[i] = tmp
else :
answer[i] = min(tmp, answer[i])
print(*answer)
보내주신 코드는 최댓값 최솟값을 계산하고, 그 안의 숫자를 모두 반복문으로 확인해서 정답을 계산하고 있습니다.
예제
[1_000_000, 0] 좌표의 집과 [0,1_000_000] 좌표의 집이 있다면
저의 코드
[1_000_000, 0]
[1_000_000, 1_000_000]
[0,1_000_000]
[0,0]
4개의 지점을 확인하고 반복문이 종료됩니다.
# 만날 장소 정하기
for y in arr_y:
for x in arr_x:
dist = []
# 만날 장소로 각각의 점들이 오는 비용 계산하기
for ex,ey in arr:
d = abs(ex-x) + abs(ey-y)
dist.append(d)
질문 주신 코드
[0,0], [0,1], [0,2], [0,3], ... , [ 1_000_000 , 1_000_000 ]
100만 * 100만개의 지점을 확인 한 뒤에 반복문이 종료됩니다.
for(int i=minY; i<=maxY; i++){
for(int j=minX; j<= maxX; j++){
for(int l=0; l<n; l++){
int subY= 0, subX=0;
subY = i-arr[l][1];
subX = j-arr[l][0];
arr_dis[l] = abs(subX) + abs(subY);
}
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
219
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

