import java.util.*;

/**
  테스트 1 〉 통과 (15.28ms, 110MB)
  테스트 2 〉 통과 (58.95ms, 105MB)
  테스트 3 〉 통과 (12.50ms, 105MB)
  테스트 4 〉 통과 (45.74ms, 127MB)
  테스트 5 〉 통과 (43.97ms, 102MB)
  테스트 6 〉 통과 (7.43ms, 78.6MB)
  테스트 7 〉 통과 (30.60ms, 103MB)
  테스트 8 〉 통과 (63.70ms, 128MB)
  테스트 9 〉 통과 (16.12ms, 111MB)
  테스트 10 〉 통과 (63.72ms, 119MB)
  테스트 11 〉 통과 (10.15ms, 90.4MB)
  테스트 12 〉 통과 (0.07ms, 85.3MB)
*/

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        
        Map<String, Integer> ori = new HashMap<>();
        Map<String, Integer> window = new HashMap<>();
        for(int i=0;i<want.length;i++) {
            ori.put(want[i], number[i]);

        }
        
        for(int i=0;i<10;i++) {
            window.put(discount[i], window.getOrDefault(discount[i], 0)+1);            
        }

        boolean aa = true;
        for(String key : ori.keySet()) {
            if(window.getOrDefault(key, 0) < ori.get(key)) aa= false;
        }
        
        if(aa) answer++;
        
        f : for(int i=10;i<discount.length;i++) {
            
            window.put(discount[i-10], window.get(discount[i-10])-1);
            if(window.get(discount[i-10]) == 0) window.remove(discount[i-10]);
            
            window.put(discount[i], window.getOrDefault(discount[i], 0)+1);
            
            for(String key : ori.keySet()) {
                if(window.getOrDefault(key, 0) < ori.get(key)) continue f;
            }
            answer++;
        }
        
        return answer;
    }
}

'Algorithm' 카테고리의 다른 글

P159993_미로탈출.java  (0) 2025.05.04
P178870_연속된부분수열의합.java  (0) 2025.04.28
거리 두고 싶다...  (2) 2025.04.20
[programmers] 충돌위험찾기_340211 java  (0) 2025.04.07
[programmers] 호텔 대실_155651 java  (0) 2025.03.31
import java.util.*;
/**
  테스트 1 〉	통과 (0.35ms, 82.7MB)
  테스트 2 〉	통과 (0.61ms, 84.4MB)
  테스트 3 〉	통과 (0.83ms, 72.8MB)
  테스트 4 〉	통과 (0.65ms, 85MB)
  테스트 5 〉	통과 (0.57ms, 78.7MB)
  테스트 6 〉	통과 (0.44ms, 87MB)
  테스트 7 〉	통과 (1.81ms, 79.7MB)
  테스트 8 〉	통과 (3.55ms, 84.3MB)
  테스트 9 〉	통과 (0.39ms, 83.6MB)
  테스트 10 〉	통과 (0.29ms, 75.1MB)
  테스트 11 〉	통과 (1.30ms, 72.4MB)
  테스트 12 〉	통과 (2.85ms, 79.9MB)
  테스트 13 〉	통과 (4.63ms, 78MB)
  테스트 14 〉	통과 (2.66ms, 82.7MB)
  테스트 15 〉	통과 (0.90ms, 83.6MB)
  테스트 16 〉	통과 (8.05ms, 75.6MB)
  테스트 17 〉	통과 (12.72ms, 91MB)
  테스트 18 〉	통과 (0.83ms, 76.3MB)
  테스트 19 〉	통과 (0.64ms, 74.5MB)
  테스트 20 〉	통과 (7.15ms, 73.9MB)
  테스트 21 〉	통과 (2.40ms, 81.5MB)
  테스트 22 〉	통과 (0.79ms, 94.1MB)
  테스트 23 〉	통과 (0.35ms, 89MB)
**/
class Solution {
    static char[][] arr;
    static int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    
    static class Loc {
        int x, y;
        
