작성일 : 15-03-18 21:43
2014년 지역본선 문제2. 자리배정 문제
 글쓴이 : 김연경(kyj720)
조회 : 2,866  

아래와 같이 프로그램을 짜면 런타임에러가 뜹니다.

점수는 55점정도 나오는데...

그리고, 자리배정에 c,r의 범위가 1000까지인데

배열을 a[1000][1000]으로 잡으면 에러가 뜨네요...

한 시간을 매달려 해결했다 싶었는데..흑흑

#include <stdio.h>
int main()
{
    int c,r,k,cnt=0,i;
    scanf("%d %d",&c,&r);
    int a[500][500],q=1,w=0;


    scanf("%d",&k);
    a[1][1]={1};
    r=r+1;
    for (i=c;i>=1;i--){
    r=r-1;
    for (i=1;i<=r;i++){
        cnt=cnt+1;
        w=w+1;
        a[q][w]=cnt;

        if (k==cnt){
        printf("%d %d",q,w);
        break;
    }
    }
    c=c-1;
    for (i=1;i<=c;i++){
        cnt=cnt+1;
        q=q+1;
        a[q][w]=cnt;
        if (k==cnt){
         printf("%d %d",q,w);
        break;
    }
    }
    r=r-1;
    for (i=1;i<=r;i++){
        cnt=cnt+1;
        w=w-1;
        a[q][w]=cnt;
        if (k==cnt){
         printf("%d %d",q,w);
        break;
    }
    }
    c=c-1;
    for(i=1;i<=c;i++){
        cnt=cnt+1;
        q=q-1;
        a[q][w]=cnt;
        if (k==cnt){
        printf("%d %d",q,w);
        break;
    }
    }
    }
    if (k>cnt) printf ("0");
    return 0;
}


컴스쿨 15-03-19 16:02
 
a[1000][1000] 이 배열은 int자료 100만개 즉 400만바이트를 저장할수 있는 메모리가 필요한데 이렇게 큰 메모리는 지역변수로 선언하면 오버플로우가 됩니다.
따라서 전역변수로 선언하고 해 보시기 바랍니다.
전역변수는 main함수 위에서 선언하면 됩니다.
김연경 15-03-19 17:59
 
감사합니다.
이제 오버플로우를 어떻게 해결하는지를 배웠습니다.

그런데, 아직도 런타임에러가 뜹니다...
무엇이 문제일까요?
컴스쿨 15-03-19 21:12
 
중간에 cnt가 k가 되면 break;로 for문을 나가게 되는데 안쪽 for문만 나가게 되므로 바깥쪽 for문은 벗어나지 못하고 계속 움직이게 됩니다.
그러면 중간에 강제로 나오면서 배치하는 순서가 바뀌게 되므로 엉뚱한 방향으로 전개가 됩니다. 그 이후에야 어느자리가 되건 상관은 없지만 문제는 배열의 범위를 벗어나는 경우가 발생하게 되면 런타임 에러가 나는 것입니다.

해결방법은 여러가지가 있습니다.
1. 반복문에서는 배열을 끝까지 채우기만 하고 끝난후 배열에서 k와 같은 값을 찾아서 출력한다.
2. cnt와 k가 같으면 출력한후 break;를 하지 말고 끝까지 채워나간다.
3. cnt와 k가 같으면 출력한후 아예 프로그램을 종료한다. (break; -> return 0;)

이런 문제는 숫자가 큰 여러가지 예제를 넣어봐서 디버깅을 통해 스스로 찾아나가는 연습이 필요합니다.
 
 

Total 629
번호 제   목 글쓴이 날짜 조회
329 입금확인부탁드립니다. (1) 박창숙 04-10 2082
328 입금확인부탁드립니다. (1) 남기선 04-10 2168
327 2012 시도예선 중고등부 문제 29번 (1) 강인애 04-09 2522
326 함수 1 - 형성평가 5 (1) 최의택 04-08 4196
325 카드 결제후 영수증출력은 어디에서 하나요? (1) 문도현 04-08 2489
324 컴퓨터 자기주도 C언어 프로그래밍 프로그램 (1) 전승욱 04-06 3104
323 초등 지역 예선준비 문의합니다. (2) 남정식 04-06 2547
322 정보올림피아즈 지역예선 질문 (1) 이원진 04-06 2575
321 참 궁디합니다 (1) 강서준 04-04 2557
320 결제확인부탁드립니다 (1) 황지훈 04-03 2227
319 결제 확인 부탁드려요. (1) 안준표 03-29 2419
318 배열2 자가진단6 (1) 김주영 03-29 3910
317 2014년 예선 정보올림피아드 25번 풀이 (1) 이수연 03-28 3131
316 정보올림피아드 2014년예상기출문제34번 (1) 유양숙 03-27 6743
315 동영상 재생이되지 않습니다. (1) 왕수진 03-24 3192
314 2014년 초등 기출문제 31번 (1) 김유미 03-24 2526
313 잘 모르겠습니다. (4) 김연수 03-22 2410
312 반복제어문3 형성평가2 (1) 김주영 03-21 3523
311 이건 무슨 오류인가요? (2) 김연경 03-20 3505
310 2014년 정올 예선문제 중고등부 문제 28번...문의 (1) 이미화 03-20 4390
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30    

회사소개 | 개인정보처리방침 | 이용약관 | 찾아오시는 길 | 이메일주소 무단수집거부 | 사업자정보확인
경기도 안양시 동안구 호계동 1065-10 협성골드프라자 601호 한컴에듀케이션(주) TEL : 031-388-8840 FAX : 031-388-0996
대표자 : 김동규 사업자번호 : 130-86-02870 통신판매업신고번호 : 제 2010-경기안양-888호
COPYTIGHT(C) 한컴에듀케이션(주), ALL RIGHT RESERVED.
담은강좌 : 0