개발자 톡

연습문제 톡 함께하는 효도

마지막 테스트케이스 수정 부탁드립니다.

등록일
2025-02-04 01:53:41
조회수
212
작성자
qjatjs123123
import java.io.*;
import java.util.*;


public class Main {
    static int n, m;
    static int[][] graph, count;
    static boolean[][] visited;
    static Friend[] friendArr;
    static int[] dx = new int[] {0, 0, 1, -1};
    static int[] dy = new int[] {1, -1, 0, 0};
    static int ans = 0;


    static class Friend {
        int row, col, value;


        Friend(int row, int col, int value) {
            this.row = row;
            this.col = col;
            this.value = value;
        }
    }
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
    
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());


        graph = new int[n][n];
        visited = new boolean[n][n];
        friendArr = new Friend[m];
        count = new int[n][n];
        
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());


            for (int j = 0; j < n; j++) {
                graph[i][j] = Integer.parseInt(st.nextToken());
            }
        }


        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());


            int row = Integer.parseInt(st.nextToken()) - 1;
            int col = Integer.parseInt(st.nextToken()) - 1;


            visited[row][col] = true;
            friendArr[i] = new Friend(row, col, graph[row][col]);
            count[row][col] = 1;
            
        }


        backtracking(0);
        System.out.println(ans);
    }


    static void backtracking(int cnt) {
        int total = 0;
        for (Friend f : friendArr) total += f.value;


        ans = Math.max(ans, total);
        
        if (cnt == 3*m) {
            return;
        }
        
        int idx = cnt % m;
        Friend cur_friend = friendArr[idx];
        boolean isflg = false;
        
        for (int i = 0; i < 4; i++) {
            int new_row = cur_friend.row + dy[i];
            int new_col = cur_friend.col + dx[i];
            
            if (new_row < 0 || new_row == n || new_col < 0 || new_col == n || isMeet(new_row, new_col)) continue;
            
            int value = 0;
            if (count[new_row][new_col] == 0) value = graph[new_row][new_col];
            
            count[new_row][new_col]++;
            cur_friend.row = new_row;
            cur_friend.col = new_col;
            cur_friend.value += value;
            
            backtracking(cnt+1);
            


            count[new_row][new_col]--;


            cur_friend.row -= dy[i];
            cur_friend.col -= dx[i];
            cur_friend.value -= value;


            isflg = true;
        }


        if (!isflg) backtracking(cnt+1);
    }


    static boolean isMeet(int new_row, int new_col) {
        for(Friend f : friendArr) {
            if (f.row == new_row && f.col == new_col) return true;
        }
        return false;
    }
}


아무리 코드를 바꿔봐도 마지막 테스트 케이스에서 걸리길래

다른 분들의 정답 코드를 넣었는데도 마지막 테스트 케이스에서 오류가 발생합니다.


마지막 테스트 케이스 수정 부탁드립니다.



그리고



테스트케이스

6 2

20 26 185 80 1 1

100 20 25 80 189 51

20 20 88 99 1 1

15 32 44 50 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 2

2 3

일 때



정답 644 아닌가요??



 한 나무에 여러 친구가 방문하게 되더라도 열매는 딱 한 번만 수확이 가능합니다. 이때, 친구들끼리 이동하는 도중 동시에 같은 사과나무에서 마주치는 경우에는 싸움이 일어날 수 있기 때문에 남우는 이와 같은 경우가 없기를 바랍니다.



=> 제가 이해한 바로는 한 나무에 여러 친구가 방문할 수 있지만, 동시에 만나면 안된다라고 이해를 했습니다.


그렇다면 위 테스트케이스에서


1)

첫 번째 친구) 26 -> 185 (135 획득, 총 211)

두 번째 친구) 25 -> 80 (80 획득, 총 105)


2)

첫 번째 친구) 185 -> 25 (0 획득, 총 211) / 1 단계에서 두 번째 친구가 획득

두 번째 친구) 80 -> 189 (189 획득, 총 294)


3)

첫 번째 친구) 25 -> 88 (88 획득, 총 299)

두 번째 친구) 189 -> 51 (51획득, 총 345)


결국 299 + 345 = 644 입니다.


3 단계 모두 동시에 마주친 적이 없지만 이 답이 아니라고 합니다.



제가 느끼기에는 문제 설명이 모호하다고 생각합니다.


#함께하는_효도

이 카테고리의 톡 더보기