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
- algorithm
- 티스토리챌린지
- GeeksForGeeks
- 프로그래머스
- 2294
- UE5
- DirectX11
- RVO
- 1563
- UnrealEngine4
- 백준
- IFileDialog
- Unreal Engine5
- const
- 오블완
- NRVO
- 팰린드롬 만들기
- C
- winapi
- 언리얼엔진5
- directx
- DeferredRendering
- 줄 세우기
- Programmers
- RootMotion
- Frustum
- C++
- softeer
- baekjoon
- UnrealEngine5
Archives
- Today
- Total
Game Develop
[Algorithm]Baekjoon 14226번 : 이모티콘 본문
https://www.acmicpc.net/problem/14226
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
|
struct Node
{
int displayNum;
int boardNum;
int depth;
Node() {};
Node(int _displayNum, int _boardNum, int _depth) : displayNum(_displayNum), boardNum(_boardNum), depth(_depth) {};
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int s = 0;
int answer = 1000000000;
map<pair<int, int>, bool> visited;
queue<Node> q;
q.push(Node(1, 0, 0)); // 화면, 보드, 트리깊이
visited[{1, 0}] = true;
cin >> s;
while (!q.empty())
{
Node curNode = q.front();
q.pop();
int curDisplayNum = curNode.displayNum;
int curBoardNum = curNode.boardNum;
int curDepth = curNode.depth;
if (curDisplayNum == s)
{
answer = curDepth;
break;
}
// 첫번째 작업
int dn1 = curDisplayNum; // 그대로
int bn1 = curDisplayNum; // 화면->보드 복사
// 두번째 작업
int dn2 = curDisplayNum + curBoardNum; // 화면 + 보드
int bn2 = curBoardNum; // 그대로
// 세번째 작업
int dn3 = curDisplayNum - 1; // 1개삭제
int bn3 = curBoardNum; // 그대로.
if (dn1 <= s && !visited[{dn1, bn1}])
{
visited[{dn1, bn1}] = true;
q.push(Node(dn1, bn1, curDepth + 1));
}
if (dn2 <= s && !visited[{dn2, bn2}] )
{
visited[{dn2, bn2}] = true;
q.push(Node(dn2, bn2, curDepth + 1));
}
if (dn3 >= 0 && !visited[{dn3, bn3}])
{
visited[{dn3, bn3}] = true;
q.push(Node(dn3, bn3, curDepth + 1));
}
}
cout << answer;
}
|
cs |
각 간선의 가중치는 1인 기본 BFS문제이고, 대신 각 정점은 화면의 이모티콘갯수가 아니라, 화면의 이모티콘개수 + 보드의 이모티콘개수이다.
즉, 방문체크를 할 때 두 값을 셋트로해서 검사해야한다.
방문체크용 자료구조를 map으로 했기 때문에 따로 사이즈를 처음에 할당할 필요는 없다.bool의 default는 false이기 때문에 위처럼 코드를 짜는게 가능하다.
푸쉬여부를 체크할때의 dn1, dn2값범위 체크는 s이하이면 된다. 보통 이런문제 풀때 그냥 최대값으로(이번문제같은경우 1000) 잡고 검사하기도 하는데, 물론 이렇게해도 통과가 되기는 한다.
다만 조금이라도 시간을 줄일 수 있다면 줄이는게 맞으니 s까지만 검사하도록 하자.
최대값으로 할 경우 12ms가 나오고 s까지만 하면 8ms가 나온다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[Algorithm] Baekjoon 1339번 : 단어 수학 (0) | 2022.10.13 |
---|---|
[Algorithm] Baekjoon 2589번 : 보물섬 (1) | 2022.10.08 |
[Algorithm]Baekjoon 13913번 : 숨바꼭질4 (0) | 2022.09.14 |
[Algorithm]Baekjoon 13549번 : 숨바꼭질3 (0) | 2022.09.14 |
[Algorithm]Baekjoon 12851번 : 숨바꼭질2 (0) | 2022.09.13 |