[JAVA] 14620 - 꽃길 🩶2: 방문배열을 야무지게 활용하는 완탐 문제

2026. 2. 24. 11:57·Problem Solve

들어가며

https://www.acmicpc.net/problem/14620

각 땅에는 가격이 매겨져 있고, 꽃 씨앗을 심으면 상하좌우로 꽃이 핀다. 3개의 꽃이 필 수 있는 경우의 수 중에서 가격의 최소를 구하면 되는 문제이다.

결국 모든 경우의 수를 돌아야 하기에 완전탐색인 문제인 것은 분명하다. 그리고 시간복잡도도 100C3(=: 백만 정도)로 매우 넉넉하다! 

본문으로

사실 아래처럼 생각을 정리하긴 했는데,, 꽃을 놓고 지우는 로직이 구현자체가 처음에 잘 떠오르지 않아서 이 글을 작성한다.

그렇다. 꽃 놓을 수 있는 확인을 먼저하고, 놓을 수 있으면 꽃을 놓은 다음 재귀적으로 꽃 개수가 3일때까지 탐색한다. 그리고 꽃을 지워줘야 하는 것이 완탐 로직의 핵심이었다.

아래는 정답 로직이다.

public class Main {

    static int N, ret;
    static int[][] maps;
    static int[][] visited;
    static int[] dy = {-1, 0, 1, 0};
    static int[] dx = {0, 1, 0, -1};

    static void go(int cnt, int cost) {

        if (cnt == 3) {
            ret = Math.min(cost, ret);
            return;
        }
        if (cost > ret) { // 가지치기
            return;
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (canFlower(i, j)) {
                    go(cnt + 1, cost + makeFlower(i, j));
                    eraseFlower(i, j);
                }
            }
        }

    }

    static boolean canFlower(int y, int x) {
        if (visited[y][x] != 0) {
            return false;
        }

        for (int i = 0; i < 4; i++) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0 || nx < 0 || ny >= N || nx >= N) {
                return false;
            }
            if (visited[ny][nx] != 0) {
                return false;
            }
        }
        return true;
    }

    static int makeFlower(int y, int x) {
        int sum = maps[y][x];
        visited[y][x] = 1;
        for (int i = 0; i < 4; i++) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0 || nx < 0 || ny >= N || nx >= N) {
                continue;
            }
            visited[ny][nx] = 1;
            sum += maps[ny][nx];
        }
        return sum;
    }

    static void eraseFlower(int y, int x) {
        visited[y][x] = 0;
        for (int i = 0; i < 4; i++) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0 || nx < 0 || ny >= N || nx >= N) {
                continue;
            }
            visited[ny][nx] = 0;
        }
    }


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

        maps = new int[N][N];
        visited = new int[N][N];

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(bf.readLine());
            for (int j = 0; j < N; j++) {
                maps[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        ret = Integer.MAX_VALUE;
        go(0, 0);

        System.out.println(ret);
    }
}

마무리하며

완탐 문제는 생각의 흐름만 잘 정리해서, 범위와 전역 지역 변수를 적절히 선언 후 메서드만 뽑아낼 수 있다면 쉽게 풀리는 것 같다. 하지만 그 생각을 코드로 구현하는 것은 아직 미숙하다. 이 부분은 연습만이 살길이다!

꼭 시간복잡도 확인 -> 완탐으로 풀리는지 -> 메서드 정리 -> 구현 순서대로 연습하자. 파이팅이다!!

'Problem Solve' 카테고리의 다른 글

[JAVA] 1285 - 동전뒤집기 💛1 : 어려운 완탐 문제는 시간복잡도를 줄이기 위한 아이디어가 필요. 각각 경우의 수가 2인 요소들로 이루어져 있다면 비트마스킹으로 풀자!  (0) 2026.02.28
[JAVA] 19942 - 다이어트 💛4: 입력의 크기가 30 이하인 조합 문제는 비트마스킹으로 풀자!  (0) 2026.02.26
[JAVA] 15684 - 사다리 타기 💛3 : 백트래킹을 하지 않으면 풀리지 않는 완전탐색 문제  (0) 2026.02.23
[JAVA] 9934 - 완전 이진 트리 🩶1 : 트리 탐색은 index 기반으로 탐색하자.  (0) 2026.02.22
[JAVA] 3197 - 백조의 호수 💚5 : 방문배열 대신 Queue를 여러개 사용하여 탐색범위를 지정하자. (BFS + 플러드필)  (0) 2026.02.20
'Problem Solve' 카테고리의 다른 글
  • [JAVA] 1285 - 동전뒤집기 💛1 : 어려운 완탐 문제는 시간복잡도를 줄이기 위한 아이디어가 필요. 각각 경우의 수가 2인 요소들로 이루어져 있다면 비트마스킹으로 풀자!
  • [JAVA] 19942 - 다이어트 💛4: 입력의 크기가 30 이하인 조합 문제는 비트마스킹으로 풀자!
  • [JAVA] 15684 - 사다리 타기 💛3 : 백트래킹을 하지 않으면 풀리지 않는 완전탐색 문제
  • [JAVA] 9934 - 완전 이진 트리 🩶1 : 트리 탐색은 index 기반으로 탐색하자.
노을을
노을을
진인사대천명
  • 노을을
    노을의 개발일기장
    노을을
  • 전체
    오늘
    어제
    • All (105) N
      • Java & Kotlin (16)
      • Problem Solve (46)
      • Spring (4)
      • Infra (3) N
      • DB (2)
      • Project (2)
        • SOMA (1)
        • OJik (1)
      • OpenSource (3)
      • Various Dev (23)
        • 우아한테크코스 (9)
        • Git&Github (2)
        • Unity (12)
      • Book (3)
      • Writing (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    8기
    합격
    유니티
    github
    java
    게임개발
    시뮬레이션
    코테
    우아한테크코스
    비트마스킹
    자바
    코딩
    개발
    트러블슈팅
    알고리즘
    오픈소스
    개발자
    contribute
    백준
    프리코스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
노을을
[JAVA] 14620 - 꽃길 🩶2: 방문배열을 야무지게 활용하는 완탐 문제
상단으로

티스토리툴바