๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ

by Jaeguk 2022. 7. 25.
๋ฌธ์ œ ๋งํฌ

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์นด๋“œ ๋’ค์ง‘๊ธฐ ๊ฒŒ์ž„์—์„œ ๋ชจ๋“  ์นด๋“œ์˜ ์ง์„ ๋งž์ถ”๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์ปค์„œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜์ž.

 

ํ’€์ด

์–ด๋””์— ์–ด๋–ค ์นด๋“œ๊ฐ€ ์žˆ๋Š” ์ง€๋Š” ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์–ด๋–ค ์นด๋“œ๋ถ€ํ„ฐ ๋’ค์ง‘์–ด์•ผ ๊ฐ€์žฅ ์ ์€ ํšŸ์ˆ˜๋กœ ๋ชจ๋“  ์นด๋“œ์˜ ์ง์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋Š” ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํ•ด๋ณด๊ณ  ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

๋ณด๋“œ๊ฐ€ 4 X 4 ํฌ๊ธฐ๋กœ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ํ•ด๋ด๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

 

next_permuation() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์นด๋“œ ๋’ค์ง‘๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์นด๋“œ๊ฐ€ 1, 2, 3 ์„ธ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๋งŒ์•ฝ ์ˆœ์—ด์„ ํ†ตํ•ด ๋‚˜์˜จ ์ˆœ์„œ๊ฐ€ 2, 1, 3 ์ด๋ฉด

2๋ฒˆ, 1๋ฒˆ, 3๋ฒˆ ์นด๋“œ ์ˆœ์„œ๋Œ€๋กœ ์ง์„ ๋งž์ถฐ์ค€๋‹ค.

 

ํ˜„์žฌ ์ปค์„œ ์œ„์น˜์—์„œ ์›ํ•˜๋Š” ๋ฒˆํ˜ธ์˜ ์นด๋“œ๊นŒ์ง€ ์ด๋™ ํšŸ์ˆ˜๋Š” bfsํƒ์ƒ‰์„ ์ด์šฉํ•ด์„œ ์ฐพ๋Š”๋‹ค.

์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ 8๊ฐ€์ง€๋กœ

←, ↑, ↓, → : ์ƒํ•˜์ขŒ์šฐ 1์นธ์”ฉ ์ด๋™ (4๊ฐ€์ง€)

[Ctrl]  +  ←, ↑, ↓, →  : ์ƒํ•˜์ขŒ์šฐ ์—ฌ๋Ÿฌ์นธ ์ด๋™(4๊ฐ€์ง€)

์›ํ•˜๋Š” ์นด๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ทธ ์ฆ‰์‹œ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•˜๊ณ  ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ด๋•Œ Enterํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒƒ๊นŒ์ง€ ์ƒ๊ฐ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํƒ์ƒ‰ํ•ด์„œ ์ฐพ์€ ์ด๋™ ํšŸ์ˆ˜์— + 1์„ ํ•ด์„œ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
pair<int,int> cursor;
vector<vector<int>> Board;
bool visited[5][5];
int dy[] = {1,0,-1,0};
int dx[] = {0,1,0,-1};
 
bool is_ok(pair<int,int> pos){
    if(pos.first < 0 || pos.first >= 4 || pos.second < 0 || pos.second >= 4)
        return false;
    return true;
}
 
int bfs(int ed){
    queue<pair<pair<int,int>,int>> q;
    q.push({cursor, 0});
    memset(visited, falsesizeof(visited));
    
    while(!q.empty()){
        pair<int,int> now = q.front().first;
        int move = q.front().second;
        q.pop();
        if(visited[now.first][now.second])
            continue;
        visited[now.first][now.second] = true;
        
        if(Board[now.first][now.second] == ed){
            cursor = now;
            Board[cursor.first][cursor.second] = 0;
            return move + 1// + Enter
        }
        
        for(int i = 0; i<4; i++){ //1์นธ์”ฉ ์ด๋™
            pair<int,int> next = {now.first + dy[i], now.second + dx[i]};
            if(is_ok(next) && !visited[next.first][next.second])
                q.push({next, move + 1});
        }
        
        for(int i = 0; i<4; i++){//ctrl๋กœ ์ด๋™
            pair<int,int> next = {now.first, now.second};
            while(is_ok({next.first + dy[i], next.second + dx[i]})){
                next.first += dy[i];
                next.second += dx[i];
                if(Board[next.first][next.second] && !visited[next.first][next.second])
                    break;
            }
            q.push({next, move + 1});
        }
        
    }
}
 
 
int solution(vector<vector<int>> board, int r, int c) {
    int answer = 987654321;
    vector<int> cards;
    for(auto v : board)
        for(auto i : v)
            if(i) cards.push_back(i);
    
    sort(cards.begin(), cards.end());
    cards.erase(unique(cards.begin(), cards.end()), cards.end());
    
    do{
        cursor = {r, c};
        Board = board;
        int temp = 0;
        for(auto card : cards){
            temp += bfs(card);
            temp += bfs(card);
        }
        answer = min(temp, answer);
    }while(next_permutation(cards.begin(), cards.end()));
    
    return answer;
}
cs

 

728x90