본문 바로가기
Algorythms

백준 9205번 풀이 c++ and java

by 준형코딩 2023. 7. 20.

문제

송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. 맥주 한 박스에는 맥주가 20개 들어있다. 목이 마르면 안되기 때문에 50미터에 한 병씩 마시려고 한다. 즉, 50미터를 가려면 그 직전에 맥주 한 병을 마셔야 한다.

상근이의 집에서 페스티벌이 열리는 곳은 매우 먼 거리이다. 따라서, 맥주를 더 구매해야 할 수도 있다. 미리 인터넷으로 조사를 해보니 다행히도 맥주를 파는 편의점이 있다. 편의점에 들렸을 때, 빈 병은 버리고 새 맥주 병을 살 수 있다. 하지만, 박스에 들어있는 맥주는 20병을 넘을 수 없다. 편의점을 나선 직후에도 50미터를 가기 전에 맥주 한 병을 마셔야 한다.

편의점, 상근이네 집, 펜타포트 락 페스티벌의 좌표가 주어진다. 상근이와 친구들이 행복하게 페스티벌에 도착할 수 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (t ≤ 50)

각 테스트 케이스의 첫째 줄에는 맥주를 파는 편의점의 개수 n이 주어진다. (0 ≤ n ≤ 100).

다음 n+2개 줄에는 상근이네 집, 편의점, 펜타포트 락 페스티벌 좌표가 주어진다. 각 좌표는 두 정수 x와 y로 이루어져 있다. (두 값 모두 미터, -32768 ≤ x, y ≤ 32767)

송도는 직사각형 모양으로 생긴 도시이다. 두 좌표 사이의 거리는 x 좌표의 차이 + y 좌표의 차이 이다. (맨해튼 거리)

출력

각 테스트 케이스에 대해서 상근이와 친구들이 행복하게 페스티벌에 갈 수 있으면 "happy", 중간에 맥주가 바닥나서 더 이동할 수 없으면 "sad"를 출력한다. 

예제 입력 1 복사

2
2
0 0
1000 0
1000 1000
2000 1000
2
0 0
1000 0
2000 1000
2000 2000

예제 출력 1 복사

happy
sad

 

 

 

dfs or bfs 문제이다

 

 

문제의 로직

 

c++

1. 일단 입력을 모두 받아준다. (struct 활용 x,y)

2. bfs (abs 활용 현재 거리에서 for문 활용하여 N까지의 거리가 1000 이하이면 q에 담아줌)

3. bfs 도중에 만약 도착지점에 도착했다면 return true

4. bfs 끝날때까지 도착지점에 도착하지 못했으면 return false

5. true 이면 happy, false이면 sad

 

java

1. 일단 입력 모두 받기

2. 1000이하인 지점이면 그래프 양쪽 노드를 연결시켜줌

3. bfs 돌림

4. 만약에 도착지점까지 연결되어 있으면 return true

5. 아니면 false

6. true 이면 happy, false이면 sad

 

- c++

 

#include <bits/stdc++.h>
using namespace std;


struct point{
    int x;
    int y;
};

point store[100];
point festival;
point home;
bool visited[100];


bool bfs(int n){
    queue<pair<int,int>>q;
    q.push({home.x,home.y});

    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();

        if(abs(festival.x-x) + abs(festival.y-y) <= 1000) return true;

        for(int i = 0 ; i < n ; i++){
            if(visited[i]==1){
                continue;
            }

            if(abs(store[i].x - x) + abs(store[i].y - y) <= 1000 ){
                visited[i] = 1;
                q.push({store[i].x,store[i].y});
            }
        }
    }
    return false;

}

int main() {

    ios_base::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);

    int t;
    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);
    }




    return 0;
}

 

 

- java

 

import java.io.*;
import java.sql.Array;
import java.util.*;

class Point{
    int x;
    int y;
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
}

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int T = Integer.parseInt(br.readLine());

        ArrayList<Point>a;
        ArrayList<ArrayList<Integer>>graph;

        StringBuilder sb = new StringBuilder();

        while(T-- > 0){
            int N = Integer.parseInt(br.readLine());

            a = new ArrayList<>();

            for(int i = 0 ; i < N + 2; i++){
                st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                a.add(new Point(x,y));
            }

            graph = new ArrayList<>();

            for(int i = 0 ; i < N + 2; i++){
                graph.add(new ArrayList<>());
            }


            for (int i = 0; i < N + 2 ; i++) {
                for(int j = i+1; j< N + 2; j++){
                    if(Manhattan(a.get(i),a.get(j)) <= 1000){
                        graph.get(i).add(j);
                        graph.get(j).add(i);
                    }
                }
            }
            sb.append((BFS(graph,N) ? "happy" : "sad" ) + '\n');
        }

        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }

    public static int Manhattan (Point p1, Point p2){
        return Math.abs(p1.x - p2.x) + Math.abs(p1.y - p2.y);
    }

    public static boolean BFS(ArrayList<ArrayList<Integer>> graph, int N) {

        Queue<Integer> q = new LinkedList<>();
        q.add(0);

        boolean[] visited = new boolean[N+2];
        visited[0]=true;

        while(!q.isEmpty()){
            int now = q.poll();

            if(now == N+1){
                return true;
            }

            for(int next : graph.get(now)){
                if(!visited[next]){
                    visited[next]=true;
                    q.offer(next);
                }
            }

        }
        return false;
    }
}

 

 

'Algorythms' 카테고리의 다른 글

백준 1748번 풀이 c++ and java  (0) 2023.07.22
백준 5427번 풀이 c++ and java  (0) 2023.07.21
백준 19941번 풀이 c++ and java  (0) 2023.07.13
백준 2512번 풀이 c++ and java  (0) 2023.07.12
백준 17266 c++ and java  (0) 2023.07.10