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

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

점수는 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 618
번호 제   목 글쓴이 날짜 조회
318 배열2 자가진단6 (1) 김주영 03-29 3399
317 2014년 예선 정보올림피아드 25번 풀이 (1) 이수연 03-28 2486
316 정보올림피아드 2014년예상기출문제34번 (1) 유양숙 03-27 6116
315 동영상 재생이되지 않습니다. (1) 왕수진 03-24 2259
314 2014년 초등 기출문제 31번 (1) 김유미 03-24 2128
313 잘 모르겠습니다. (4) 김연수 03-22 2032
312 반복제어문3 형성평가2 (1) 김주영 03-21 3054
311 이건 무슨 오류인가요? (2) 김연경 03-20 2980
310 2014년 정올 예선문제 중고등부 문제 28번...문의 (1) 이미화 03-20 3908
309 2014년 지역본선 문제2. 자리배정 문제 (3) 김연경 03-18 2478
308 정보올림피아드 예상기출문제31번 (1) 유양숙 03-18 9663
307 문자열2. 형성평가 3번, 형성평가 6번 무엇이 잘못되었는지? (1) 김연경 03-17 3067
306 자기주도 C언어 프로그래밍 일련번호 오류! (2) 최훈오 03-15 2178
305 문자열2, 자가진단 7번 (1) 김연경 03-14 3008
304 왜죠? (1) 황성진 03-14 1976
303 강의 다시 듣기 (1) 최정화 03-14 1881
302 자기주도 전자책 일련번호 (2) 최의택 03-13 2162
301 143: 반복제어문3 - 형성평가4 (4) 최의택 03-13 3577
300 우분투로 코드블록을 깔았는데 실행을 어떻게 하죠? (1) 유지안 03-12 2214
299 강의 들어가니 재생이 안되고 이상한 영어가 뜹니다. (1) 유지안 03-12 2072
 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