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
- boj
- html
- 생활코딩
- BFS
- 백준 #BOJ #1697
- BOJ2629
- 1520내리막길
- BOJ1753
- 백준11404
- DP
- github_actions
- BOJ14719
- BOJ1931
- 백준2110
- BOJ11729
- 프로그래머스 #무지의먹방라이브 #C++
- 백준
- BOJ2110
- BOJ9663
- 백준2141
- BOJ11066
- 백준2533
- BOJ14501
- BOJ2805
- BOJ20444
- 재귀
- 색종이와가위
- BOJ11404
- 이분탐색
- 백트래킹
Archives
- Today
- Total
poksul_log
# 9205. 맥주 마시면서 걸어가기 본문
관련 알고리즘 : BFS
문제 링크 : https://www.acmicpc.net/problem/9205
9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
문제 풀이
<문제 조건>
- 한 박스 : 맥주 20개 최대
- ( 맥주마시기 ) => 50미터 O
- 빈 병 버리고 새 맥주병( 맥주병 최대 20개 )
- 테스트 케이스 개수 t ( t <= 50 )
- 편의점 개수 n
- 두 좌표 사이의 거리 : ( x좌표의 차이 ) + ( y좌표의 차이 )
맥주병을 최대 20개가 있고, 한 병 마실 때마다 최대 50미터를 갈 수 있으므로,
편의점 없이 최대로 갈 수 있는 거리는 50x20 = 1000m 이다.
=> 두 좌표 사이의 거리가 1000m 이하면 이동 가능
- 1000m 거리 내 편의점 있음 => queue에 추가
- queue가 empty => sad 출력
C++ 코드
#include <iostream>
#include <queue>
using namespace std;
struct coo
{
int x; int y;
};
coo store[100]; // 편의점 좌표(0 <= 편의점 개수 <= 100)
coo festival; // 페스티벌 좌표
coo home; // 집 좌표
bool visited[100];
// 절댓값 계산
int abs(int n) {
if (n < 0)
return -n;
return n;
}
bool bfs(int n) {
queue<pair<int, int>> que;
que.push({home.x, home.y});
while (!que.empty()) {
int x = que.front().first;
int y = que.front().second;
que.pop();
if (abs(festival.x - x) + abs(festival.y - y) <= 1000)
return true; // 거리 1000m 이하일 경우 이동 가능
for (int i = 0; i < n; i++) {
if (visited[i]) { // 방문했던 편의점일 시,
continue;
}
if (abs(store[i].x - x) + abs(store[i].y - y) <= 1000) {
visited[i] = true;
que.push({store[i].x, store[i].y});
}
}
}
return false; // while 다 돌았는데도 도착 못했으면 false
}
int main() {
ios_base::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int t; // test 개수
cin >> t;
while(t--) {
int n;
cin >> n;
cin >> home.x >> home.y;
for (int i=0; i < n; i++) {
cin >> store[i].x >> store[i].y;
}
cin >> festival.x >> festival.y;
bool possible = bfs(n);
if(possible) cout << "happy\n";
else cout << "sad\n";
fill(visited, visited+100, false); // visited bool check false로 초기화
}
return 0;
}
'Coding Test > BOJ' 카테고리의 다른 글
# 2667. 단지번호붙이기 (0) | 2023.06.25 |
---|---|
# 7576. 토마토 (0) | 2023.04.02 |
# 2573. 빙산 (0) | 2023.03.12 |
# 16197. 두 동전 (0) | 2023.03.05 |
# 2141. 우체국 (0) | 2023.02.26 |