BOJ : https://www.acmicpc.net/problem/1525
github : https://github.com/junho0956/Algorithm/blob/master/1525/1525/%EC%86%8C%EC%8A%A4.cpp
퍼즐은 내 초보적 지식으로는 해결하는데 어려움이 있는 문제였다.
숫자가 9개가 주어진다는 점에서 3*3 배열을 사용하는 것이 아닌
9개를 나열한 int형 수를 사용하면 된다는 점까지는 접근하였다.
하지만 이 정보가지고는 BFS 를 돌리는데 문제가 있었다.
9자리 int형이면 정말 가능한 모든 범위는 987654321 까지는 봐야한다는 점인데,
이걸 방문배열을 통해서 확인하려고 하니
저정도의 큰 크기를 가진 배열을 사용할수도 없고,
그렇다고 만들어진 수를 이용해서 이분탐색으로 찾아볼려니
매번 정렬해야한다는 단점이 있어서 시간초과를 어떤식으로 해결해야할지 접근을 못했었다.
그러다가 알게된 방법이 set , map 이라는 STL 템플릿이였고,
이중에서 set 을 사용하였다.
set 을 아직 공부를 하지않아 정확한 개념을 모르지만, 어떤 값에 대한 유무를 판별하는데 사용된다고 한다.
내부 구현을 몰라서 뭐 어떤식으로 값에 대한 유무 판단을 하는 것인지는 모르겠지만
일단 사용해보았는데? 정말 빨랐다.
디버깅을 해보았는데 살짝 Heap 같이 원소를 넣을때마다 자동정렬이 되는 것을 확인하였다.
조만간 set의 내부구현, 작동원리에 대해서 공부하여 포스팅하는 시간을 가져보도록 해야겠다.
이 문제의 핵심은,
3*3 배열을 사용하는 것이 아닌, 9자리 int 형 숫자를 이용하여
완전탐색 식의 BFS 을 통해 문제를 해결하는 것이고
주의할 점은, 0이 아닌 9를 사용해야한다는점 ( 위에서도 설명했다 )
맨 왼쪽, 맨 오른쪽은 -1, +1 에 의한 변경이 안된다는 점만 주의하면 된다.
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
|
#include <iostream>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
string ans = "123456789";
queue<pair<string, int> > q;
set<int> visit;
bool check_visit(string str) {
int key = stoi(str);
else return true;
}
void changing(string change, int index, int cnt, int location) {
if (location +index >= 0 && location + index < 9) {
if (location % 3 == 1 || (location % 3 == 2 && index != 1) || (location % 3 == 0 && index != -1)) {
swap(change[location], change[location + index]);
}
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int n;
string str;
bool solve = false;
for (int i = 0; i < 9; i++) {
cin >> n;
if (n == 0) n = 9;
str.push_back(n+'0');
}
q.push({ str,0 });
while (!q.empty()) {
string check = q.front().first;
int cnt = q.front().second;
q.pop();
if (check.compare(ans) == 0) {
cout << cnt;
solve = true;
break;
}
changing(check, -3, cnt, location);
changing(check, 3, cnt, location);
changing(check, -1, cnt, location);
changing(check, 1, cnt, location);
}
if (!solve) cout << "-1";
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'algorithm > BOJ' 카테고리의 다른 글
BOJ 2186번 문자판 (0) | 2020.01.27 |
---|---|
BOJ 2251번 물통 (0) | 2020.01.24 |
BOJ 9019번 DSLR (0) | 2020.01.23 |
BOJ 1963번 소수 경로 (0) | 2020.01.23 |
BOJ 13913번 숨바꼭질4 (0) | 2020.01.23 |