월간 코드 챌린지의 레벨 3 문제였다.
처음엔 무작정 Brute Force로 풀어 보았다.
하지만 이 문제에선 범위가 10억까지 가기 때문에 당연히 시간초과가 났다.
1차 시도 : Brute force
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool move_ball(int st_x, int st_y, int dest_x, int dest_y, vector<vector<int>> queries, vector<vector<char>> maps) {
int col_limit = maps[0].size();
int row_limit = maps.size();
maps[st_x][st_y] = 'P'; // init
int new_x = st_x, new_y = st_y;
int prev_x = st_x, prev_y = st_y;
for (auto query : queries) {
switch (query[0])
{
case 0:
if (prev_y - query[1] >= 0) {
new_x = prev_x;
new_y = prev_y - query[1];
swap(maps[prev_x][prev_y], maps[new_x][new_y]);
}
break;
case 1:
if (prev_y + query[1] < col_limit) {
new_x = prev_x;
new_y = prev_y + query[1];
swap(maps[prev_x][prev_y], maps[new_x][new_y]);
}
break;
case 2:
if (prev_x - query[1] >= 0) {
new_x = prev_x - query[1];
new_y = prev_y;
swap(maps[prev_x][prev_y], maps[new_x][new_y]);
}
break;
case 3:
if (prev_x + query[1] < row_limit) {
new_x = prev_x + query[1];
new_y = prev_y;
swap(maps[prev_x][prev_y], maps[new_x][new_y]);
}
break;
}
prev_x = new_x; prev_y = new_y;
}
if (maps[dest_x][dest_y] == 'P') return true;
else return false;
}
long long do_query(int n, int m, int x, int y, vector<vector<int>> queries, vector<vector<char>> maps) {
long long answer = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (move_ball(i, j, x, y, queries, maps)) answer++;
return answer;
}
long long solution(int n, int m, int x, int y, vector<vector<int>> queries) {
long long answer = 0;
vector<vector<char>> maps(n, vector<char>(m, '0'));
answer = do_query(n, m, x, y, queries, maps);
return answer;
}
곰곰히 생각을 해보다가, 도저히 내 머리로는 푸는데에 한계가 있었다.
그래서 다른 사람들의 풀이를 결국 보게 되었다.