woogie   2년 전

안녕하세요! 런타임에러와 시간초과 질문입니다.

런타임 에러가 나왔는데 사실 어디가 틀렸는지 잘모르겠습니다.

반례 주시면 감사드리겠습니다

그리고 처음에 이중 for문을 돌려서 풀었는데 시간 초과가 나와서

O(N^2)로는 풀 수 없는 문제인가요?

현재 시간복잡도를 생각하면서 풀고있는데 

처음에 어떤식으로 시간복잡도를 생각해서 조건을 잘맞춰야할지 잘 모르겠습니다 ㅠ

그러한 조건은 어떤식으로 문제를 접근해서 구상을 해야하나요?

문제에서 주어진 메모리조건에 따라 생각해야하나요? 코딩 초보에게 말씀 주시면 정말 감사드리겠습니다.

euphoric_n   2년 전

반례 드립니다.

input :

5

1 2 3 4 5

1

output : 2

answer : 0

22번줄 check[x-num[i]]에서 배열 인덱스가 양수임을 보장할 수 있을까요?

woogie   2년 전

답변 정말 감사드립니다 !

현재 이해가 안가는 부분이 있어서 다시 질문 드립니다

22번줄 if(check[x-num[i]]==1) 이기 때문에 

배열의 인덱스인 x-num[i]가 음수여도 1이 아니기 때문에 

다음 else인 check[num[i]] = 1 로 넘어가는게 아닌가요?

euphoric_n   2년 전

배열의 범위를 벗어난 인덱스를 참조하는것 만으로도 런타임 에러가 발생합니다.

woogie   2년 전

답변 감사합니다 ㅠㅠ !

#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;
}

혹시 위 코드와 제 코드가 다른점이 어디있을까요?

위 코드는 저의 풀이와 비슷해 구글에서 가져왔습니다.

위 코드는 오류없이 돌아가더군요 ㅠ

woogie   2년 전

배열의 범위를 벗어난 인덱스를 참조하기만해도 오류난다는것은 처음알았습니다.

너무 감사합니다 !

euphoric_n   2년 전

코드 보고 깜짝 놀라서 테스트 해봤습니다. 결론적으로 음수 인덱스 참조시에 항상 런타임 에러를 내는 것은 아니지만 순전히 시스템 상태에 달려있습니다. 우연히 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을 추가하면 틀렸습니다가 나옵니다.

euphoric_n   2년 전

추가)

input :

1

2000000

입력해보시기 바랍니다.

woogie   2년 전

신기하네요 시스템에 따라 값이 다를수 있군요 !

집에 돌아오자마자 답변 확인해봤는데 

시원한 답변이 달려있어서 감사합니다 !

input :

1

2000000

1

결과 segmentation fault (core dumped) 확인하였습니다. 

정말 감사합니다 !

woogie   2년 전

궁금한게 있어서 코린이지만 ㅠㅠ 하나 더 질문드립니다!

'우연히 tmp[x-arr[i]]에 1 값이 들어있었다면 의도한대로 작동하지 않을 것입니다. '

답변 주신 위와 같은 말씀이 시스템에 달려있다고 하셨는데

시스템이라는것이 구체적으로 어떤것일까요? 

저의 코드와 복사해온 코드는 함수를 만들어서 반환한것 빼고는 똑같다고 생각하는데

단순히 그차이에서도 시스템이 다르다는 말씀이신지 궁금합니다 !

euphoric_n   2년 전

int tmp[1000001]; 선언을 통해 프로그램은 운영체제에게 int형 변수를 1000001개 저장할 수 있는 공간을 요청하고

운영체제는 요청한 공간을 마련한 뒤 공간의 첫 번째 물리 주소를 알려주게 됩니다.

해당 주소를 x라고 한다면, tmp[0]은 물리주소 x에 저장된 값을 의미하고, tmp[1]은 물리주소 x+1에 저장된 값을 의미하겠죠.

tmp[-1]을 참조하는 것은 운영체제가 프로그램에게 할당한 주소 범위(x부터 x+1000001)를 벗어나는 위치를 참조하는 것입니다.

그 위치에는 다른 프로그램이 사용 중인 변수가 있을 수도 있지만 사용되지 않는 공간이어서 아무것도 없을 수도 있습니다.

해당 위치가 읽기 쓰기 금지된 영역이라면 런타임 에러가 발생하겠지요.

woogie   2년 전

너무 이해가 잘됬습니다. 감사합니다 

무릎을 탁치고 갑니다 euphoric_n님 ...!

좋은 주말 되세요 :D

댓글을 작성하려면 로그인해야 합니다.