반응형
리뷰
https://www.acmicpc.net/problem/14226
이중 해시맵을 사용하여 AC를 받은 문제
전역 변수
- s : 목표 이모티콘의 개수를 저장할 변수
- v : 방문 여부를 체크하기 위한 이중 해시맵, key는 둘다 정수이며 value는 bool타입으로 정의했다.
- Emo : 화면, 클립보드, 걸린 시간을 정의할 구조체, 걸린 시간을 기준으로 오름차순 정렬한다.
함수
1. bfs
int bfs()
이모티콘을 복사, 붙여넣기, 삭제를 진행하며 목표 개수까지의 최소 시간을 구하기 위한 함수
- Emo타입의 우선순위 큐 pq를 초기화 한다.
- 화면의 초기값 1, 클립보드의 초기값 0, 걸린 시간의 초기값 0을 push해준다.
- 화면의 초기값 1, 클립보드의 초기값 0에 방문 표시를 해시맵 v에 진행해 준다.
- pq가 빌 때 까지 while루프를 수행하며, 매 루프마다 요소를 한개씩 꺼내준다.
- 정수형 변수 cw, cc, ct에 현재 화면의 이모티콘 개수, 클립보드의 이모티콘 개수, 걸린 시간을 파싱해 준다.
- 기저 조건으로 cw가 s와 동일하다면 ct를 리턴해 준다.
- 3가지 연산의 결과값이 아직 방문처리 되지 않았다면 연산의 결과값을 방문처리 후 pq에 push해준다.
- 기저 조건에 도달할 때 까지 위 로직을 반복 수행해 준다.
문제풀이
- s에 목표 이모티콘의 개수를 입력 받아준다.
- bfs함수를 호출하고 리턴 값을 출력해 준다.
트러블 슈팅
- 처음엔 1001 * 1001크기의 배열로 방문 처리를 진행했지만 일부 케이스에 문제가 있었다.
- 따라서 이중 해시맵을 사용했더니 생각보다 시간과 공간 복잡도가 널널하게 AC를 받게 되었다.
참고 사항
- S개의 이모티콘을 만들지 못하는 경우는 없다.
- 시뮬레이션 시 1000보다 높은 값에서 값을 줄여나가는 경우도 있을 것 같다. (범위 조정을 잘해야 함)
정답 코드
#include<iostream>
#include<queue>
#include<unordered_map>
using namespace std;
int s;
unordered_map<int, unordered_map<int, bool>> v;
struct Emo {
int w, c, t;
bool operator<(const Emo& other) const {
return t > other.t;
}
};
int bfs() {
priority_queue<Emo> pq;
pq.push({ 1, 0, 0 });
v[1][0] = 1;
while (!pq.empty()) {
Emo emo = pq.top(); pq.pop();
int cw = emo.w, cc = emo.c, ct = emo.t;
if (cw == s) return ct;
if (!v[cw][cw]) {
v[cw][cw] = 1;
pq.push({ cw, cw, ct + 1 });
}
if (cc && abs(s - cw) > abs(cw + cc - s) && !v[cw + cc][cc]) {
v[cw + cc][cc] = 1;
pq.push({ cw + cc, cc, ct + 1 });
}
if (!v[cw - 1][cc]) {
v[cw - 1][cc] = 1;
pq.push({ cw - 1, cc, ct + 1 });
}
}
return -1;
}
int main() {
cin >> s;
cout << bfs();
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G4] 백준 14938번 서강그라운드 C++ 다익스트라, 최단 경로 (0) | 2024.12.23 |
---|---|
[G3] 백준 1939번 중량제한 C++ 다익스트라, 우선순위 큐, 최단 경로 (0) | 2024.12.22 |
[G3] 백준 14442번 벽 부수고 이동하기 2 C++ 너비 우선 탐색, 우선순위 큐 (0) | 2024.12.20 |
[G3] 백준 2638번 치즈 C++ 너비 우선 탐색, 해시맵, 구현, 시뮬레이션 (0) | 2024.12.19 |
[G3] 백준 1600번 말이 되고픈 원숭이 C++ 너비 우선 탐색, 우선순위 큐, 시뮬레이션 (0) | 2024.12.17 |