๐Ÿ–ฅ๏ธ Study Note/Coding Test

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.3 - ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ(C++)

Beankong_ 2023. 10. 5. 23:39

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

 

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

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

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์ธ ๋ฒ ๋กœ๋‹ˆ๋Š” ๊ฐœ๋ฐœ ์—ฐ์Šต์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์นด๋“œ ์ง๋งž์ถ”๊ธฐ ๋ณด๋“œ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„์ด ์‹œ์ž‘๋˜๋ฉด ํ™”๋ฉด์—๋Š” ์นด๋“œ 16์žฅ์ด ๋’ท๋ฉด์„ ์œ„๋กœํ•˜์—ฌ 4 x 4 ํฌ๊ธฐ์˜ ๊ฒฉ์ž ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์นด๋“œ์˜ ์•ž๋ฉด์—๋Š” ์นด์นด์˜คํ”„๋ Œ์ฆˆ ์บ๋ฆญํ„ฐ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, 8๊ฐ€์ง€์˜ ์บ๋ฆญํ„ฐ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„ ์นด๋“œ๊ฐ€ ๊ฐ๊ธฐ 2์žฅ์”ฉ ํ™”๋ฉด์— ๋ฌด์ž‘์œ„๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ €๊ฐ€ ์นด๋“œ๋ฅผ 2์žฅ ์„ ํƒํ•˜์—ฌ ์•ž๋ฉด์œผ๋กœ ๋’ค์ง‘์—ˆ์„ ๋•Œ ๊ฐ™์€ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„ ์นด๋“œ๋ฉด ํ•ด๋‹น ์นด๋“œ๋Š” ๊ฒŒ์ž„ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ฉฐ, ๊ฐ™์€ ๊ทธ๋ฆผ์ด ์•„๋‹ˆ๋ผ๋ฉด ์›๋ž˜ ์ƒํƒœ๋กœ ๋’ท๋ฉด์ด ๋ณด์ด๋„๋ก ๋’ค์ง‘ํž™๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋“  ์นด๋“œ๋ฅผ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„์—์„œ ์นด๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์นด๋“œ๋Š” ์ปค์„œ๋ฅผ ์ด์šฉํ•ด์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ปค์„œ๋Š” 4 x 4 ํ™”๋ฉด์—์„œ ์œ ์ €๊ฐ€ ์„ ํƒํ•œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” "๊ตต๊ณ  ๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ ์ƒ์ž"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค์„œ๋Š” [Ctrl] ํ‚ค์™€ ๋ฐฉํ–ฅํ‚ค์— ์˜ํ•ด ์ด๋™๋˜๋ฉฐ ํ‚ค ์กฐ์ž‘๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ๋ฐฉํ–ฅํ‚ค ←, ↑, ↓, → ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ˆ„๋ฅด๋ฉด, ์ปค์„œ๊ฐ€ ๋ˆ„๋ฅธ ํ‚ค ๋ฐฉํ–ฅ์œผ๋กœ 1์นธ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • [Ctrl] ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ์—์„œ ๋ฐฉํ–ฅํ‚ค ←, ↑, ↓, → ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ˆ„๋ฅด๋ฉด, ๋ˆ„๋ฅธ ํ‚ค ๋ฐฉํ–ฅ์— ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์นด๋“œ๋กœ ํ•œ๋ฒˆ์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
      • ๋งŒ์•ฝ, ํ•ด๋‹น ๋ฐฉํ–ฅ์— ์นด๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ๊ทธ ๋ฐฉํ–ฅ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์นธ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ, ๋ˆ„๋ฅธ ํ‚ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์นด๋“œ ๋˜๋Š” ๋นˆ ๊ณต๊ฐ„์ด ์—†์–ด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ปค์„œ๋Š” ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ์นด๋“œ๋ฅผ ๋’ค์ง‘๊ธฐ ์œ„ํ•ด์„œ๋Š” [Enter] ํ‚ค๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • [Enter] ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์„œ ์นด๋“œ๋ฅผ ๋’ค์ง‘์—ˆ์„ ๋•Œ
      • ์•ž๋ฉด์ด ๋ณด์ด๋Š” ์นด๋“œ๊ฐ€ 1์žฅ ๋ฟ์ด๋ผ๋ฉด ๊ทธ๋ฆผ์„ ๋งž์ถœ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋’ค์ง‘์„ ๋•Œ ๊นŒ์ง€ ์•ž๋ฉด์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
      • ์•ž๋ฉด์ด ๋ณด์ด๋Š” ์นด๋“œ๊ฐ€ 2์žฅ์ด ๋œ ๊ฒฝ์šฐ, ๋‘๊ฐœ์˜ ์นด๋“œ์— ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์ด ๊ฐ™์œผ๋ฉด ํ•ด๋‹น ์นด๋“œ๋“ค์ด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ฉฐ, ๊ทธ๋ฆผ์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋‘ ์นด๋“œ ๋ชจ๋‘ ๋’ท๋ฉด์ด ๋ณด์ด๋„๋ก ๋‹ค์‹œ ๋’ค์ง‘ํž™๋‹ˆ๋‹ค.