        Loc(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    
    public int solution(String[] maps) {
        
        arr = new char[maps.length][maps[0].length()];
        Queue<Loc> queue = new ArrayDeque<>();
        
        for(int i=0;i<maps.length;i++) {
            arr[i] = maps[i].toCharArray();
            for(int j=0;j<arr[i].length;j++) {
                if(arr[i][j] == 'S') {
                    queue.offer(new Loc(i, j));
                }
            }
        }
        
        int time = 0;
        boolean pulled = false;
        boolean[][] visited = new boolean[arr.length][arr[0].length];
        
        // 레버 올리기
        while(!pulled && !queue.isEmpty()) {
            time++;
            Queue<Loc> newQueue = new ArrayDeque<>();
            
            c: while(!queue.isEmpty()) {
                Loc loc = queue.poll();
                if(visited[loc.x][loc.y]) continue;
                visited[loc.x][loc.y] = true;
                
                for(int i=0;i<4;i++) {
                    int x = loc.x + dx[i], y = loc.y + dy[i];
                    if(!isInRange(x, y) || visited[x][y] || arr[x][y] == 'X') continue;
                    
                    if(arr[x][y] == 'L') {
                        newQueue.clear();
                        newQueue.offer(new Loc(x, y));
                        pulled = true;
                        break c;
                    }

                    
                    newQueue.offer(new Loc(x, y));
                }
            }

            queue = newQueue;
            
        }
        
        if(!pulled) return -1;
        visited = new boolean[arr.length][arr[0].length];
        
        // 출구 찾기
        while(!queue.isEmpty()) {
            
            time++;
            Queue<Loc> newQueue = new ArrayDeque<>();
            
            while(!queue.isEmpty()) {
                Loc loc = queue.poll();
                // System.out.println(loc.x+" "+loc.y);
                if(visited[loc.x][loc.y]) continue;
                visited[loc.x][loc.y] = true;
                
                for(int i=0;i<4;i++) {
                    int x = loc.x + dx[i], y = loc.y + dy[i];
                    if(!isInRange(x, y) || visited[x][y] || arr[x][y] == 'X') continue;
                    
                    if(arr[x][y] == 'E') {
                        return time;
                    }
                    
                    newQueue.offer(new Loc(x, y));
                }
            }           
            queue = newQueue;
        }
        
        return -1;
    }
    
    static boolean isInRange(int x, int y) {
        return 0 <= x && x < arr.length && 0 <= y && y < arr[0].length;
    }
}

'Algorithm' 카테고리의 다른 글

P131127_할인행사.java  (0) 2025.05.12
P178870_연속된부분수열의합.java  (0) 2025.04.28
거리 두고 싶다...  (2) 2025.04.20
[programmers] 충돌위험찾기_340211 java  (0) 2025.04.07
[programmers] 호텔 대실_155651 java  (0) 2025.03.31
import java.util.*;

/**
  테스트 1 〉 통과 (0.02ms, 73.7MB)
  테스트 2 〉 통과 (0.02ms, 81.8MB)
  테스트 3 〉 통과 (0.02ms, 93MB)
  테스트 4 〉 통과 (0.08ms, 73.3MB)
  테스트 5 〉 통과 (0.68ms, 97.1MB)
  테스트 6 〉 통과 (0.92ms, 78.1MB)
  테스트 7 〉 통과 (1.79ms, 88.4MB)
  테스트 8 〉 통과 (2.52ms, 77.9MB)
  테스트 9 〉 통과 (12.39ms, 86.3MB)
  테스트 10 〉 통과 (11.06ms, 133MB)
  테스트 11 〉 통과 (12.38ms, 126MB)
  테스트 12 〉 통과 (10.15ms, 124MB)
  테스트 13 〉 통과 (19.70ms, 122MB)
  테스트 14 〉 통과 (14.05ms, 139MB)
  테스트 15 〉 통과 (14.80ms, 137MB)
  테스트 16 〉 통과 (6.80ms, 140MB)
  테스트 17 〉 통과 (8.43ms, 121MB)
  테스트 18 〉 통과 (0.01ms, 73.3MB)
  테스트 19 〉 통과 (0.02ms, 76.4MB)
  테스트 20 〉 통과 (0.02ms, 92.6MB)
  테스트 21 〉 통과 (0.02ms, 86.7MB)
  테스트 22 〉 통과 (0.02ms, 72.6MB)
  테스트 23 〉 통과 (0.02ms, 73.3MB)
  테스트 24 〉 통과 (8.87ms, 129MB)
  테스트 25 〉 통과 (5.05ms, 122MB)
  테스트 26 〉 통과 (6.71ms, 124MB)
  테스트 27 〉 통과 (6.67ms, 143MB)
  테스트 28 〉 통과 (9.39ms, 124MB)
  테스트 29 〉 통과 (9.20ms, 144MB)
  테스트 30 〉 통과 (10.53ms, 128MB)
  테스트 31 〉 통과 (0.01ms, 85.3MB)
  테스트 32 〉 통과 (0.01ms, 69.4MB)
  테스트 33 〉 통과 (0.01ms, 79.3MB)
  테스트 34 〉 통과 (0.02ms, 73.2MB)
**/

class Solution {
    public int[] solution(int[] sequence, int k) {
        
        int length = Integer.MAX_VALUE;
        int startIdx = -1, endIdx = -1;
        
        int start = 0, end = 0, sum = 0;
        
        while(end < sequence.length) {
            sum += sequence[end++];
            
            while(sum > k && start < end) {
                sum -= sequence[start++];
            }
            
            if(sum == k && length > end - start) {
                length = end - start;
                startIdx = start;
                endIdx = end-1;
            }
            
            
        }
        
        return new int[]{startIdx, endIdx};
    }
}

'Algorithm' 카테고리의 다른 글

P131127_할인행사.java  (0) 2025.05.12
P159993_미로탈출.java  (0) 2025.05.04
거리 두고 싶다...  (2) 2025.04.20
[programmers] 충돌위험찾기_340211 java  (0) 2025.04.07
[programmers] 호텔 대실_155651 java  (0) 2025.03.31

https://school.programmers.co.kr/learn/courses/30/lessons/81302

import java.util.*;

/**

    테스트 1 〉	통과 (8.41ms, 89.2MB)
    테스트 2 〉	통과 (7.23ms, 86.9MB)
    테스트 3 〉	통과 (8.58ms, 92.2MB)
    테스트 4 〉	통과 (8.04ms, 86.9MB)
    테스트 5 〉	통과 (9.12ms, 84.4MB)
    테스트 6 〉	통과 (13.46ms, 76.7MB)
    테스트 7 〉	통과 (7.15ms, 87.2MB)
    테스트 8 〉	통과 (7.34ms, 81.1MB)
    테스트 9 〉	통과 (10.70ms, 90.2MB)
    테스트 10 〉	통과 (9.32ms, 84.1MB)
    테스트 11 〉	통과 (8.33ms, 81.3MB)
    테스트 12 〉	통과 (9.85ms, 72.7MB)
    테스트 13 〉	통과 (10.36ms, 79.9MB)
    테스트 14 〉	통과 (6.95ms, 79.9MB)
    테스트 15 〉	통과 (9.31ms, 75.7MB)
    테스트 16 〉	통과 (7.38ms, 81.3MB)
    테스트 17 〉	통과 (8.24ms, 83.1MB)
    테스트 18 〉	통과 (11.41ms, 90.3MB)
    테스트 19 〉	통과 (12.52ms, 76.5MB)
    테스트 20 〉	통과 (16.39ms, 92.8MB)
    테스트 21 〉	통과 (9.73ms, 85.1MB)
    테스트 22 〉	통과 (10.66ms, 72.7MB)
    테스트 23 〉	통과 (0.08ms, 72.2MB)
    테스트 24 〉	통과 (10.36ms, 94.8MB)
    테스트 25 〉	통과 (0.05ms, 86.5MB)
    테스트 26 〉	통과 (0.08ms, 84.2MB)
    테스트 27 〉	통과 (10.00ms, 83.8MB)
    테스트 28 〉	통과 (0.15ms, 73.7MB)
    테스트 29 〉	통과 (10.99ms, 85.6MB)
    테스트 30 〉	통과 (10.33ms, 73.8MB)
    테스트 31 〉	통과 (8.54ms, 91.8MB)


**/

class Solution {
    public static int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
    public char[][] arr = new char[5][5];
    
