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

qlghwp123님의 프로필 이미지
qlghwp123

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2주차 개념 #7. 맵과 방향벡터(direction vector)

[예시질문] 마지막 예시 코드 질문 있습니다.

작성

·

205

0

#include <bits/stdc++.h>

using namespace std;

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
// bool m[3][3];
bool visited[3][3];
bool m[3][3] = {
    1, 0, 1,
    1, 0, 1,
    0, 1, 1
};

// void visit(int x, int y)
// {
//     cout << '(' << x << ", " << y << ')' << '\n';

//     visited[x][y] = true;

//     for(int i = 0; i < 4; i++)
//     {
//         int nx = x + dx[i];
//         int ny = y + dy[i];

//         if(nx < 0 || nx >= 3 || ny < 0 || ny >= 3)
//             continue;
//         else
//             if(!visited[nx][ny] && m[nx][ny])
//                 visit(nx, ny);
//     }

// }

int main(void)
{
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 4; k++)
            {
                int nx = i + dx[k];
                int ny = j + dy[k];

                if(nx < 0 || nx >= 3 || ny <0 || ny >= 3)
                    continue;
                else
                    if(!visited[nx][ny] && m[nx][ny])
                    {
                        cout << '(' << nx << ", " << ny << ')' << '\n';
                        visited[nx][ny] = true;
                    }
            }


    // for(int i = 0; i < 3; i++)
    //     for(int j = 0; j < 3; j++)
    //         cin >> m[i][j];

    // visit(0, 0);

    return 0;
}

강의를 보고 제가 작성한 코드입니다.

 

강의 내

Q. 3 * 3 맵을 입력받아야 함. 이 맵은 1과 0으로 이루어져있고 {0, 0}은 무조건 1임을 보장한다. {0, 0}부터 4방향을 기준으로 한칸씩 탐색해나가며 방문한 정점은 다시 방문하지 않으며 방문하는 좌표를 출력하는 코드. 0은 갈 수 없는 지역. 1은 갈 수 있는 지역을 구현하시오.

라는 문제에 따라서 해당 코드로 구현했습니다.

 

해당 코드의 결과는

(1, 0)
(0, 2)
(0, 0)
(1, 2)
(2, 1)
(2, 2)

 

정확한 의도와는 다르게 구현된 부분( (0, 0) 부터 가는게 아니라서 출력 순서가 바뀜) 이 있지만 문제에 맞게 작성을 했는데요.

 

강사님이 작성하신 코드를 그대로 복붙한 결과, 강사님이 작성하신 코드 참조해서 작성한 코드 결과가 모두

(0, 0)
(1, 0)

이렇게 결과가 나왔는데

잘못된게 아닌가 싶어서 질문 드립니다.

 

  1. 혹시 제가 뭔가 빼먹었나요.

  2. 현재까지 본 영상으로 DFS, BFS 에서 사용되는 핵심 부분의 일부를 빌드업으로써 설명을 잘해주셔서 이해가 빨리 됩니다. 근데 아무래도 왜 저런 결과가 나오는지 이해가 잘 안됩니다. 재귀 호출로 인해서 분명 다 조회가 될텐데 말이죠.

 

강의 잘 듣고 있습니다.

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 123님 ㅎㅎ

지금 보시면 이 코드요.

int main(void)
{
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 4; k++)
            {
                int nx = i + dx[k];
                int ny = j + dy[k];
 
                if(nx < 0 || nx >= 3 || ny <0 || ny >= 3)
                    continue;
                else
                    if(!visited[nx][ny] && m[nx][ny])
                    {
                        cout << '(' << nx << ", " << ny << ')' << '\n';
                        visited[nx][ny] = true;
                    }
            }

이게 탐색하는 코드라는 말씀이시죠?

이거는 탐색이라고 볼 수 없는 코드입니다.

탐색은 어떠한 지점으로 부터 시작해서 >> DFS든 BFS든 그 지점으로 부터 이어가며 탐색하는 로직이 필요합니다.

이코드는

단지 맵 전체를 순회하며 방문되어있지 않고 맵의 요소가 1인 지점을 방문해서 해당 좌표를 출력하는 코드입니다.

그래서 저와는 다른 결과가 나는 것 같습니다.

 

또한, x, y보다는 y, x로 코드를 구축하는게 좋습니다.

해당 이유는 교안내의

2차원배열과 탐색을 빠르게 하는 팁

을 참고 부탁드립니다.

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

qlghwp123님의 프로필 이미지
qlghwp123
질문자

답변 감사합니다.

제가 글을 좀 잘못 작성해서 오해가 불러왔네요.

제가 묻고 싶었던 부분은 결과 부분입니다.

(0, 0)
(0, 2)
(1, 0)
(1, 2)
(2, 1)
(2, 2)

이렇게 나와야 하는 부분이 강사님이 작성하신 코드에서 나와야하는 코드가 아닌가 했습니다.

작성하는 지금 코드를 다시 보니

DFS 함수를 전체 행렬만큼 반복하지 않는다면 결국

1번의 시행결과가 단순히 하나의 컴포넌트를 출력할뿐이라는 것을 알았네요.

답변 감사합니다.

qlghwp123님의 프로필 이미지
qlghwp123

작성한 질문수

질문하기