"๋ฒ ๋กœ๋‹ˆ"๋Š” ๊ฒŒ์ž„ ์ง„ํ–‰ ์ค‘ ์นด๋“œ์˜ ์ง์„ ๋งž์ถฐ ๋ช‡ ์žฅ ์ œ๊ฑฐ๋œ ์ƒํƒœ์—์„œ ์นด๋“œ ์•ž๋ฉด์˜ ๊ทธ๋ฆผ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋‚จ์€ ์นด๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜๋Š” ๋ฐฉํ–ฅํ‚ค์™€ [Enter] ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ๋™์ž‘์„ ๊ฐ๊ฐ ์กฐ์ž‘ ํšŸ์ˆ˜ 1๋กœ ๊ณ„์‚ฐํ•˜๋ฉฐ, [Ctrl] ํ‚ค์™€ ๋ฐฉํ–ฅํ‚ค๋ฅผ ํ•จ๊ป˜ ๋ˆ„๋ฅด๋Š” ๋™์ž‘ ๋˜ํ•œ ์กฐ์ž‘ ํšŸ์ˆ˜ 1๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์นด๋“œ๊ฐ€ ๋ช‡ ์žฅ ์ œ๊ฑฐ๋œ ์ƒํƒœ์˜ ๊ฒŒ์ž„ ํ™”๋ฉด์—์„œ ์ปค์„œ๋ฅผ ์ด๋™ํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ๋นˆ ์นธ์€ ์ด๋ฏธ ์นด๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์—†์–ด์ง„ ์นธ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„ ์นธ์€ ์นด๋“œ ์•ž ๋ฉด์— ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ์‹œ์—์„œ ์ปค์„œ๋Š” ๋‘๋ฒˆ์งธ ํ–‰, ์ฒซ๋ฒˆ์งธ ์—ด ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[Enter] ์ž…๋ ฅ, ↓ ์ด๋™, [Ctrl]+→ ์ด๋™, [Enter] ์ž…๋ ฅ = ํ‚ค ์กฐ์ž‘ 4ํšŒ

[Ctrl]+↑ ์ด๋™, [Enter] ์ž…๋ ฅ, [Ctrl]+← ์ด๋™, [Ctrl]+↓ ์ด๋™, [Enter] ์ž…๋ ฅ = ํ‚ค ์กฐ์ž‘ 5ํšŒ

[Ctrl]+→ ์ด๋™, [Enter] ์ž…๋ ฅ, [Ctrl]+↑ ์ด๋™, [Ctrl]+← ์ด๋™, [Enter] ์ž…๋ ฅ = ํ‚ค ์กฐ์ž‘ 5ํšŒ

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ปค์„œ๋ฅผ ์ด๋™ํ•˜์—ฌ ์นด๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๊ทธ๋ฆผ์„ ๋งž์ถ”์–ด ์นด๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด 14๋ฒˆ(๋ฐฉํ–ฅ ์ด๋™ 8๋ฒˆ, [Enter] ํ‚ค ์ž…๋ ฅ 6๋ฒˆ)์˜ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

