๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/60059#qna
๋ฌธ์ ์ค๋ช
๊ณ ๊ณ ํ์์ธ ํ๋ธ๋ ๊ณ ๋ ์ ์ ์ง์์ ๋ณด๋ฌผ๊ณผ ์ ์ ์ด ๊ฐ๋ํ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๋น๋ฐ์ ๋ฌธ์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์ด๋ ค๊ณ ์ดํด๋ณด๋ ํน์ดํ ํํ์ ์๋ฌผ์ ๋ก ์ ๊ฒจ ์์๊ณ ๋ฌธ ์์๋ ํน์ดํ ํํ์ ์ด์ ์ ํจ๊ป ์๋ฌผ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํด ์ฃผ๋ ์ข ์ด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ ๊ฒจ์๋ ์๋ฌผ์ ๋ ๊ฒฉ์ ํ ์นธ์ ํฌ๊ธฐ๊ฐ 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 |