c++ 11 이상에서 사용 가능한 range based 'for' loop에 관하여.
while(dist[k] == -1){ // 목표 위치의 최소 이동 횟수를 찾을 때까지 반복
    int cur = Q.front(); Q.pop(); // 큐에서 현재 위치를 꺼냄
    for(int nxt : {cur-1, cur+1, 2*cur}){ // 현재 위치에서 이동 가능한 3가지 경우를 고려
      if(nxt < 0 || nxt > 100000) continue; // 범위를 벗어나면 스킵
      if(dist[nxt] != -1) continue; // 이미 방문한 위치인 경우 스킵
      dist[nxt] = dist[cur]+1; // 최소 이동 횟수를 갱신하여 dist 배열에 저장
      Q.push(nxt); // 다음 위치를 큐에 넣음
    }        
  }
  
  cout << dist[k]; // 도착 위치의 최소 이동 횟수 출력

  return 0;

이러한 코드를 접하게 되었는데, 

이때에 'for' loop의 형태가 내가 그동안 알던 형태가 아니었고, 3가지 일관적이게 규칙성이 있는 원소들에 대한 for loop가 아니어서 이것에 대해서 gpt에 질문을 해보았다. 

그와 관련된 답변은 아래 내용과 같다. 

 

 

 

이와 관련하여서 추가적으로 질문을 하여서 얻읃 답변을 첨부해보면

이렇게 내용이 나오는데, 이렇게 된 글을 읽고보니, 이 형태가 지금까지 익숙하게 사용하였던

 

for(auto c:s) 형태와 같다는 생각이 들었다. 

이게 원래 auto c: s에서 s가 string이고, 이것도 결국 배열이므로, 여기서 컨테이너 부분에 해당하는 것이라는 생각이 든다. 

이번의 경우 auto c: 부분에 해당하는게 int nxt: 이고, s 부분에 해당하는게 {cur-1,cur+1,2*cur}부분으로 보여진다. 

원래 있던 s에 대해서가 아니라 새롭게 array로 {cur-1,cur+1,2*cur}을 잡아서 바로 auto c:s 형태처럼 사용한 것이구나. 

이렇게 사용하는 방법도 있다는걸 알아두고 이렇게 사용해보도록 하자. 

이렇게 되면 순차적 순회를 할때 각각의 원소들이 일관성 있는 규칙을 따를 필요가 없다. 

그러니까 이 방법을 알면 이러한 3가지 경우 각각에 대해서 for문을 돌때 아주아주 편하게 할 수 있는 것이다. 

 

  Comments,     Trackbacks