coding_test/programmers

lv2 / 거리두기 확인하기 / 카카오 기출 / C++

CodeJin 2022. 8. 3. 21:19

https://school.programmers.co.kr/learn/courses/30/lessons/81302

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


그냥 처음 봤을때 bfs라는 느낌이 강하게 들어서, 그대로 bfs로 풀이했다. 이때, 우리는 거리가 2를 넘어간다면, 궁금해할 필요가 없기 때문에, 거리가 2 이하인 노드에서만 탐색을 진행했다.

 

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

int bfs(vector<string>& board, int x, int y) {
    queue<tuple<int, int, int>> q;
    bool visit[5][5] = {false};
    int dist = 0;
    int dx[4] = {1, 0, -1, 0};
    int dy[4] = {0, 1, 0, -1};

    q.push({x, y, 0});
    visit[y][x] = true;

    while(!q.empty()) {
        int cur_x = get<0>(q.front());
        int cur_y = get<1>(q.front());
        int cur_dist = get<2>(q.front());
        q.pop();

        if (cur_dist < 2) {
            for (int i = 0; i < 4; i++) {
                int next_x = cur_x + dx[i];
                int next_y = cur_y + dy[i];
                if (next_x < 0 || next_x >= 5 || next_y < 0 || next_y >= 5) continue;
                if (visit[next_y][next_x]) continue;

                if (board[next_y][next_x] == 'O') {
                    q.push({next_x, next_y, cur_dist + 1});
                    visit[next_y][next_x] = true;
                }
                else if (board[next_y][next_x] == 'P') return 0;
                else continue;
            }
        }
    }
    return 1;
}

vector<int> solution(vector<vector<string>> places) {
    vector<int> answer;
    int temp;

    for(auto& tcase : places) {
        temp = 1;
        for(int i = 0; i < 5; i++) {
            for(int j = 0; j < 5; j++) {
                if(tcase[i][j] == 'P') temp &= bfs(tcase, j, i);
            }
        }
        answer.push_back(temp);
    }
    return answer;
}