[๋ฌธ์ œ]

ํ˜„์žฌ ์นด๋“œ๊ฐ€ ๋†“์ธ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด board์™€ ์ปค์„œ์˜ ์ฒ˜์Œ ์œ„์น˜ r, c๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์นด๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

๋‚ด ํ’€์ด

์นด๋“œ ์ˆœ์—ด์„ ๋งŒ๋“ค์–ด ๋ชจ๋“  ์ˆœ์—ด์˜ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜ ๊ตฌํ•œ ๋’ค, ํ‚ค ์กฐ์ž‘ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

์ตœ์†Œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜๋Š” BFS๋ฅผ ํ†ตํ•ด ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.

#include <string>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>

using namespace std;

int dRow[4] = { 1, -1, 0, 0 };
int dCol[4] = { 0, 0, 1, -1 };

struct cursor
{
    int row;
    int col;
    int count;

    cursor(int _row, int _col, int _count)
    {
        row = _row;
        col = _col;
        count = _count;
    }
};

int bfs(vector<vector<int>>& board, int card, int& startRow, int& startCol)
{
    vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size()));
    queue<cursor> q;
    q.push(cursor(startRow, startCol, 0));

    while (!q.empty())
    {
        cursor curCursor = q.front();
        q.pop();

        int row = curCursor.row;
        int col = curCursor.col;

        if (board[row][col] == card)
        {
            startRow = row;
            startCol = col;
            board[row][col] = 0;
            return curCursor.count + 1;
        }

        for (int i = 0; i < 4; ++i)
        {
            // ์ด๋™
            int nRow = row + dRow[i];
            int nCol = col + dCol[i];

            if (nRow < 0 || nRow >= board.size()
                || nCol < 0 || nCol >= board[0].size())
                continue;

            if (!visited[nRow][nCol])
            {
                visited[nRow][nCol] = true;
                q.push(cursor(nRow, nCol, curCursor.count + 1));
            }

            // ctrl + ์ด๋™
            nRow = row;
            nCol = col;
            while (true)
            {
                if (nRow + dRow[i] < 0 || nRow + dRow[i] >= board.size()
                    || nCol + dCol[i] < 0 || nCol + dCol[i] >= board[0].size())
                    break;

                nRow += dRow[i];
                nCol += dCol[i];

                if (board[nRow][nCol])
                    break;
            }

            if (!visited[nRow][nCol])
            {
                visited[nRow][nCol] = true;
                q.push(cursor(nRow, nCol, curCursor.count + 1));
            }

        }
    }

    return INT32_MAX;
}

int solution(vector<vector<int>> board, int r, int c) {
    int answer = INT32_MAX;
    set<int> cardset;

    // ์นด๋“œ ์ข…๋ฅ˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    for (int r = 0; r < board.size(); ++r)
        for (int c = 0; c < board[0].size(); ++c)
        {
            if (board[r][c])
                cardset.insert(board[r][c]);
        }
    vector<int> cards(cardset.begin(), cardset.end());

    // ์นด๋“œ ์ข…๋ฅ˜์˜ ์ˆœ์—ด๋งˆ๋‹ค ์ž…๋ ฅ ํšŸ์ˆ˜ ๊ฒ€์ƒ‰
    do
    {
        int count = 0;
        int startRow = r;
        int startCol = c;
        vector<vector<int>> curBoard = board;
        for (auto c : cards)
        {
            count += bfs(curBoard, c, startRow, startCol) + bfs(curBoard, c, startRow, startCol);
        }

        answer = min(answer, count);
    } while (next_permutation(cards.begin(), cards.end()));

    return answer;
}

์ฑ„์  ๊ฒฐ๊ณผ