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
- 유니온파인드
- 삼성 #코테 #2020상반기 #c++
- 소감
- 스마일게이트
- 식단
- 투포인터
- 중반부
- 서버개발캠프
- 카카오인턴
- BFS
- 코딩테스트
- 1편
- 코테
- Union-find
- 카카오
- Algorithm
- IBK기업은행 #기업은행 #디지털 #직무 #정리
- LIS #Algorithm #요소추적
- 알고리즘
- 백준
- c++
- BaekJoon
- Smilegate
- 보석쇼핑
Archives
- Today
- Total
짱아의 개발 기록장
백준 1525번. 퍼즐(c++) / BFS 본문
반응형
BFS 자체는 어렵지 않았지만, 퍼즐의 상태를 어떻게 저장할지가 굉장히 까다롭게 느껴졌다.
2차원 배열에 저장하려고 했지만,,, 어떻게 보면 BruteForce로 모든 경우를 다 돌아야하기 때문에
2차원으로 한다면,,,, 아주 복잡해지고 메모리도 많이 차지할 것으로 생각되었다.
따라서, 다른 고수분들을 어떻게 코드를 짜셨을까 보다가 대부분 String형태로 저장해놓고 0의 인덱스 값을 찾아서
그것을 2차원 배열의 (x, y) 값으로 바꾸고 인접한 곳과 자리를 바꾸는 형식으로.,,,,
구현하셨더라,,, 아주 최적화된 좋은 방법이라 생각되어 그렇게 구현해보았다.
즉, 2차원 배열의 형태로 되어있어야 bfs를 하기 쉽기 때문에
퍼즐의 상태를 한눈에 보기 쉽게 해서 0의 위치를 찾을 때에는 => String형태
BFS를 돌기 위해서는(0주위에 있는 좌표와 swap을 하기 위해) => 2차원 배열의 형태
이렇게 나눠주었고
String -> 2차원 배열의 좌표
2차원 배열의 좌표 -> String
이렇게 변환해주는 것은 간단한 연산을 통해 해결했다. (코드 참조)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
// 퍼즐
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <string>
using namespace std;
int puzzle[4][4] = { 0, };
int dx[4] = { 0, 0, -1, 1 };
int dy[4] = { -1, 1, 0, 0 };
string arrayToString()
{
string tmp = "";
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tmp += (puzzle[i][j]+'0');
}
}
return tmp;
}
int move()
{
queue<pair<string, int>> q;
map<string, int> check;
q.push(make_pair(arrayToString(), 0));
while (!q.empty()) {
string s = q.front().first;
int cnt = q.front().second;
check[s] = 1;
q.pop();
if (s == "123456780") {
return cnt;
}
int idx = s.find('0');
int x = idx / 3;
int y = idx % 3;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0 <= nx && nx < 3 && 0 <= ny && ny < 3) {
string tmp = s;
swap(tmp[x * 3 + y], tmp[nx * 3 + ny]);
if (check.count(tmp) == 0) {
check[tmp] = 1;
q.push(make_pair(tmp, cnt + 1));
}
}
}
}
return -1;
}
int main()
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cin >> puzzle[i][j];
}
}
cout << move() << "\n";
return 0;
}
|
cs |
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 7490번. 0 만들기(c++) / 구현 (0) | 2021.04.01 |
---|---|
백준 1194번. 달이 차오른다, 가자(c++) / BFS+비트마스킹 (0) | 2021.04.01 |
백준 9328번. 열쇠(c++) / BFS+비트마스크 (0) | 2021.03.30 |
백준 2146번. 다리 만들기(c++) / BFS (0) | 2021.03.30 |
백준 17472번. 다리 만들기2(c++) / BFS+유니온파인드 (0) | 2021.03.29 |
Comments