본문 바로가기
Algorithm(BOJ, C)/Graph

[백준_1697] 숨바꼭질 c

by kurooru 2024. 11. 24.
문제

큐를 구현할 줄 알아야 해결이 가능하다 (재귀로 해결 시 stack overflow)

풀이
#include <stdio.h>
#include <stdbool.h>

#define MAX             100001
#define EXIT_SUCCESS    0
#define EXIT_FAIL       -1

// 큐 자료구조 정의
typedef struct {
    int pos;   // 현재 위치
    int steps; // 이동 횟수
} QueueNode;

typedef struct {
    QueueNode data[MAX]; // 큐 데이터 저장 배열
    int front;           // 큐의 첫 번째 요소 인덱스
    int rear;            // 큐의 마지막 요소 인덱스
} Queue;

// 큐 초기화
void initQueue(Queue *q) {
    q->front = 0;
    q->rear = 0;
}

// 큐가 비었는지 확인
bool isEmpty(Queue *q) {
    return q->front == q->rear;
}

// 큐에 삽입
void enqueue(Queue *q, int pos, int steps) {
    q->data[q->rear].pos = pos;
    q->data[q->rear].steps = steps;
    q->rear = (q->rear + 1) % MAX; // 원형 큐
}

// 큐에서 제거
QueueNode dequeue(Queue *q) {
    QueueNode node = q->data[q->front];
    q->front = (q->front + 1) % MAX; // 원형 큐
    return node;
}

int bfs(int start, int dest) {
    bool visited[MAX] = {false};
    Queue q;
    initQueue(&q);

    enqueue(&q, start, 0);
    visited[start] = true;

    while (!isEmpty(&q)) {
        QueueNode current = dequeue(&q);
        int curr = current.pos;
        int cnt = current.steps;

        if (curr == dest) {
            return cnt;
        }

        if (curr + 1 < MAX && !visited[curr + 1]) {
            visited[curr + 1] = true;
            enqueue(&q, curr + 1, cnt + 1);
        }
        if (curr - 1 >= 0 && !visited[curr - 1]) {
            visited[curr - 1] = true;
            enqueue(&q, curr - 1, cnt + 1);
        }
        if (curr * 2 < MAX && !visited[curr * 2]) {
            visited[curr * 2] = true;
            enqueue(&q, curr * 2, cnt + 1);
        }
    }

    return EXIT_FAIL;
}

int main() {
    // 0) 입력
    int n, k;
    scanf("%d %d", &n, &k);

    // 1) bfs
    printf("%d\n", bfs(n, k));

    return EXIT_SUCCESS;
}

 

'Algorithm(BOJ, C) > Graph' 카테고리의 다른 글

[백준_11725] 트리의 부모 찾기 c  (0) 2024.12.07
[백준_11403] 경로 찾기 c  (0) 2024.11.23
[백준_11724] 연결 요소의 개수 c  (0) 2024.11.17