    public static boolean isInRange(int x, int y) {
        return 0 <= x && x< 5 && 0 <= y && y < 5;
    }
    
    public List<Integer> solution(String[][] places) {
        List<Integer> ans = new ArrayList<>();
        
        testcase : for(int t =0; t< places.length; t++) {
            
            for(int i=0;i<5;i++) {
                arr[i] = places[t][i].toCharArray();
            }
            
            for(int i=0;i<5;i++) {
                for(int j=0;j<5;j++) {
                    if(arr[i][j] == 'P') {
                        // 거리 체크

                        Queue<int[]> check = new ArrayDeque<>();
                        
                        for(int idx=0;idx<4;idx++) {
                            int x = i+dx[idx], y = j+dy[idx];
                            if(isInRange(x, y) && arr[x][y] == 'P') {
                                System.out.println(x+" "+y);
                                ans.add(0); continue testcase;
                            }
                            
                            else if(isInRange(x, y) && arr[x][y] == 'O') {
                                check.add(new int[] {x, y, idx});
                            }
                            
                        }
                        
                        while(!check.isEmpty()) {
                            int[] loc = check.poll();
                            
                            for(int idx=0;idx<4; idx++) {
                                if(idx == 0 && loc[2] == 2) {
                                    continue;
                                }
                                if(idx == 2 && loc[2] == 0) {
                                    continue;
                                }
                                if(idx == 1 && loc[2] == 3) {
                                    continue;
                                }
                                if(idx == 3 && loc[2] == 1) {
                                    continue;
                                }
                                
                                int x = loc[0]+dx[idx], y = loc[1]+dy[idx];
                                if(isInRange(x, y) && arr[x][y] == 'P') {
                                    System.out.println(x+" "+y);
                                    ans.add(0); continue testcase;
                                }
                            }
                        }

                    }
                }
            }
            ans.add(1);
        }
        

        
        return ans;
    }
}
import java.util.*;

/*

최적화 X
테스트 1 〉	통과 (15.05ms, 77MB)
테스트 2 〉	통과 (6.67ms, 77.7MB)
테스트 3 〉	통과 (7.94ms, 78.7MB)
테스트 4 〉	통과 (17.39ms, 80.2MB)
테스트 5 〉	통과 (32.44ms, 102MB)
테스트 6 〉	통과 (29.87ms, 104MB)
테스트 7 〉	통과 (45.43ms, 111MB)
테스트 8 〉	통과 (122.54ms, 126MB)
테스트 9 〉	통과 (149.90ms, 183MB)
테스트 10 〉	통과 (87.34ms, 143MB)
테스트 11 〉	통과 (138.59ms, 133MB)
테스트 12 〉	통과 (171.24ms, 128MB)
테스트 13 〉	통과 (148.72ms, 183MB)
테스트 14 〉	통과 (304.81ms, 311MB)
테스트 15 〉	통과 (325.75ms, 327MB)
테스트 16 〉	통과 (323.85ms, 324MB)
테스트 17 〉	통과 (369.03ms, 377MB)
테스트 18 〉	통과 (447.14ms, 380MB)
테스트 19 〉	통과 (338.50ms, 355MB)
테스트 20 〉	통과 (339.62ms, 336MB)

*/

class Solution {
    
