인프런 커뮤니티 질문&답변

여승준님의 프로필 이미지
여승준

작성한 질문수

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

[47번 봉우리] 무엇때문에 안되는 걸까요?

작성

·

178

·

수정됨

0

[47번 봉우리 문제]

똑같은 논리로 구조를 짰는데, 하나는 정답이고 하나는 오답이에요.

왜일까요? 제가 생각했을때 둘의 차이는 배열의 할당 방식뿐입니다. (정적vs동적)

배열을 포인팅 하는 방식에서 잘못된게 있나요...?

 

[정답]

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <queue>
#include <vector>

using namespace std;

const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int map[52][52], mem[52][52];
int n, i, j, cnt = 0;
int main(void)
{
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            scanf("%d", &map[i][j]);
        }
    }

    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            int ni, nj, k;
            bool b = true;
            for (k = 0; b && k < 4; k++)
            {
                ni = i + dir[k][0];
                nj = j + dir[k][1];
                if (map[ni][nj] >= map[i][j])
                    b = false;
            }
            if (b)
            {
                cnt++;
                // printf("i:%d j:%d일 경우에 cnt++\n", i, j);
            }
        }
    }
    printf("%d", cnt);
    return 0;
}

 

[오답]

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <queue>
#include <vector>

using namespace std;

int N;
int *a;
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // (y,x)
int main(int argc, char *argv[])
{
    scanf("%d", &N);
    int i, j, cnt = 0;
    int ni, nj, k;
    a = new int[(N + 2) * (N + 2)];
    for (i = 1; i <= N; i++)
        for (j = 1; j <= N; j++)
            scanf("%d", a + i * (N + 2) + j);

    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= N; j++)
        {
            bool b = true;
            for (k = 0; b && k < 4; k++)
            {
                ni = i + dir[k][0];
                nj = j + dir[k][1];
                if (*(a + ni * (N + 2) + nj) >= *(a + i*(N + 2) + j))
                    b = false;
            }
            if (b)
            {
                cnt++;
                // printf("i:%d j:%d일 경우에 cnt++\n",i,j);
            }
        }
    }
    printf("%d", cnt);
    free(a);
    return 0;
}

 

 

P.S.

이것을 디버깅해보면서 느끼는데, Dev-C++이 제가 알던 Visual Studio보다 디버깅하기가 훨씬 힘드네요...ㅠㅠ 원래 그런건가요? 바쁘시겠지만 시간 되실때 디버깅 하는 팁도 영상으로 공유해주시면 도움이 정말 많이 될 것 같아요ㅠㅠ

답변 2

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

2번 테스트케이스에서 정답이 91개인데 오답코드는 90개를 출력합니다.

정답코드로 2번 케이스의 91개 봉우리의 행과 열 좌표를 출력해서 기록해 놓은 다음 오답코드를 2번 케이스의 봉우리 행과 열 좌표를 출력해서 어디가 빠졌는지 확인해 보시는게 제일 좋을 것 같습니다.

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

어떤 문제인가요? 그리고 코드를 코드블럭 버튼을 이용해 들여쓰기를 해주시면 제가 보기 편합니다.

여승준님의 프로필 이미지
여승준
질문자

아 안녕하세요^^ 양질의 강의 제공해주셔서 너무 감사합니다! ㅎㅎ

말씀하신대로 코드블럭으로 좀 보기 편하시게 해놨습니다! 그리고 질문에 말씀드렸지만 디버깅 툴(gdb)를 이용하는게 왜이렇게 어려울까요ㅠㅠ Visual Studio는 BreakPoint만 잘 찍어두면 거의 모든 걸 자동으로 보여줬는데 gdb는 꽤나 수동적으로 느껴지네요ㅠ

여승준님의 프로필 이미지
여승준

작성한 질문수

질문하기