Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 코딩테스트
- CSV
- hash table
- 구현
- GitHub
- Data Structure
- 코테
- Trie
- Python
- 시뮬레이션
- boj
- Priority Queue
- Bruth Force
- SQL
- Vue.js
- programmers
- spring boot
- SWEA
- Back tracking
- 모의SW역량테스트
- django
- 알고리듬
- aws
- Algorithm
- gpdb
- DFS
- JavaScript
- Linked list
- 알고리즘
- BFS
Archives
- Today
- Total
hotamul의 개발 이야기
[Algorithm][C++] BOJ 17837 새로운 게임 2 본문
myt-algorithm-practice/Samsung SW Certi Adv
[Algorithm][C++] BOJ 17837 새로운 게임 2
hotamul 2021. 9. 30. 19:33url: https://www.acmicpc.net/problem/17837
17837번: 새로운 게임 2
재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하
www.acmicpc.net
na982님 풀이 참고
[삼성 SW 역량 테스트] 새로운 게임 2
새로운 게임 2 강의 새로운 게임 2 코딩 #include struct POS { int y, x, d; }; const int dy[] = { 0, 0, -1, +1 }; const int dx[] = { +1, -1, 0, 0 }; int n, k; int color[12][12]; int map[12][12][5]; int..
na982.tistory.com
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct POS { int r, c, d; };
const int dr[] = { 0,0,-1,1 };
const int dc[] = { 1,-1,0,0 };
int n, k;
int color[12][12];
int map[12][12][5];
int pos_size;
POS pos[10];
int turn(int index) {
POS cur = pos[index];
POS next;
next.r = cur.r + dr[cur.d];
next.c = cur.c + dc[cur.d];
next.d = cur.d;
if (next.r < 0 || next.r >= n || next.c < 0 || next.c >= n || color[next.r][next.c] == 2) {
next.d = ((cur.d == 0 || cur.d == 2) ? (cur.d + 1) : (cur.d - 1));
next.r = cur.r + dr[next.d];
next.c = cur.c + dc[next.d];
pos[index].d = next.d;
if (next.r < 0 || next.r >= n || next.c < 0 || next.c >= n || color[next.r][next.c] == 2) {
return map[cur.r][cur.d][0];
}
}
int bottom = -1;
int& cur_size = map[cur.r][cur.c][0];
for (int i = 1; i <= cur_size; i++) {
if (map[cur.r][cur.c][i] == index) {
bottom = i;
break;
}
}
int move[5] = { 0, };
int& move_size = move[0];
for (int i = bottom; i <= cur_size; i++) {
move[++move_size] = map[cur.r][cur.c][i];
}
cur_size = bottom - 1;
if (color[next.r][next.c] == 1) {
for (int i = 1; i <= move_size / 2; i++) {
int temp = move[i];
move[i] = move[move_size - i + 1];
move[move_size - i + 1] = temp;
}
}
int& next_size = map[next.r][next.c][0];
for (int i = 1; i <= move_size; i++) {
map[next.r][next.c][++next_size] = move[i];
pos[move[i]].r = next.r;
pos[move[i]].c = next.c;
if (next_size >= 4) return next_size;
}
return next_size;
}
int main() {
scanf("%d %d", &n, &k);
for (int r = 0; r < n; r++) {
for (int c = 0; c < n; c++) {
scanf("%d", &color[r][c]);
}
}
for (int i = 0; i < k; i++) {
int r, c, d;
scanf("%d %d %d", &r, &c, &d);
--r, --c, --d;
pos[pos_size].r = r;
pos[pos_size].c = c;
pos[pos_size].d = d;
int& size = map[r][c][0];
map[r][c][++size] = pos_size;
++pos_size;
}
int loop = 0, ret = -1;
while (loop <= 1000 && ret == -1) {
++loop;
for (int i = 0; i < k; i++) {
int h = turn(i);
if (h >= 4) {
ret = loop;
break;
}
}
}
printf("%d", ret);
return 0;
}
아쉬운 점
1. 더블링크드리스트로 풀려고 열심히 코드를 짰는데 틀려서 풀 마음이 팍 식어버렸다..
2. 그냥 링크드리스트 오랜만에 다시 공부했다고 생각해야겠다.
3. na982님 풀이중 & 연산자 활용이 가장 마음에 들었다.
'myt-algorithm-practice > Samsung SW Certi Adv' 카테고리의 다른 글
[Algorithm][C++] BOJ 19236 청소년 상어 (0) | 2021.10.04 |
---|---|
[Algorithm][C++] BOJ 20055 컨베이어 벨트 위의 로봇 (0) | 2021.10.02 |
[Algorithm][C++] BOJ 17779 게리맨더링2 (0) | 2021.09.29 |
[Algorithm][C++] BOJ 19238 스타트 택시 (0) | 2021.09.29 |
[Algorithm][C++] BOJ 14890 경사로 (0) | 2021.09.28 |
Comments