    static int[][] points, routes;
    
    static class Loc {
        int x, y;
        
        Loc(int x, int y) {
            this.x = x;
            this.y = y;
        }
        
        Loc(int a) {
            this.x = points[a][0];
            this.y = points[a][1];
        }
    }
    
    static class Robot {
        int idx;
        Loc loc;
        int stage;
        
        Robot(Loc loc, int idx) {
            this.idx = idx;
            this.loc = loc;
            stage = 1;
        }
    }
    
    static Queue<Robot> queue = new ArrayDeque<>();
    
    public int solution(int[][] points, int[][] routes) {
        
        this.points = points;
        this.routes = routes;
        
        int ans = 0;
                    
        int[][] visited = new int[101][101];
        
        // 로봇의 시작 위치를 담아 Queue에 넣기
        for(int i=0;i<routes.length;i++) {
            
            int pointIdx = routes[i][0]-1;
            
            Loc loc = new Loc(points[pointIdx][0]-1, points[pointIdx][1]-1);
            queue.offer(new Robot(loc, i));
            visited[loc.x][loc.y]++;
            // System.out.println(loc.x+" "+loc.y);
        }
        
                    
        for(int i=0;i<101;i++) {
            for(int j=0;j<101;j++) {
                if(visited[i][j] > 1) {
                    ans++;
                }
            }
        }
        
        while(!queue.isEmpty()) {
            
            visited = new int[101][101];
            Queue<Robot> newQueue = new ArrayDeque<>();
            
            while(!queue.isEmpty()) {
                Robot robot = queue.poll();
                

                
                int pointIdx = routes[robot.idx][robot.stage]-1;
                
                Loc target = new Loc(points[pointIdx][0]-1, points[pointIdx][1]-1);
                Loc nowLoc = robot.loc;
                
                // System.out.print(pointIdx+" "+ nowLoc.x+" "+nowLoc.y+" "+target.x+" "+target.y);
                                
                // 위치 도달 확인
                if(nowLoc.x == target.x && nowLoc.y == target.y) {
                    robot.stage++;
                }
                
                if(robot.stage >= routes[robot.idx].length) {
                    continue;
                }
                
                pointIdx = routes[robot.idx][robot.stage]-1;
                
                target = new Loc(points[pointIdx][0]-1, points[pointIdx][1]-1);
                nowLoc = robot.loc;
                
                // 위치 조정
                if(nowLoc.x == target.x) {
                    if (nowLoc.y > target.y) nowLoc.y--;
                    else nowLoc.y++;
                } else {
                    if (nowLoc.x > target.x) nowLoc.x--;
                    else nowLoc.x++;
                }
                
                visited[nowLoc.x][nowLoc.y]++;
                
                // System.out.println("-> "+nowLoc.x+" "+nowLoc.y);

                robot.loc = nowLoc;
                newQueue.offer(robot);
            }
            
            for(int i=0;i<101;i++) {
                for(int j=0;j<101;j++) {
                    if(visited[i][j] > 1) {
                        // System.out.println(i+" "+j+" "+visited[i][j]);
                        ans++;
                    }
                }
            }
            // System.out.println("----------");
            
            queue = newQueue;
        }
        
        
        return ans;
    }
}

'Algorithm' 카테고리의 다른 글

P178870_연속된부분수열의합.java  (0) 2025.04.28
거리 두고 싶다...  (2) 2025.04.20
[programmers] 호텔 대실_155651 java  (0) 2025.03.31
[boj] 로봇 조종하기_2169 java  (0) 2025.03.19
[boj] 은하철도_17250 java  (1) 2025.02.24

 

풀이 과정을 대충 설명하자면,

시간을 int 로 변환하여 저장하였고,

ArrayList에 넣어서,,,

방의 갯수를 관리하였다.

하지만 더 똑똑한 방법이 있는데

그건 다음주에..

 

import java.util.*;

class Solution {
    static class Time {
        int startTime, endTime;
        
