일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- session
- 스프링부트
- CustomException
- fastapi
- 도메인 주도 개발
- OpenAI API
- spring boot
- springboot
- jwt
- logout
- 구글 로그인
- GoormIDE
- oauth2.0
- 예외 처리
- 이미지 업로드
- presigned url
- 백준 10815 # 백준 Java
- spring websocket nginx 설정
- 패러다임 불일치
- 자바 orm
- 소셜 로그인
- 개발 프로젝트
- ec2 nginx websocket reverse proxy
- validation
- S3
- @Valid
- 관점 지향 프로그래밍
- wss 연결 실패
- AWS
- Flask
Archives
- Today
- Total
개발세발은 안되요
[C++] 백준 1261 : 알고스팟 본문
문제
https://www.acmicpc.net/problem/1261
풀이 방법
0-1 BFS를 이용하여 풀 수 있는 문제였다.
- 벽을 부수지 않고 이동할 수 있는 경우 dq.push_front() 를 이용해 deque의 앞에 다음 위치 삽입
- 벽을 부숴야 이동할 수 있는 경우 dq.push_back()을 이용해 deque의 뒤에 다음 위치 삽입
이를 통해 벽을 부수지 않는 방법에 대한 우선순위를 고려할 수 있다.
최대한 벽을 부수지 않고 이동해야 부숴야 하는 벽의 최소 개수를 구할 수 있기 때문에, 벽을 부수지 않고 이동하는 것을 우선적으로 고려해야 한다. 즉 벽을 부수지 않고 이동하는 경우를 dq에서 먼저 빼야 한다.
이때 방문 표시를 해가며 이미 방문한 위치는 다시 방문하지 않도록 한다.
코드
#include <iostream>
#include <deque>
using namespace std;
int n,m;
int maze[101][101];
int visited[101][101];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
struct State{
int c_x, c_y, c_w;
};
void bfs(){
deque<State> dq;
dq.push_back({0,0,0});
visited[0][0]=1;
while(!dq.empty()){
State cur = dq.front();
dq.pop_front();
// 목표지점에 도달한 경우
if(cur.c_x == m-1 && cur.c_y == n-1){
cout << cur.c_w;
return;
}
// 다음 위치로 이동
for(int i=0; i<4; i++){
int nx = cur.c_x + dx[i];
int ny = cur.c_y + dy[i];
// 범위를 벗어난 경우
if(nx < 0 || nx >=m || ny <0 || ny >=n) continue;
// 이미 방문한 곳인 경우
if(visited[nx][ny]==1) continue;
// 벽을 부수지 않아도 되는 경우
if(maze[nx][ny]==0){
dq.push_front({nx,ny,cur.c_w});
visited[nx][ny]=1;
}
// 벽을 부숴야 하는 경우
else{
// 필요한 벽의 개수 증가시키고 dq의 back에 삽입
dq.push_back({nx,ny,cur.c_w+1});
visited[nx][ny]=1;
}
}
}
}
int main()
{
cin >> n >> m;
for(int i=0; i<m; i++){
string line;
cin >> line;
for (int j = 0; j < n; j++) {
maze[i][j] = line[j] - '0'; // 문자 '0'을 빼서 숫자로 변환
}
}
bfs();
return 0;
}
메모
입력 받을 때 공백으로 구분해서 주어지는지, 아닌지를 이용해 입력받을 방식을 결정해야 한다. 이 경우 공백 없이 입력받기 때문에 string으로 입력받은 후 각각 숫자로 변환해주어야 한다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 2469 : 사다리 타기 (0) | 2025.05.01 |
---|---|
[C++] 백준 1874 : 스택 수열 (0) | 2025.04.30 |
[C++] 백준 17829 : 222-풀링 (0) | 2025.04.10 |
[C++] 백준 2075 : N번째 큰 수 (0) | 2025.04.02 |
[C++] 백준 1966: 프린터 큐 (0) | 2025.04.01 |