본문 바로가기

알고리즘/BOJ

1525번


1525번 - 퍼즐


이 문제는 처음에 배열로 풀었다. 나름 머리쓴다고, 했지만 결국은 메모리 초과로 인한 런타임 오류...


그래서 STL map 을 공부해서 풀었다. 


일단 map 은 정말 사용하기 좋은 template 인거 같다... 정렬도 되고, 배열처럼 사용할 수도 있고... 단 중복은 안되므로 그럴때는 multimap을 이용.


처음에 map을 배워서 map 의 인덱스 값으로 string을 이용했는데, 이 마저도 메모리 초과가 일어났다.


그래서 결국은 string 을 stoi 함수를 통해 모두 int 로 변경에서 index 로 입력했더니 AC를 받을 수 있었다.


결국 이 문제는 3 x 3 크기의 맵을 int 형 변수로 변경하고, 이를 map 을 통해 방문여부 체크하는 용도로 사용하여, bfs를 돌리면 되는 문제였다.



<정답 코드>


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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include<iostream>
#include<map>
#include<string>
#include<queue>
using namespace std;
 
int dx[4= { 0,0,1,-1 };
int dy[4= { 1,-1,0,0 };
int m[3][3];
string mToString(int tmp[][3])
{
    string ret = "";
 
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            ret += tmp[i][j] + '0';
        }
    }
 
    return ret;
}
string makeNewM(int x,int y,int nx,int ny,string M)
{
    int tmp[3][3];
    int cnt = 0;
 
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            tmp[i][j] = M[cnt++]-'0';
        }
    }
 
    swap(tmp[x][y], tmp[nx][ny]);
 
    string ret = mToString(tmp);
 
    return ret;
}
int main()
{
    int x0, y0;
    string m0;
    int goal = 123456780;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cin >> m[i][j];
            if (m[i][j] == 0)
            {
                x0 = i;
                y0 = j;
            }
        }
    }
    m0 = mToString(m);
    map<intint> distance;
    queue<pair<pair<int,int>,string>> q;
    q.push(make_pair(make_pair(x0, y0), m0));
    distance[stoi(m0)] = 0;
 
    while (!q.empty())
    {
        int x = q.front().first.first;
        int y = q.front().first.second;
        string M = q.front().second;
        q.pop();
 
        if (stoi(M) == goal)
        {
            break;
        }
 
        for (int d = 0; d < 4; d++)
        {
            int nx = x + dx[d];
            int ny = y + dy[d];
 
            if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3)
            {
                string nM = makeNewM(x,y,nx,ny,M);
                if (distance.count(stoi(nM)) == 0)
                {
                    distance[stoi(nM)] = distance[stoi(M)] + 1;
                    q.push(make_pair(make_pair(nx, ny), nM));
                }
            }
        }
 
    }
 
    if (distance.count(goal) == 0)
    {
        cout << "-1" << endl;
    }
    else
    {
        cout << distance[goal] << endl;
    }
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

3108번  (0) 2017.12.13
2186번  (0) 2017.12.13
1963번  (0) 2017.12.12
10971번  (0) 2017.12.12
10819번  (0) 2017.12.12