        Time(int startTime, int endTime) {
            this.startTime = startTime;
            this.endTime = endTime;
        }
    }
    public int solution(String[][] book_time) {
        int answer = 0;
        
        PriorityQueue<Time> pq = new PriorityQueue<>((a, b) -> (a.startTime - b.startTime));
        
        for(int i=0;i<book_time.length;i++) {
            String[] in = book_time[i][0].split(":");            
            int startTime = Integer.parseInt(in[0])*100 + Integer.parseInt(in[1]);
            
            in = book_time[i][1].split(":");
            int endTime = Integer.parseInt(in[0])*100 + Integer.parseInt(in[1])+10;
            
            if(endTime % 100 >= 60) {
                endTime += 40;
            }
            pq.offer(new Time(startTime, endTime));
        }
        
        List<Integer> list = new ArrayList<>();
        
        w: while(!pq.isEmpty()) {
            Time t = pq.poll();
            
            for(int i=0;i<list.size();i++) {
                if(list.get(i)<= t.startTime) {

                    list.remove(i);
                    list.add(t.endTime);
                    continue w;
                }
            }
            
            list.add(t.endTime);

        }
        
        return list.size();
    }
}

// 14:00 ~ 16:00
// 14:00 ~ 15:50

 

'Algorithm' 카테고리의 다른 글

거리 두고 싶다...  (2) 2025.04.20
[programmers] 충돌위험찾기_340211 java  (0) 2025.04.07
[boj] 로봇 조종하기_2169 java  (0) 2025.03.19
[boj] 은하철도_17250 java  (1) 2025.02.24
[boj] ACM Craft_1005 java  (2) 2025.01.26

 

문제를 보자마자 dp인 건 알았지만

dp 초보인 나는 제대로 된 점화식을 작성할 수 없었습니다.

 

import java.io.*;
import java.util.*;

class Main {

