반례 드립니다.
input :
5
1 2 3 4 5
1
output : 2
answer : 0
22번줄 check[x-num[i]]에서 배열 인덱스가 양수임을 보장할 수 있을까요?
3273번 - 두 수의 합
반례 드립니다.
input :
5
1 2 3 4 5
1
output : 2
answer : 0
22번줄 check[x-num[i]]에서 배열 인덱스가 양수임을 보장할 수 있을까요?
배열의 범위를 벗어난 인덱스를 참조하는것 만으로도 런타임 에러가 발생합니다.
답변 감사합니다 ㅠㅠ !
#include<iostream>
using namespace std;
int tmp[1000001];
int arr[100001];
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, x;
int count = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cin >> x;
for (int i = 0; i < n; i++)
{
if (tmp[x - arr[i]] == 1)
count++;
else
tmp[arr[i]] = 1;
}
cout << count;
return 0;
}
혹시 위 코드와 제 코드가 다른점이 어디있을까요?
위 코드는 저의 풀이와 비슷해 구글에서 가져왔습니다.
위 코드는 오류없이 돌아가더군요 ㅠ
코드 보고 깜짝 놀라서 테스트 해봤습니다. 결론적으로 음수 인덱스 참조시에 항상 런타임 에러를 내는 것은 아니지만 순전히 시스템 상태에 달려있습니다. 우연히 tmp[x-arr[i]]에 1 값이 들어있었다면 의도한대로 작동하지 않을 것입니다.
아래는 배열을 하나 선언하고 음수 인덱스를 참조해봤습니다.
arr[0] = 0
arr[-1] = 0
arr[-2] = 0
arr[-3] = 0
arr[-4] = 0
arr[-5] = 21989
arr[-6] = -1885159416
arr[-7] = 0
arr[-8] = 0
arr[-9] = 32562
arr[-10] = -1860597360
...
arr[-4104] = 1179403647
세그멘테이션 오류 (코어 덤프됨)
(모든 값들은 시스템 상태에 따라 계속 바뀔수 있습니다)
실제로 복사해오신 코드에 tmp[-1] = 1을 추가하면 틀렸습니다가 나옵니다.
추가)
input :
1
2000000
입력해보시기 바랍니다.
int tmp[1000001]; 선언을 통해 프로그램은 운영체제에게 int형 변수를 1000001개 저장할 수 있는 공간을 요청하고
운영체제는 요청한 공간을 마련한 뒤 공간의 첫 번째 물리 주소를 알려주게 됩니다.
해당 주소를 x라고 한다면, tmp[0]은 물리주소 x에 저장된 값을 의미하고, tmp[1]은 물리주소 x+1에 저장된 값을 의미하겠죠.
tmp[-1]을 참조하는 것은 운영체제가 프로그램에게 할당한 주소 범위(x부터 x+1000001)를 벗어나는 위치를 참조하는 것입니다.
그 위치에는 다른 프로그램이 사용 중인 변수가 있을 수도 있지만 사용되지 않는 공간이어서 아무것도 없을 수도 있습니다.
해당 위치가 읽기 쓰기 금지된 영역이라면 런타임 에러가 발생하겠지요.
댓글을 작성하려면 로그인해야 합니다.
woogie 2년 전
안녕하세요! 런타임에러와 시간초과 질문입니다.
런타임 에러가 나왔는데 사실 어디가 틀렸는지 잘모르겠습니다.
반례 주시면 감사드리겠습니다
그리고 처음에 이중 for문을 돌려서 풀었는데 시간 초과가 나와서
O(N^2)로는 풀 수 없는 문제인가요?
현재 시간복잡도를 생각하면서 풀고있는데
처음에 어떤식으로 시간복잡도를 생각해서 조건을 잘맞춰야할지 잘 모르겠습니다 ㅠ
그러한 조건은 어떤식으로 문제를 접근해서 구상을 해야하나요?
문제에서 주어진 메모리조건에 따라 생각해야하나요? 코딩 초보에게 말씀 주시면 정말 감사드리겠습니다.