c언어 코드업 알고리즘 문제 질문

조회수 587회

우선 이 질문 자체가 코드업(타사이트)에있는 내용을 물어보는 거라서 이런거 질문해도 되는지... 염려되지만 너무 궁굼해서 올려볼게요 ㅠ

문제는 아래와 같습니다

문제번호 1509

10*10 크기의 보드판이 있다.

각 말들은 제일 아래쪽에서 위쪽 방향으로 진격한다.

장애물은 0이 아닌 숫자로 나타내며, 0보다 크면 블럭 장애물, 0보다 작으면 구덩이 장애물, 0이면 평지이다.

10*10 보드판의 정보가 입력되고, 각 세로줄 아래에 말이 있으면 1, 없으면 0이 입력될 때 각 말의 생존여부를 구하는 프로그램을 구현하시오.

입력 10*10의 보드판의 정보가 입력된다.

11째줄에 각 말의 위치 여부가 입력된다.(1:있음, 0:없음)

출력 블럭 장애물에 부딪혀서 실패시 "세로줄 번호 crash",

구덩이에 떨어져서 실패시 "세로줄 번호 fall",

무사히 통과하면 "세로줄 번호 safe"를 출력한다.

(단, 말이 없는 줄은 아무결과도 출력하지 않는다.)

입력 예시

0 0 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 0 -1 0 0 0 0 0 2 0 
0 0 0 0 0 0 0 6 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 -4 2 0 0 0 
0 0 2 0 0 0 0 0 0 0 
0 0 0 0 3 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
1 1 0 0 1 1 0 1 0 1 

출력 예시

1 safe
2 crash
5 crash
6 fall
8 crash
10 safe

도움말

1번 줄 말은 무사 통과

2번 줄 말은 2 크기의 장애물에서 부딪혀 실패.

5번 줄 말은 3 장애물에서 부딪혀 실패

6번 줄 말은 -4 장애물에서 빠져 실패

8번 줄 말은 6 장애물에서 부딪혀 실패

10번 줄 말은 무사 통과

==============================================================================

우선 제가 짠 코드는 이렇습니다

#include <stdio.h>
int main(){
    int ar[11][10];
    int i,j;
    int count=0;

    for(i=0;i<11;i++){
        for(j=0;j<10;j++){
            scanf("%d",&ar[i][j]);
        }
    }

    for(i=0;i<10;i++){
        if(ar[10][i]==1){
            count=0;
            for(j=0;j<10;j++){
                if(ar[j][i]>0){
                    printf("%d crash\n",i+1);
                    break;
                } 
                else if(ar[j][i]<0){
                    printf("%d fall\n",i+1);
                    break;
                }
                count++;
            }
            if(count==10){
                printf("%d safe\n",i+1);
            }
        }
    }
    return 0;
}

=================================================================================

계속 테스트 케이스 3번에서 막히는데 도저히 아무리 봐도(한 삼일은 본것 같습니다 ㅠ) 더이상 수정할 곳도 그리고 오류가나는 부분도 이해가 안가서요 ㅠ

오류 내용은

==============================================

입력:

-1 0 0 0 0 0 0 0 -1 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 1 
1 1 0 0 1 1 0 1 0 1 

정답

1 crash
2 crash
5 crash
6 crash
8 crash
10 crash

출력 결과

1 fall
2 crash
5 crash
6 crash
8 crash
10 crash

==============================================================================

이렇습니다....

제발 제가 실수한 거였으면 좋겠네요.... 그렇지않으면 이문제에 쏟은 시간이랑 멘탈마저 깨저버려서 더이상 공부도 안되네요 ㅠ

1 답변

  • 문제의 조건은 이렇습니다.

    각 말들은 제일 아래쪽에서 위쪽 방향으로 진격한다.

    그런데 j0부터 9까지 순회하고 있습니다.

    그 말인즉 지금 말들은 위에서 아래로 진격하고 있는 겁니다.

    즉, 핵심 테스트 대상인 ar[j][i]ar[9][0], ar[8][0], ... 순으로 체크되고 있지 않고 거꾸로 되고 있다는 말이죠.

    잘못된 출력을 잘 보시면, 예컨대 1번마는 ar[0][0]-1에 빠져서 1 fall로 찍힌 걸 보실 수 있지요.

    for (int j = 9; j >= 0; j--)로 고쳐서 다시 해보세요.


    PS. "1번마"라는 표현을 쓰긴 했지만 여기서의 '말'이란 동물[馬]이 아니지요. 1분 국어상식.

    • 아아..!!! 당연한 건데 왜 생각을 못 했을까요ㅠ 그런데 한가지 의문점은 그럼 10번 마는 왜 fall 이 안나오고 알 수 없는 사용자 2019.12.30 00:08
    • 음? 10번마는 0, 0, 0, 0, 0, 0, 0, 0, 0, 1을 달려서 crash했겠네요. 엽토군 2019.12.30 00:09
    • 아 정확하게 이해됬습니다 정말 감사드려요!ㅠ 그리고 제 실수가 맞아서 너무 다행입니다 ㅠㅠ 확실히 알고리즘은 논리적인 사고방식이 끊김없이 이어져야 하는 것 같습니다 왜 저기서 막혔는지 한번 더 생각해 보러 가야겠네요 국어상식도..정말 잘 배우고 갑니다 감사드립니다!! 알 수 없는 사용자 2019.12.30 00:13

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)