	static int[] dx = {0, -1, 0}, dy = {1, 0, -1}; // bfs를 위한 델타 배열 생성(위로는 못 올라감)
	static int[][] mm, arr;
	static int N, M;

	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		arr = new int[N][M]; // 유적 금화를 저장하는 배열
		mm = new int[N][M]; // 메모이제이션(위치, 방향 저장)

		// 유적 내 금화 저장
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(bf.readLine());
			for(int j=0;j<M;j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		boolean[][] visited = new boolean[N][M];
		
		visited[N-1][M-1] = true;
		mm[0][0] = arr[0][0];
		System.out.println((1000000000+dp(N-1, M-1, visited)));


	}

	public static int dp(int x, int y, boolean[][] visited) {
		// if(mm[x][y] != 0) return mm[x][y];

		int returnVal = arr[x][y];
		int maxRoute = 0;

		// 현 위치 기준 좌, 우, 상 에서 내려오는 경우 중 가장 큰 값 체크
		for(int i=0;i<3;i++) {
			int nX = x+dx[i];
			int nY = y+dy[i];
			if(isInRange(nX, nY) && !visited[nX][nY]) {
				visited[nX][nY] = true;
				maxRoute = Math.max(maxRoute, dp(nX, nY, visited));
				visited[nX][nY] = false;
			}
		}

		// if(x == N-1 && y == M-1) {
		// 	for(int i=0;i<N;i++) {
		// 		for(int j=0;j<M;j++) {
		// 			System.out.print(visited[i][j]+" ");
		// 		}
		// 		System.out.println();
		// 	}
		// }
		
		return mm[x][y] = returnVal + maxRoute;
	}

	public static boolean isInRange(int x, int y) {
		return 0 <= x && x < N && 0 <= y && y < M;
	}

}

 

일단 저는 메모이제이션을 통해 탑다운 방식으로 풀어보려 했어요.

(N-1, M-1) 에서의 최댓값을 구하려면, (N-2, M-1) 과 (N-1, M-2)에서의 최댓값 중 더 큰 것을 고르면 된다고 생각했습니다.

 

하지만 여기서 논리적인 오류가 발생하는데..

 

  • (0, 0)에서 시작한다.
  • (N-1, M-1)에서의 최댓값을 가지는 경로가 (a, b)를 지난다고 가정했을 때, (a, b)에서의 최댓값을 가지진 않을 수 있다.

이 두 가지를 고려하지 않았습니다...

 

예를 들어봅시다.

3 5

1 1 1 3 4

0 0 5 2 -1

0 0 1 1 1

의 input이 있다고 가정합니다.

 

제 코드로 돌려본다면, 12라는 output이 나오게 됩니다.

하지만 정답은 19 입니다.

 

그냥 설계부터 잘못된 코드입니다!

 

아무튼 그래서 다른 방법을 찾게되었고,

  • 가장 첫 행에서는 왼쪽에서 오른쪽으로밖에 이동할 수 없다.

라는 점을 깨달았습니다.

 

        // 가장 첫 행 계산하기 -> 우측으로밖에 가지 못함
        mm[0][0] = arr[0][0];
        for(int i=1;i<M;i++) {
            mm[0][i] = mm[0][i-1] + arr[0][i];
        }

 

그래서 mm 배열 중 가장 첫 행은, 직전 값에 해당 칸의 value를 더한 값으로 업데이트 해줬습니다.

 

다음 행부터는 가짓수가 증가합니다.

  • 왼쪽에서 오른쪽으로 이동하거나
  • 오른쪽에서 왼쪽으로 이동하거나
  • 위에서 아래로 이동한다.

이 세 가지입니다.

 

위에서 아래로 순차적으로 내려올 수 있기 때문에, 

두 번째 행부터 차근차근 계산을 해줄겁니다.

 

각 행마다 fromLeft (왼쪽에서 오른쪽), fromRight (오른쪽에서 왼쪽) 배열을 만들어줍니다.

 

fromLeft의 가장 왼쪽 값과, fromRight에서 가장 오른쪽 값은, 위에서밖에 내려와 업데이트 되지 못합니다.

