ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1697번 숨바꼭질
    알고리즘/백준 2025. 6. 13. 18:13

    문제링크

    https://www.acmicpc.net/problem/1697

     

    해설

    seconds 배열 요소가 갱신됐으면 새로운 값으로 갱신되면 안 된다. 새로 갱신되는 값은 기존 값보다 무조건 클 것이기 때문이다. 우리는 최소 값을 구해야 하니까 방문한 요소는 건너뛰어 값을 보호하고 비효율도 예방한다. 그전에는 이런 최소 값을 구할 때 queue를  pair로 선언해 위치값과 거리 값을 같이 관리하는는 걸 선호했지만 이번에는 (x, y) 형태의 좌표에 관한 문제가 아니라 값을 갱신해나가면서 최소 값을 찾는 것이기 때문에 별도의 visited 배열을 두지 않고 하나의 정수형 배열에서 방문/미방문을 구분할 수 있다.

     

    전체 코드

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    
    int N, K;
    const int MAX_SIZE = 200000;
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr);
    	cout.tie(nullptr);
    
    	cin >> N >> K;
    
    	vector<int> seconds(MAX_SIZE + 1, -1);
    	queue<int> q;
    
    	seconds[N] = 0;
    	q.push(N);
    
    	int answer = 0;
    	while (q.empty() == false)
    	{
    		int current = q.front();
    		q.pop();
    
    		if (current == K)
    		{
    			answer = seconds[K];
    			break;
    		}
    		
            // 임시 initializer_list 객체를 만들어 연속 읽기 전용 메모리에서 직접 참조
            // 오버헤드 신경 안 써도 된다
    		for (int next : {current - 1, current + 1, current * 2})
    		{
    			if (next < 0 || next > MAX_SIZE + 1 || seconds[next] != -1) continue;
    
    			seconds[next] = seconds[current] + 1;
    			q.push(next);
    		}
    	}
    
    	cout << answer << endl;
    }

    '알고리즘 > 백준' 카테고리의 다른 글

    [백준] 13913 숨바꼭질4  (0) 2025.06.17
    [백준] 5014 스타트 링크  (0) 2025.06.17
    [백준] 7569번 토마토  (0) 2025.06.13
    [백준] 2644번 촌수 계산  (0) 2025.06.07
    [백준] 2667번 단지번호 붙이기  (0) 2025.06.01

    댓글

Designed by Tistory.