developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BOJ파이썬풀이
  • 삼성코테준비
  • SW역량테스트파이썬풀이
  • MA모형
  • 삼성코테파이썬
  • 삼성코테기출
  • 운영체제인터럽트
  • 통계분석
  • Arima
  • ARIMA모형
  • 삼성코테자바준비
  • SW역량테스트파이썬
  • c++디자인패턴
  • 삼성코테자바풀이
  • 삼성코테자바꿀팁
  • 데이터분석
  • 백준파이썬풀이
  • AR모형
  • c++ 빌더 패턴
  • 삼성코테구현문제추천
  • 삼성코테파이썬풀이
  • 시계열분석
  • 시계열
  • 코테파이썬
  • 삼성코테구현풀이
  • 카카오코테
  • 삼성코테기출자바풀이
  • 카카오코테java풀이
  • 통계학
  • 삼성코테파이썬준비

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 녹색 옷 입은 애가 젤다지? 4485번 (JAVA)

2022. 3. 8. 23:20

❓ 문제 - 백준 녹색 옷 입은 애가 젤다지? 4485번 - JAVA 풀이법

 

출처 

(https://www.acmicpc.net/problem/4485)

 

4485번: 녹색 옷 입은 애가 젤다지?

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 다익스트라 풀이로 해결하였다.

  • 일단 N이 125라서 DFS, BFS로 완전탐색 나오면 시간초과 발생함 -> 다익스트라로 풀어야함
  • 어차피 출발지(0, 0)에서 목적지(n-1, n-1)의 최단 거리를 구하는 문제로 해석되기 때문에 다익스트라로 풂
  • 링크는 인접한 4방향(상, 하, 좌, 우)로만 이동할 수 있으므로 다익스트라 구현 시에 인접 4방향만 이동할 수 있도록 구현
  • BFS스럽게 visited 방문처리를 해주며, 기존 다익스트라로 푸는 방법 그대로 구현해하고 마지막에 목적지에 distance 값을 답으로 출력해주면 됨

2. 느낀점

  • 뭔가 BFS 방법을 다익스트라에 적용시켜 구현할 수 있냐를 묻는 문제 같음...
  • 이런 방법으로도 할 수 있구나!

 

💻 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main_4485 {
    public static int n;
    public static int[] dx ={-1, 1, 0, 0};
    public static int[] dy ={0, 0, -1, 1};
    public static int[][] map;
    public static int[][] distance;
    public static boolean[][] visited;
    public static final int INF = (int)1e9;
    public static class Node implements Comparable<Node>{
        int x;
        int y;
        int distance;
        public Node(int x, int y, int distance){
            this.x = x;
            this.y = y;
            this.distance = distance;
        }

        @Override
        public int compareTo(Node o) {
            return this.distance-o.distance;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        StringBuilder sb = new StringBuilder();
        int cnt = 1;
        while (true){
            n = Integer.parseInt(br.readLine());
            if(n == 0) break;
            map = new int[n][n];
            distance = new int[n][n];
            visited = new boolean[n][n];
            for(int i=0;i<n;i++){
                st = new StringTokenizer(br.readLine(), " ");
                for(int j=0;j<n;j++){
                    map[i][j] = Integer.parseInt(st.nextToken());
                    distance[i][j] = INF;
                }
            }

            dijkstra();
            sb.append("Problem ").append(cnt).append(": ").append(distance[n-1][n-1]).append("\n");
            cnt++;


        }

        System.out.println(sb.toString());
    }

    public static void dijkstra(){
        visited[0][0] = true;
        distance[0][0] = map[0][0];
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.offer(new Node(0, 0, distance[0][0]));
        while (!pq.isEmpty()){
            Node node = pq.poll();
            for(int d=0;d<4;d++){
                int nx = node.x + dx[d];
                int ny = node.y + dy[d];
                if(0<= nx && nx < n && 0 <= ny && ny < n){
                    if(!visited[nx][ny]){
                        int cost = node.distance + map[nx][ny];
                        if(cost < distance[nx][ny]){
                            distance[nx][ny] = cost;
                            visited[nx][ny] = true;
                            pq.offer(new Node(nx, ny, cost));
                        }
                    }
                }
            }
        }
    }
}

 

 

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 나만 안되는 연애 14621번 (JAVA)  (0) 2022.03.15
BOJ - 괄호 추가하기 16637번 (JAVA)  (0) 2022.03.14
BOJ - 서강그라운드 14938번 (JAVA)  (0) 2022.03.07
BOJ - 주사위 굴리기2 23288번 (JAVA)  (0) 2022.03.04
BOJ - 마법사 상어와 복제 23290번 (JAVA)  (0) 2022.03.01
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 나만 안되는 연애 14621번 (JAVA)
    • BOJ - 괄호 추가하기 16637번 (JAVA)
    • BOJ - 서강그라운드 14938번 (JAVA)
    • BOJ - 주사위 굴리기2 23288번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바