[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.3 - ์ž๋ฌผ์‡ ์™€ ์—ด์‡ (C++)

2023. 6. 21. 14:32ยท๐Ÿ–ฅ๏ธ Study Note/Coding Test

๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/60059#qna

 

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

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

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

๊ณ ๊ณ ํ•™์ž์ธ ํŠœ๋ธŒ๋Š” ๊ณ ๋Œ€ ์œ ์ ์ง€์—์„œ ๋ณด๋ฌผ๊ณผ ์œ ์ ์ด ๊ฐ€๋“ํ•  ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋Š” ๋น„๋ฐ€์˜ ๋ฌธ์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‚ดํŽด๋ณด๋‹ˆ ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์ž๋ฌผ์‡ ๋กœ ์ž ๊ฒจ ์žˆ์—ˆ๊ณ  ๋ฌธ ์•ž์—๋Š” ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์—ด์‡ ์™€ ํ•จ๊ป˜ ์ž๋ฌผ์‡ ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ด ์ฃผ๋Š” ์ข…์ด๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž ๊ฒจ์žˆ๋Š” ์ž๋ฌผ์‡ ๋Š” ๊ฒฉ์ž ํ•œ ์นธ์˜ ํฌ๊ธฐ๊ฐ€ 1 x 1์ธ N x N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐ ๊ฒฉ์ž ํ˜•ํƒœ์ด๊ณ  ํŠน์ดํ•œ ๋ชจ์–‘์˜ ์—ด์‡ ๋Š” M x M ํฌ๊ธฐ์ธ ์ •์‚ฌ๊ฐ ๊ฒฉ์ž ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฌผ์‡ ์—๋Š” ํ™ˆ์ด ํŒŒ์—ฌ ์žˆ๊ณ  ์—ด์‡  ๋˜ํ•œ ํ™ˆ๊ณผ ๋Œ๊ธฐ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด์‡ ๋Š” ํšŒ์ „๊ณผ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์—ด์‡ ์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„์„ ์ž๋ฌผ์‡ ์˜ ํ™ˆ ๋ถ€๋ถ„์— ๋”ฑ ๋งž๊ฒŒ ์ฑ„์šฐ๋ฉด ์ž๋ฌผ์‡ ๊ฐ€ ์—ด๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ž๋ฌผ์‡  ์˜์—ญ์„ ๋ฒ—์–ด๋‚œ ๋ถ€๋ถ„์— ์žˆ๋Š” ์—ด์‡ ์˜ ํ™ˆ๊ณผ ๋Œ๊ธฐ๋Š” ์ž๋ฌผ์‡ ๋ฅผ ์—ฌ๋Š” ๋ฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ, ์ž๋ฌผ์‡  ์˜์—ญ ๋‚ด์—์„œ๋Š” ์—ด์‡ ์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„๊ณผ ์ž๋ฌผ์‡ ์˜ ํ™ˆ ๋ถ€๋ถ„์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ์—ด์‡ ์˜ ๋Œ๊ธฐ์™€ ์ž๋ฌผ์‡ ์˜ ๋Œ๊ธฐ๊ฐ€ ๋งŒ๋‚˜์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž๋ฌผ์‡ ์˜ ๋ชจ๋“  ํ™ˆ์„ ์ฑ„์›Œ ๋น„์–ด์žˆ๋Š” ๊ณณ์ด ์—†์–ด์•ผ ์ž๋ฌผ์‡ ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด์‡ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด key์™€ ์ž๋ฌผ์‡ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด lock์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์—ด์‡ ๋กœ ์ž๋ฌผ์‡ ๋ฅผ ์—ด์ˆ˜ ์žˆ์œผ๋ฉด true๋ฅผ, ์—ด ์ˆ˜ ์—†์œผ๋ฉด false๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • key๋Š” M x M(3 ≤ M ≤ 20, M์€ ์ž์—ฐ์ˆ˜)ํฌ๊ธฐ 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • lock์€ N x N(3 ≤ N ≤ 20, N์€ ์ž์—ฐ์ˆ˜)ํฌ๊ธฐ 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • M์€ ํ•ญ์ƒ N ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • key์™€ lock์˜ ์›์†Œ๋Š” 0 ๋˜๋Š” 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 0์€ ํ™ˆ ๋ถ€๋ถ„, 1์€ ๋Œ๊ธฐ ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

key lock result
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

์ž…์ถœ๋ ฅ ์˜ˆ์— ๋Œ€ํ•œ ์„ค๋ช…

key๋ฅผ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ, ์•„๋ž˜๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๋ฉด lock์˜ ํ™ˆ ๋ถ€๋ถ„์„ ์ •ํ™•ํžˆ ๋ชจ๋‘ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‚ด ํ’€์ด

์ค‘์š”ํ•œ ํฌ์ธํŠธ

1. lock๊ณผ key๋ฅผ ํŽธํ•˜๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐฐ์—ด์„ key.size()-1๋งŒํผ ํ™•์žฅํ•œ๋‹ค.

2. ๋น„๊ต ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ ๋ฐ˜๋ณต๋ฌธ์„ ์ตœ๋Œ€ํ•œ ๋œ ๋Œ๊ฒŒ ํ•œ๋‹ค.

3. ๋ฒ”์œ„ ๋‚ด์—์„œ ํ‚ค๋ฅผ 4ํšŒ์ „ํ•˜๋ฉฐ ๋น„๊ตํ•œ๋‹ค.

#include <string>
#include <vector>
#include <limits>

using namespace std;

bool isMatch(const vector<vector<int>>& map, const vector<vector<int>>& key, int row, int col, int count);
void RotateKey(vector<vector<int>>& key);

bool solution(vector<vector<int>> key, vector<vector<int>> lock) 
{
    int key_size = key.size() - 1;
    int map_size = lock.size() + 2 * key_size;
    
    // ํ‚ค์˜ ํฌ๊ธฐ๋งŒํผ ์—ฌ์œ ์žˆ๊ฒŒ ๋ฐฐ์—ด์„ ํ™•์žฅํ•œ๋‹ค.
    vector<vector<int>> map(map_size, vector<int>(map_size, -1));

    // ํ™ˆ ๊ฐœ์ˆ˜
    int concave_count = 0;

    int imin = std::numeric_limits<int>::min();
    int imax = std::numeric_limits<int>::max();
    
    // ํƒ์ƒ‰ ๋ฒ”์œ„
    int search_range_row[] = { imax, imin };
    int search_range_col[] = { imax, imin };

    for (int c = 0; c < lock.size(); ++c)
    {
        for (int r = 0; r < lock.size(); ++r)
        {
            int newRow = key_size + r;
            int newCol = key_size + c;

            // ์ž๋ฌผ์‡ ๋ฅผ map์— ์ฑ„์šฐ๊ธฐ
            map[newCol][newRow] = lock[c][r];

            if (lock[c][r] == 0)
            {
                ++concave_count;
                
                // ํƒ์ƒ‰ ๋ฒ”์œ„ ์กฐ์ •
                if (newRow < search_range_row[0])
                    search_range_row[0] = newRow;

                if (newRow > search_range_row[1])
                    search_range_row[1] = newRow;

                if (newCol < search_range_col[0])
                    search_range_col[0] = newCol;

                if (newCol > search_range_col[1])
                    search_range_col[1] = newCol;

            }
        }
    }

    // ํ™ˆ์ด ์—†์œผ๋ฉด ํ‚ค์™€ ์ƒ๊ด€์—†์ด ์—ด ์ˆ˜ ์žˆ๋‹ค.
    if (concave_count == 0)
        return true;

    // ์‹œ์ž‘ ์œ„์น˜ key ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ ์กฐ์ ˆ
    search_range_row[0] -= key_size;
    search_range_col[0] -= key_size;

    
    // ํƒ์ƒ‰ ๋ฒ”์œ„ ๋‚ด์—์„œ ํ‚ค๋ฅผ 4ํšŒ์ „ ํ•˜๋ฉด์„œ ์ฐพ๊ธฐ
    for (int t = 0; t < 4; ++t)
    {
        for (int col = search_range_col[0]; col <= search_range_col[1]; ++col)
        {
            for (int row = search_range_row[0]; row <= search_range_row[1]; ++row)
            {
                if (isMatch(map, key, row, col, concave_count))
                    return true;
            }
        }

        RotateKey(key);
    }

    return false;
}

// ํ‚ค ํšŒ์ „
void RotateKey(vector<vector<int>>& key)
{
    vector<vector<int>> tmp(key.size(), vector<int>(key.size(), 0));

    for (int y = 0; y < key.size(); ++y)
        for (int x = 0; x < key.size(); ++x)
        {
            tmp[y][x] = key[key.size() - x - 1][y];
        }

    key = tmp;
}

// ํ‚ค์™€ ์ž๋ฌผ์‡ ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
bool isMatch(const vector<vector<int>>& map, const vector<vector<int>>& key, int row, int col, int count)
{
    for (int c = col; c < col + key.size(); ++c)
    {
        for (int r = row; r < row + key.size(); ++r)
        {
            // ๋‘˜ ๋‹ค ๋Œ๊ธฐ์ธ ๊ฒฝ์šฐ
            if (map[c][r] == 1 && key[c - col][r - row] == 1) 
                return false;
            
            // ๋‘˜ ๋‹ค ํ™ˆ์ธ ๊ฒฝ์šฐ
            if (map[c][r] == 0 && key[c - col][r - row] == 0) 
                return false;

            // ์ž๋ฌผ์‡ ๋Š” ํ™ˆ์ด๊ณ  ์—ด๋˜๋Š” ๋Œ๊ธฐ์ธ ๊ฒฝ์šฐ
            if (map[c][r] == 0 && key[c - col][r - row] == 1) 
                --count;
        }
    }
    
    // ๋ชจ๋“  ํ™ˆ์ด ์ฑ„์›Œ์กŒ๋‹ค๋ฉด
    if (count == 0)
        return true;

    return false;
}

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ–ฅ๏ธ Study Note > Coding Test' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.2 - ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ(C++)  (0) 2023.06.25
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.3 - ๋ฉ€๋ฆฌ ๋›ฐ๊ธฐ(C++)  (0) 2023.06.23
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.1 - ํ•˜์ƒค๋“œ ์ˆ˜(C++)  (0) 2023.06.20
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.2 - ํƒ๋ฐฐ ์ƒ์ž(C++)  (0) 2023.06.19
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.2 - ํ˜ธํ…” ๋Œ€์‹ค(C++)  (0) 2023.06.18
'๐Ÿ–ฅ๏ธ Study Note/Coding Test' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.2 - ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ(C++)
  • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.3 - ๋ฉ€๋ฆฌ ๋›ฐ๊ธฐ(C++)
  • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.1 - ํ•˜์ƒค๋“œ ์ˆ˜(C++)
  • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.2 - ํƒ๋ฐฐ ์ƒ์ž(C++)
Beankong_
Beankong_
์ฃผ๋‹ˆ์–ด ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ณต๋ถ€ ๊ธฐ๋ก
  • Beankong_
    Beankong's Devlog
    Beankong_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด ๊ธ€ (141)
      • โ›… Daily (0)
      • ๐Ÿ–ฅ๏ธ Study Note (135)
        • Unreal Engine (5)
        • Coding Test (123)
        • Design Patteren (5)
        • VCS (Git..) (1)
        • Server (1)
      • ๐Ÿงญ Devlog (6)
        • ์˜ค๋‹ต๋…ธํŠธ (2)
        • UE5 GameLift Server Test Project (1)
        • TIL (3)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
Beankong_
[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]level.3 - ์ž๋ฌผ์‡ ์™€ ์—ด์‡ (C++)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”