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 |
Tags
- Gold 4
- BFS
- level 1
- Gold 5
- 월간 코드 챌린지
- 2020 KAKAO BLIND
- Level 2
- DP
- 백트래킹
- 시뮬레이션
- 스택/큐
- 그리디
- Level 4
- next_permutation
- SWEA
- c++
- Level 3
- 부스트코스
- DFS
- 구현
- 삼성 SW 역량 테스트
- 프로그래머스
- 코드 리뷰
- 브루트포스
- 코드리뷰
- 백준
- 2020 카카오 인턴십
- Web
- pass
- 2019 KAKAO BLIND
Archives
- Today
- Total
Min:D's Devlog
[백준][Gold 4][C++] 1261 알고스팟 본문
문제
백준 - 1261 알고스팟 (Gold 4)
문제 풀이
접근 방식
이 문제는 0, 0에서 시작하여 N-1, M-1에 도달하기 위해 파괴한 벽의 개수의 최솟값을 구하는 문제이다.
그래서 BFS + DP의 방식으로 이 문제를 해결하였다.
우선, destroy라는 2차원 벡터의 모든 값들을 큰 수(987654321)로 설정해놓고,BFS 탐색을 수행하며 그 위치에 도달하기 위해 파괴한 벽의 개수의 최솟값을 destroy 벡터에 저장해주었다.
즉, 큐를 이용하여 0,0에서부터 상하좌우 네 방향을 탐색하였고,
이동 가능한 위치인 map[nx][ny]의 값이 0인 경우에는 (벽을 안 부숴도 되는 경우)
destroy[x][y]과 destroy[nx][ny]을 비교하여 더 작은 값을 destroy[nx][ny]에 저장해주었고,
map[nx][ny]의 값이 1인 경우에는 (벽을 부숴야 하는 경우)
destroy[x][y] + 1의 값과 destroy[nx][ny]을 비교하여 더 작은 값을 저장해주었다.
모든 탐색을 완료하면, destroy 벡터에는 해당 위치에 도달하기 위해 파괴한 벽의 최솟값이 저장되게 된다.
즉, destroy[N-1][M-1]이 구하고자 하는 답이 된다.
이 문제의 유형은 다익스트라 알고리즘이었다.
그래서 단순 BFS + DP 방식보다 우선순위 큐를 사용해서 파괴한 벽의 수가 적은 것부터 탐색을 했다면,
더 빠르게 답을 찾을 수 있었을 것이다.
풀이 코드 - C++
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct pos {
int x;
int y;
};
int main() {
int map[100][100];
int destroy[100][100];
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int N, M;
cin >> M >> N;
for (int i = 0; i < N; i++) {
string a;
cin >> a;
for (int j = 0; j < M; j++) {
map[i][j] = a[j] - '0';
destroy[i][j] = 987654321;
}
};
queue<pos> q;
int x, y, nx, ny;
destroy[0][0] = 0;
q.push({ 0,0 });
while (!q.empty()) {
x = q.front().x, y = q.front().y;
q.pop();
for (int i = 0; i < 4; i++) {
nx = x + dir[i][0];
ny = y + dir[i][1];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (map[nx][ny] == 0) {
if (destroy[nx][ny] > destroy[x][y]) {
destroy[nx][ny] = destroy[x][y];
q.push({ nx,ny });
}
}
else {
if (destroy[nx][ny] > destroy[x][y] + 1) {
destroy[nx][ny] = destroy[x][y] + 1;
q.push({ nx,ny });
}
}
}
}
cout << destroy[N - 1][M - 1];
}
실행 결과
'알고리즘 > 백준' 카테고리의 다른 글
[백준][삼성 SW 역량 테스트][Silver 1][C++] 14891 톱니바퀴 (0) | 2020.09.30 |
---|---|
[백준][삼성 SW 역량 테스트][Gold 4][C++] 15685 드래곤 커브 (0) | 2020.09.29 |
[백준][삼성 SW 역량 테스트][Gold 5][C++] 15684 사다리 조작 (0) | 2020.09.28 |
[백준][삼성 SW 역량 테스트][Gold 5][C++] 15686 치킨 배달 (0) | 2020.09.26 |
[백준][삼성 SW 역량 테스트][Gold 5][C++] 15683 감시 (0) | 2020.09.25 |
Comments