            // 왼쪽의 시작과 오른쪽의 끝은, 위에서밖에 내려오지 못함.
            fromLeft[0] = mm[i-1][0] + arr[i][0];
            fromRight[M-1] = mm[i-1][M-1] + arr[i][M-1];

 

 

 

fromLeft 에서 (a, b) 좌표의 최댓값은, 이전에 저장해놓은 (a-1, b) 값과 (a, b-1) 중 큰 값에서 오게 하면 됩니다.

이것을 왼쪽에서 오른쪽으로 가면서 계속 갱신합니다.

for(int j=1;j<M;j++) fromLeft[j] = Math.max(fromLeft[j-1], mm[i-1][j]) + arr[i][j];

 

 

fromRight 에서 (a, b) 좌표의 최댓값은, 이전에 저장해놓은 (a-1, b) 값과 (a, b+1) 중 큰 값에서 오게하면 됩니다.

이것을 오른쪽에서 왼쪽으로 가면서 계속 갱신합니다.

for(int j=1;j<M;j++) fromRight[M-1-j] = Math.max(fromRight[M-j], mm[i-1][M-1-j]) + arr[i][M-1-j];

 

 

모두 완료가 됐다면,

같은 위치의 fromLeft와 fromRight를 비교하며, 더 큰 값으로 mm 배열에 저장합니다.

            // mm에 값 넣어주기
            for(int j=0;j<M;j++) {
                mm[i][j] = Math.max(fromLeft[j], fromRight[j]);
            }

 

 

전체 코드 보기

package baekjoon;

import java.io.*;
import java.util.*;

public class 로봇조종하기_2169 {

	static int[] dx = {0, -1, 0}, dy = {1, 0, -1}; // bfs를 위한 델타 배열 생성(위로는 못 올라감)
	static int[][] mm, arr;
	static int N, M;

	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		arr = new int[N][M]; // 유적 금화를 저장하는 배열
		mm = new int[N][M]; // 메모이제이션(위치, 방향 저장)

		// 유적 내 금화 저장
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(bf.readLine());
			for(int j=0;j<M;j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

        // 가장 첫 행 계산하기 -> 우측으로밖에 가지 못함
        mm[0][0] = arr[0][0];
        for(int i=1;i<M;i++) {
            mm[0][i] = mm[0][i-1] + arr[0][i];
        }

        // 다음 행부터 위쪽에서 내려오거나, 왼쪽에서 오거나, 오른쪽에서 오거나..
        for(int i=1;i<N;i++) {
            int[] fromLeft = new int[M];
            int[] fromRight = new int[M];

            // 왼쪽의 시작과 오른쪽의 끝은, 위에서밖에 내려오지 못함.
            fromLeft[0] = mm[i-1][0] + arr[i][0];
            fromRight[M-1] = mm[i-1][M-1] + arr[i][M-1];

            for(int j=1;j<M;j++) {
                fromLeft[j] = Math.max(fromLeft[j-1], mm[i-1][j]) + arr[i][j];
                fromRight[M-1-j] = Math.max(fromRight[M-j], mm[i-1][M-1-j]) + arr[i][M-1-j];
            }

            // mm에 값 넣어주기
            for(int j=0;j<M;j++) {
                mm[i][j] = Math.max(fromLeft[j], fromRight[j]);
            }
        }

        System.out.println(mm[N-1][M-1]);
	}

}

import java.io.*;
import java.util.*;

public class Main {
    static int arr[], parent[];
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int N = Integer.parseInt(st.nextToken()), M = Integer.parseInt(st.nextToken());
        arr = new int[N]; parent = new int[N];
        for(int i=0;i<N;i++) {
            arr[i] = Integer.parseInt(bf.readLine());
            parent[i] = i;
        }
        for(int i=0;i<M;i++) {
            st = new StringTokenizer(bf.readLine());
            int a = Integer.parseInt(st.nextToken())-1, b = Integer.parseInt(st.nextToken())-1;
            int fa = find(a), fb = find(b);
            
            if(fa==fb) {
                bw.write(Integer.toString(arr[fa])+"\n");
            } else if(fa < fb) {
                parent[fb] = fa;
                arr[fa] += arr[fb];
                arr[fb] = 0;
                bw.write(Integer.toString(arr[fa])+"\n");
            } else {
                parent[fa] = fb;
                arr[fb] += arr[fa];
                arr[fa] = 0;
                bw.write(Integer.toString(arr[fb])+"\n");
            }
        }
        bw.flush();
    }
    static int find(int a) {
        if(a == parent[a]) {
            return a;
        }
        return parent[a] = find(parent[a]);
    }
}

+ Recent posts