inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

2-A

2-A 2178) tie(y,x)=q.front(); q,pop(); ??

495

yhy9201

작성한 질문수 6

0

안녕하세요!

아직 실력이 부족하여 강사님의 코드를 하나하나 이해하며 공부하고 있는데 2-A 2178 DFS 문의드립니다.

tie(y,x) = q.front(); , q.pop(); 코드가 이해되지 않습니다...

int main(){

scanf("%d %d", &n, &m);

for(int i = 0; i < n; i++){

for(int j = 0; j < m; j++){

scanf("%1d", &a[i][j]);

}

}

queue<pair<int, int>> q; //먼저 큐를 정의하고

visited[0][0] = 1; // 시작점 0,0 방문하여

q.push({0, 0}); // 큐에 0,0 값을 넣어줍니다.

while(q.size()){ //큐에 값이 있을 때까지 반복

tie(y, x) = q.front(); q.pop();

// y= q.first, x=q.second 뜻으로 tie를 써주고

// pop...가장 앞에 요소를 제거..?

for(int i = 0; i < 4; i++){ //현재 위치에서 상하좌우에 1이 있는지 탐색

int ny = y + dy[i];

int nx = x + dx[i];

if(ny < 0 || ny >= n || nx < 0 || nx >= m || a[ny][nx] == 0) continue;

if(visited[ny][nx]) continue;

visited[ny][nx] = visited[y][x] + 1;

q.push({ny, nx});

}

}

printf("%d", visited[n - 1][m - 1]);

return 0;

 

그럼 답변 부탁드립니다..

c++ 코딩-테스트 queue

답변 1

1

큰돌

안녕하세요 yhy님 ㅎㅎ

    while(q.size()){
        tie(y, x) = q.front(); q.pop(); 
        for(int i = 0; i < 4; i++){
            int ny = y + dy[i]; 
            int nx = x + dx[i]; 
            if(ny < 0 || ny >= n || nx < 0 || nx >= m || a[ny][nx] == 0) continue; 
            if(visited[ny][nx]) continue; 
            visited[ny][nx] = visited[y][x] + 1; 
            q.push({ny, nx}); 
        } 
    }

이부분 말씀하시는거죠?

자, 일단 tie는 두가지의 변수를 묶을 수 있어요.

원래는 pair로 담은 변수를 끄집어내려면

pair <int, int> a;

라고 했을 때 a.first, a.second로 해당 pair값을 끄집어낼 수 있잖아요?

이를 쉽게

tie(y, x) = q.front()로

한꺼번에 first, second를 묶어서 가져오는 것입니다.

그림을 그려볼게요.

image이런식으로 되는 것이죠.

그리고 front()는

queue에 있는 요소들 중에서

야야!! 여기서 가장 앞에 있는 녀석 누구야! 하면서 앞에 있는 녀석을 데리고오는 함수라고 생각하시면 되요.

그거를 y, x로 받아서 어떠한 로직을 구축하는 것이죠.

 

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

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

감사합니다.

강사 큰돌 올림.

0

yhy9201

빠른 답변 감사합니다! 그럼 그 다음 q.pop() 으로 가장 앞에 있는 요소를 제거하는 이유는 뭔가요? 초기화,,,?

1

큰돌

음.. 초기화가 아니라

예를 들어 a, b, c가 줄을 섰고 급식을 한다고 하면

a, b, c

b, c

c

이런 꼴이 되죠?

똑같습니다.

이걸 코드로 구현하면

그러려면 a를 제거하고!! b를 맨 앞으로

b, c

이렇게 만들어서 줘야 하고

b를 제거하고 c를 맨앞으로!!

c

이렇게 만드는 거에요. ㅎㅎ

 

 

5-B

0

16

2

4 - A

0

33

2

코딩살구클럽 입장이 안됩니다

0

82

2

4-F 경우의 수 질문입니다.

0

35

2

코딩살구클럽 가입이 안됩니다.

0

85

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

63

1

교안 158페이지 문의드립니다

0

47

2

코딩살구클럽 관련 건의사항

0

119

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

45

1

진행 방법 질문드립니다!

0

83

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

64

2

2주차 개념#12 트리 순회

0

33

2

백준사이트가 종료된다고 합니다.

0

318

2

백준 서비스 종료

9

953

1

sk 하이닉스 코테 대비

0

388

2

3-G 최댓값 질문

0

54

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

66

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

69

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

186

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

74

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

66

2