0x09-BFS. for문의 실행에서 순차적 수의 변화가 아닐때의 for문의 활용

boj 1697번 숨바꼭질 문제를 풀때, for문을 돌릴때 경우가 3가지이고, 각각이 순차적인 수의 변화가 아니라 x+1,x-1,2*x형태일때의 for문의 활용의 방법을 보자면, 

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int dist[100002];
int n,k;
int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k;
  fill(dist, dist+100001,-1);
  dist[n] = 0;
  queue<int> Q;
  Q.push(n);
  while(dist[k] == -1){
    int cur = Q.front(); Q.pop();
    for(int nxt : {cur-1, cur+1, 2*cur}){
      if(nxt < 0 || nxt > 100000) continue;
      if(dist[nxt] != -1) continue;
      dist[nxt] = dist[cur]+1;
      Q.push(nxt);
    }        
  }
  cout << dist[k];
}

중간에 for문에서 (int nxt:{cur-1,cur+1,2*cur}) 부분처럼, 

for(int a: {b,c,d})형태로 작성하면, for문을 돌때

1.  a==b일때,

2 a==c 일때,

3 a==d일때 로 나누어서 돌릴 수 있다. 

예시를 들기 위해 간단하게 작성한 코드를 실행해보면, 

#include <bits/stdc++.h>
using namespace std;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    for (int a : {1, 2, 4}) {
        cout << a * 2;
    }
}

이 코드의 실행 결과는, 출력물이 2,4,8이 나오게 된다. 

 

이런식으로 for문을 돌릴  수 있다는걸 기억하고, 순차적으로 수가 증가하는 for문이 아니라, 특정한 경우의 인자들을 받아서 for문을 돌릴때 활용하도록 하자. 

 

  Comments,     Trackbacks