일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 개발서
- #알고리즘 #백준 #1793 #백준1793 #algorithm #baekjoon #baekjoon1793 #C++
- #알고리즘 #백준 #17472 #백준17472 #algorithm #baekjoon #baekjoon17472 #C++
- #알고리즘 #백준 #2616 #백준2616 #algorithm #baekjoon #baekjoon2616 #Java
- #알고리즘 #백준 #1525 #백준1525 #algorithm #baekjoon #baekjoon1525 #C++
- #알고리즘 #백준 #12094 #백준12094 #algorithm #baekjoon #baekjoon12094 #C++
- #알고리즘 #백준 #17136 #백준17136 #algorithm #baekjoon #baekjoon17136 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #블록이동하기 #programmers #C++
- CleanCode
- #알고리즘 #백준 #1260 #백준1260 #algorithm #baekjoon #baekjoon1260 #Java
- #알고리즘 #백준 #15683 #백준15683 #algorithm #baekjoon #baekjoon15683 #C++
- #알고리즘 #백준 #1987 #백준1987 #algorithm #baekjoon #baekjoon1987 #Java
- #알고리즘 #백준 #2352 #백준2352 #algorithm #baekjoon #baekjoon2352 #C++
- #알고리즘 #백준 #2573 #백준2573 #algorithm #baekjoon #baekjoon2573 #C++
- #알고리즘 #백준 #2580 #백준2580 #algorithm #baekjoon #baekjoon2580 #Java
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #외벽점검 #programmers #C++
- 개발자취미
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #괄호변환 #programmers #C++
- #알고리즘 #백준 #4386 #백준4386 #algorithm #baekjoon #baekjoon4386 #C++
- 클린코드
- #알고리즘 #백준 #17140 #백준17140 #algorithm #baekjoon #baekjoon17140 #C++
- #알고리즘 #백준 #3190 #백준3190 #algorithm #baekjoon #baekjoon3190 #C++
- 책리뷰
- #알고리즘 #백준 #17406 #백준17406 #algorithm #baekjoon #baekjoon17406 #C++
- 스레드 #동시성 #thread #process #
- #알고리즘 #백준 #15684 #백준15684 #algorithm #baekjoon #baekjoon15684 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #문자열압축 #programmers #C++
- #알고리즘 #백준 #14888 #백준14888 #algorithm #baekjoon #baekjoon14888 #C++
- #알고리즘 #백준 #5214 #백준5214 #algorithm #baekjoon #baekjoon5214 #C++
- #알고리즘 #백준 #17837 #백준17837 #algorithm #baekjoon #baekjoon17837 #C++
Archives
- Today
- Total
개발자 일기장.
백준 17837. 새로운 게임2 본문
새로운 게임2
Problem?
문제 : https://www.acmicpc.net/problem/17837
Solution
문제 구현 문제
- 흰색, 파란색, 빨간색에 경우에 맞춰서 문제를 푼다.
- 특히 순서를 잘 관리하면서 움직이는 것을 확인하는 것이 중요한 문제이다.
Code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 12 + 1
struct knight_pos {
int y;
int x;
int dir;
};
pair<int, int> dir[5] = { {0, 0}, {0, 1},{0, -1},{-1, 0},{1, 0} };
int N, K;
int board[MAX][MAX];
vector<int> order[MAX][MAX];
vector<knight_pos> knight;
bool isInRange(int y, int x) {
if (y >= 1 && y <= N && x >= 1 && x <= N)
return true;
return false;
}
int main(int argc, const char* argv[]) {
// input
int r, c, d;
cin >> N >> K;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
scanf("%d", &board[i][j]);
for (int i = 0; i < K; i++) {
scanf("%d %d %d", &r, &c, &d);
knight.push_back({ r, c, d });
order[r][c].push_back(i);
}
// solution
int turn = 0;
while (true) {
if (turn > 1000)
break;
turn++;
for (int i = 0; i < K; i++) {
int curY = knight[i].y;
int curX = knight[i].x;
int nextY = curY + dir[knight[i].dir].first;
int nextX = curX + dir[knight[i].dir].second;
// 다음칸이 나가는 경우이거나 파란색인 경우
if (!isInRange(nextY, nextX) || board[nextY][nextX] == 2) {
if (knight[i].dir == 1 || knight[i].dir == 2) // 순서바꾸기
knight[i].dir = 3 - knight[i].dir;
else
knight[i].dir = 7 - knight[i].dir;
nextY = curY + dir[knight[i].dir].first;
nextX = curX + dir[knight[i].dir].second;
}
// 다음칸이 나가거나 파란색인 경우, 다시
if (!isInRange(nextY, nextX) || board[nextY][nextX] == 2)
continue;
else if (board[nextY][nextX] == 0) { // 하얀색
int idx = -1;
for (int j = 0; j < order[curY][curX].size(); j++) {
int t = order[curY][curX][j];
if (t == i)
idx = j;
if (idx == -1) continue; // 없는 경우
knight[t].y = nextY;
knight[t].x = nextX;
order[nextY][nextX].push_back(t);
if (order[nextY][nextX].size() >= 4) {
cout << turn << "\n";
return 0;
}
}
int cnt = (int)order[curY][curX].size();
for (int j = idx; j < cnt; j++)
order[curY][curX].pop_back();
}
else { // 빨간색
int idx = -1;
for (int j = (int)order[curY][curX].size() - 1; j >= 0; j--) {
int t = order[curY][curX][j];
if (t == i) {
idx = j;
break;
}
}
for (int j = (int)order[curY][curX].size() - 1; j >= idx; j--) {
int t = order[curY][curX][j];
knight[t].y = nextY;
knight[t].x = nextX;
order[nextY][nextX].push_back(t);
if (order[nextY][nextX].size() >= 4) {
cout << turn << "\n";
return 0;
}
}
int cnt = (int)order[curY][curX].size();
for (int j = idx; j < cnt; j++)
order[curY][curX].pop_back();
}
}
}
cout << "-1\n" << "\n";
return 0;
}
- 단순 구현 문제...
'취업 > Algorithm.' 카테고리의 다른 글
백준 2573. 빙산 (0) | 2020.05.01 |
---|---|
[2020카카오공채] 괄호 변환 (0) | 2020.04.11 |
백준 17140. 이차원배열과 연산 (0) | 2020.04.11 |
백준 15684. 사다리 조작 (0) | 2020.04.11 |
백준 17472. 다리만들기2 (0) | 2020.04.10 |