inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

2. 바둑이 승차

바둑이 승차 질문입니다!

173

seon

작성한 질문수 5

0

package other.study;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

import static java.lang.Integer.MIN_VALUE;
import static java.lang.Math.max;
import static java.lang.System.in;

// todo: 해결 필요!!
public class Main3 {

    static int[] ch = new int[100000000];
    static int c, n, answer = MIN_VALUE;

    public static void main(String[] args) {
        Scanner kb = new Scanner(in);

        c = kb.nextInt();
        n = kb.nextInt();
        ch = new int[n];

        int[] arr = new int[n + 1];

        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }

//        DFS(0, 0, arr);
         BFS(0, arr);
        System.out.println("answer = " + answer);
    }

    static void DFS(int L, int sum, int[] arr) {

        if (sum > c) return;

        if (L == n) {
            answer = max(answer, sum);
        } else {
            DFS(L + 1, sum + arr[L], arr);
            DFS(L + 1, sum, arr);
        }
    }

    static void BFS(int L, int[] arr) {
        Queue<Node> Q = new LinkedList<>();
        Q.offer(new Node(0, arr[0]));

        while (!Q.isEmpty()) {
            int len = Q.size();
            for (int i = 0; i < len; i++) {
                Node tmp = Q.poll();

                if (tmp.weight > c) continue;

                if (L == n) {
                    answer = max(answer, tmp.weight);
                } else {
                    Q.offer(new Node(tmp.level + 1, tmp.weight + arr[tmp.level + 1]));
                    Q.offer(new Node(tmp.level + 1, tmp.weight));
                }

            }
            System.out.println();
            L++;
        }
    }

    static class Node {
        private int level, weight;

        public Node(int level, int weight) {
            this.level = level;
            this.weight = weight;
        }
    }
}

안녕하세요 선생님!

명품 강의 정말 잘 듣고 있어요!

 

바둑이 승차를 BFS로도 풀어봤는데, 문제되는 부분이 있을까해서 질문 드립니다!

 

늦었지만 새해 복 많이 받으세요!

java 코딩-테스트

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
seon님, 자바 알고리즘 문제 해결에 도전하시는 군요! 바둑이 승차 문제를 BFS로 접근하신 것 매우 흥미롭습니다.

코드를 살펴보면, BFS 내부 로직에서 몇 가지 문제가 보입니다.

  1. Q.offer(new Node(0, arr[0])); 부분에서 0번째 인덱스만 고려하고 있어서 시작점이 반드시 0번째 요소를 포함하게 됩니다. 이는 모든 경우의 수를 고려하지 못하기 때문에 문제가 될 수 있습니다. 그래서 초깃값으로 Q.offer(new Node(0, 0)); 와 같이 바꾸어 주어야 모든 경우를 검사할 수 있습니다.

  2. L == n 일때 로직 처리를 위한 조건문이 현재 while문 안쪽에 있는데, 이는 한 차례 큐에서 꺼낸 뒤의 레벨을 확인하는 것이기 때문에 큐에 넣기 전에 이미 검사해야 합니다.

  3. Node 클래스에 level을 사용하고 있지만 이는 사용되지 않고 있거나, 사용 의도가 명확하게 코드에 반영되지 않았습니다. L 변수의 값을 대신 사용하려는 것이라면, 이를 Node 객체의 생성시에 반영하여 명확하게 사용 의도를 나타내야 합니다.

  4. BFS 함수의 매개변수인 L은 사용되고 있지 않으므로 삭제하는 것이 코드를 깔끔하게 유지하는 데 도움이 될 것입니다.

또한, DFS 방식으로 문제 해결도 시도해 보셨으면 좋겠습니다. 이미 주석 처리된 DFS 함수가 있는 것으로 보아 시도해보신 것 같네요. 이 함수를 활용하고, 제약 조건(트럭의 최대 무게를 넘지 않는 등)을 만족하도록 구현하면 해답을 찾으실 수 있을 것입니다.

BFS 방식의 수정을 예시로 들자면 다음과 같을 수 있습니다:

static void BFS(int[] arr) {
    Queue<Node> Q = new LinkedList<>();
    Q.offer(new Node(0, 0)); // 초깃값 설정 수정

    while (!Q.isEmpty()) {
        Node tmp = Q.poll();
        int L = tmp.level; // 큐에서 가져온 노드의 레벨을 사용

        if (tmp.weight > c) continue;

        if (L == n) {
            answer = max(answer, tmp.weight);
        } else {
            Q.offer(new Node(L + 1, tmp.weight + arr[L]));
            Q.offer(new Node(L + 1, tmp.weight));
        }
    }
}

수정 후에도 문제가 있다면, 다시 질문해 주세요. 그리고 새해 복 많이 받으시길 바랍니다!

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

27

1

갑자기 채점 사이트가 바뀌었어요

0

32

1

문제 리스트 페이지

0

27

1

채점 사이트 관련 질문드립니다

0

23

1

봉우리 문제 질문입니다

0

81

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

64

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

72

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

85

2

6-7 강의에서

0

48

1

6-6. 장난꾸러기 질문 있습니다.

0

45

1

강의 수강후 코딩테스트

0

109

1

answer 변수 사용 여부

0

44

1

2중 for문

1

85

2

2-11. 임시반장정하기 (Runtime Error)

0

63

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

70

1

이런 풀이는 어떨까요

0

43

1

자바 스트림 방식의 효율성 질문 드립니다.

0

57

1

알고리즘 자료 구조들..

0

62

1

StringBuilder vs BufferdWriter

0

47

1

원더랜드(프림)

0

50

1

이런 코드는 어떤가요?

0

61

1

bfs 풀이

0

57

1

병합정렬

0

56

1