#사람마다 푼 방법이 다릅니다. 아 이런 코드도 있구나라는 생각만 가져주시면 감사하겠습니다. 제 코드에 있어서 비효율적인 부분이 있으면 댓글로 남겨놔 주시면 참고하여 성장할 수 있도록 하겠습니다!!!
하지만!!! 무분별한 비난은 삼가 주세요!
해당 문제는 처음 생각해보면 어렵지만, 규칙을 알면 쉽게 풀 수 있습니다.
세대를 지날수록 vector에 제일 마지막으로 추가된 방향부터 제일 처음의 방향까지 +1 한 값을 vector에 추가해줍니다. 중요한 점은, vector의 size를 미리 변수에 넣어줌으로써 예외처리를 막을 수 있습니다. 만약 추가해야 할 방향이 4면 범위를 벗어나기 때문에 0으로 만들어줌으로써 해결할 수 있습니다.
#include<iostream>
#include<vector>
#define SIZE 101
using namespace std;
int dx[4] = {0,-1,0,1};
int dy[4] = {1,0,-1,0};
vector<int> dir;
bool visit[SIZE][SIZE];
void init() {
for (int a = 0; a < SIZE; a++) {
for (int b = 0; b < SIZE; b++) {
visit[a][b] = false;
}
}
}
int checkResult() {
int ans = 0;
for (int a = 0; a < SIZE-1; a++) {
for (int b = 0; b < SIZE-1; b++) {
if (visit[a][b] && visit[a][b + 1] && visit[a + 1][b] && visit[a + 1][b + 1]) {
ans++;
}
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t, x, y, d, g;
cin >> t;
init();
for (int a = 0; a < t; a++) {
dir.clear();
cin >> y >> x >> d >> g;
visit[x][y] = true;
dir.push_back(d);
for (int a = 0; a < g; a++) {
//미리 vector의 사이즈를 받아서 반복문 시작해야한다.
int index = dir.size() - 1;
for (int b = index; b >= 0; b--) {
int td = dir[b];
td += 1;
if (td == 4) td = 0;
dir.push_back(td);
}
}
for (int a = 0; a < dir.size(); a++) {
x = x + dx[dir[a]];
y = y + dy[dir[a]];
//배열의 범위를 벗어나지 않아야한다.
if (x >= 0 && y >= 0 && x < SIZE && y < SIZE) {
visit[x][y] = true;
}
}
}
cout << checkResult();
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon] 백준 C++ 16235 나무재테크 (0) | 2021.09.20 |
---|---|
[Baekjoon] 백준 C++ 14499 주사위 굴리기 (0) | 2021.09.16 |
[Baekjoon] 백준 C++ 15686 치킨배달 (0) | 2021.09.13 |
[Baekjoon] C++ 12100 EASY (0) | 2021.09.12 |