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

대기업목표님의 프로필 이미지

작성한 질문수

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

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

맵과 방향벡터 퀴즈 질문있습니다

작성

·

295

·

수정됨

0

안녕하십니까 큰돌님

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

1. 문제의 뜻이 {0, 0}을 기준으로 4방향으로 탐색하는데 다 0이면 그 다음 칸인 {0, 1}로 이동하는데 0이니까 그 다음 칸인 {0, 2}를 기준으로 4방향을 탐색하는데 밑에 1이 있으니까 {1, 2}를 기준으로 또 4방향으로 탐색하고~, 이렇게 하라는 뜻이 아닌 거죠 ??

저는

0 : 0

1 : 0

0 : 2

1 : 2

2 : 2

2 : 1

이렇게 출력되게 해야하는 줄 알았는데 위 문제의 답 코드를 실행시키면

0 : 0

1 : 0

이렇게 나와서 제가 이해력이 안 좋아서 질문드립니다 ㅎ

 

  1. dfs까지 추가로 강의를 들었는데 위 퀴즈의 go 함수 로직이 사실 dfs 로직인 건가요 ??

종화는 방구쟁이야! 문제의 dfs 로직과 위 퀴즈의 go 함수 로직과 거의 유사해보여서요 )

 

  1. 트리 순회의 조건문 visited[here] == 0 안의 로직에서 중위 순회에서만 else-if 문을 사용하는데 http://boj.kr/9ed45ee550c0492081f5cbd187a7c71d 이런식으로 전위, 후위에서도 자식 노드가 한 개 아니면 두 개 둘 중에 하나니까 두 번 if문 볼 필요없게 else-if문 사용해도 되는거죠 ??

 

답변 3

0

void postOrder(int here){

if (visited[here] == 0) {

if (adj[here].size() == 1) postOrder(adj[here][0]);

else if (adj[here].size() == 2) { postOrder(adj[here][0]); postOrder(adj[here][1]); }

visited[here] = 1;

cout << here << " ";

}

}

 

void postOrder(int here) {

if(visited[here] == 0) {

if(adj[here].size() == 1) postOrder(adj[here][0]);

if(adj[here].size() == 2) { postOrder(adj[here][0]); postOrder(adj[here][1]); }

visited[here] = 1; cout << here << ' ';

}

}

3번만 재질문하면 위에가 제 코드인데 밑에가 강사님 코드인데 if (visited[here] == 0) 안에서 저는 if else-if로 사용했는데 저렇게 하면 안된다는 뜻인가용 ??

0

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

안녕하세요 대기업님 ㅎㅎ

1. 문제의 뜻이 {0, 0}을 기준으로 4방향으로 탐색하는데 다 0이면 그 다음 칸인 {0, 1}로 이동하는데 0이니까 그 다음 칸인 {0, 2}를 기준으로 4방향을 탐색하는데 밑에 1이 있으니까 {1, 2}를 기준으로 또 4방향으로 탐색하고~, 이렇게 하라는 뜻이 아닌 거죠 ??

>> 음.. 계속해서 4방향으로 탐색하는 건 맞는데 그 예제 자체가

일단 이 맵을 기반으로 탐색합니다.

1 0 1
1 0 1
0 1 1

그렇기 때문에 2번밖에 찍히지 않게 됩니다.

 

  1. dfs까지 추가로 강의를 들었는데 위 퀴즈의 go 함수 로직이 사실 dfs 로직인 건가요 ??

>> 네 맞습니다.

 

전위, 후위에서도 자식 노드가 한 개 아니면 두 개 둘 중에 하나니까 두 번 if문 볼 필요없게 else-if문 사용해도 되는거죠 ??

>> 아닙니다. 자식노드가 한개 아니면 2개 둘 중에 하나일 수가 있고 없을 수도 있습니다. 로직상 중위순회는

  			inOrder(adj[here][0]); 
	  		
			visited[here] = 1; 
	  		cout << here << ' ';
  			
			inOrder(adj[here][1]);

앞의 코드처럼 중간에 넣어야 하기 때문에 if문이 더 있는 것입니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

주어진 문제에서는 3x3 크기의 맵을 탐색하면서 1인 지역을 방문하는 코드를 구현하는 것 같습니다. 이때, {0, 0}부터 시작해서 4방향을 탐색하며 방문한 지점은 다시 방문하지 않도록 구현해야 합니다.

문제에서 언급한 방식으로 코드를 작성하면 됩니다. {0, 0}부터 시작해서 상하좌우로 움직이면서 1인 지역을 탐색하고, 해당 좌표를 출력하면 됩니다.

주어진 코드에서는 현재 위치를 나타내는 좌표(x, y)를 {0, 0}으로 초기화하고, 현재 위치가 1인 경우에만 해당 좌표를 출력하고 다음 좌표로 이동하는 방식으로 구현되어 있습니다. 따라서, 이 코드는 DFS 로직을 구현한 것입니다.

만약 위 코드가 정상적으로 동작하지 않는다면, 코드를 분석해 보고 문제의 조건에 맞게끔 수정을 해야 할 것입니다. 추가적으로, DFS에 대한 개념을 다시 한번 복습해보시는 것도 좋을 것 같아요.

문제에 대한 질문이 있으시다면 언제든지 물어보세요!