• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

3-P 자바 기저조건 질문

24.03.24 01:21 작성 24.03.24 01:56 수정 조회수 74

0

선생님, 강의 잘 듣고 있습니다! 다름이 아니라 혹시 기저조건에

if (price >= answer) {
            return;
        }

해당 조건을 추가해주지 않으신 이유가 있을까요?

해당 조건 없이도 시간복잡도 관련해서 영향이 적기 때문일까요..?

감사합니다!

 

아래는 저의 답안입니다!

public class Main {
    static int n, answer = Integer.MAX_VALUE;
    static int[][] arr;
    static boolean[][] visited;
    static Map<Point, Integer> map = new HashMap<>();
    static int[] dy = {-1, 0, 1, 0};
    static int[] dx = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        arr = new int[n][n];
        visited = new boolean[n][n];

        for (int i = 0; i < n; i++) {
            String[] s = br.readLine().split(" ");
            for (int j = 0; j < n; j++) {
                int price = Integer.parseInt(s[j]);
                arr[i][j] = price;
                map.put(new Point(i, j), price);
            }
        }

        go(0, 0);
        System.out.println(answer);
    }

    private static void go(int count, int price) {
        if (count == 3) {
            answer = Math.min(price, answer);
return;
        }
        for (int i = 1; i < n - 1; i++) {
            for (int j = 1; j < n - 1; j++) {
                Point point = new Point(i, j);
                if (check(point)) {
                    go(count + 1, price + flower(point));
                    wither(point);
                }
            }
        }
    }

    private static void wither(Point point) {
        visited[point.x][point.y] = false;
        for (int i = 0; i < 4; i++) {
            int ny = point.x + dy[i];
            int nx = point.y + dx[i];

            visited[ny][nx] = false;
        }
    }

    private static int flower(Point point) {
        visited[point.x][point.y] = true;
        int temp = arr[point.x][point.y];

        for (int i = 0; i < 4; i++) {
            int ny = point.x + dy[i];
            int nx = point.y + dx[i];

            visited[ny][nx] = true;
            temp += arr[ny][nx];
        }
        return temp;
    }

    private static boolean check(Point point) {
        for (int i = 0; i < 4; i++) {
            int ny = point.x + dy[i];
            int nx = point.y + dx[i];

            if (ny < 0 || nx < 0 || ny >= n || nx >= n || visited[ny][nx]) {
                return false;
            }
        }
        return true;
    }
}

감사합니다!!

답변 1

답변을 작성해보세요.

0

안녕하세요 ㅎㅎ

void flower(int cnt,int hap) {
    if (cnt == 3) {
        ret = min(ret, hap);
        return;
    }

혹시 이부분에 해당 부분을 추가해야 한다는 말씀이신가요?

이문제는 일딴 꽃을 3개를 세우고 _> 최저비용을 계산하게 해야해서 해당 부분은 필요하지 않습니다.

3개세우고 -> min값설정 이후 return을 하는 것과

3개 세우고 -> 해당 부분이 더 클 경우 return하는 것은 같은 로직이라고 보시면 됩니다.

 

서로 다른 세 씨앗을 모두 꽃이 피게하면서 가장 싼 가격에 화단을 대여하고 싶다.

| 문제 지문.



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.