23-07-06 TIL

more·2023년 7월 6일
0

문제

  • 백준 17266
    • 아래 코드 처럼 가로등이 있는 좌표를 가지고 거기에서 가로등의 길이를 하나씩 + 해주어서 해결해보고자 하였다.
    • 실제로 예제 코드에서는 제대로 답을 내는 것으로 보이는데 실제 제출을 하였을 경우에는 틀렸습니다가 나옴

       while (flag == false) {

            for (int i = 0; i < lamp; i++) {

                if (position.get(i) - saveHeight >= 0 && bridgeLight[position.get(i) - saveHeight] == false)
                    bridgeLight[position.get(i) - saveHeight] = true;

                if (position.get(i) + saveHeight <= bridgeLength && bridgeLight[position.get(i) + saveHeight] == false)
                    bridgeLight[position.get(i) + saveHeight] = true;
            }

            List<Boolean> lampList = new ArrayList<>(Arrays.asList(bridgeLight));
            if (lampList.contains(false)) {
                saveHeight++;
            }
            else {
                flag = true;
            }
        }

시도

  • 백준 17266
    • 문제가 무엇인지 해결하기 위해서 실제 여러가지 값을 넣어보았는데, 큰 문제는 없었다.
    • 시간초과도 아니고 그냥 틀렸습니다가 나왔기 때문에 아예 로직자체가 틀린 것인가?

해결

  • 백준 17266
    • 결국 해결하지 못하고 검색을 해본 결과 이분 탐색을 사용해서 푸는 문제라고 한다.
    • 헌데 이분 탐색을 사용하지 않고 풀었을 경우에, 시간 초과가 떠야하는 것이지 아예 틀렸습니다가 나오는게 맞는가 싶다...
      -> 나중에 이분 탐색을 사용하지 않고 푸는 것도 다시 시도해보아야겠다.

오늘 푼 문제

  • 백준 17266 (어두운 굴다리) - Java
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 굴다리 길이
        int bridgeLength = Integer.parseInt(br.readLine());

        // 가로등 갯수
        int lamp = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());

        // 램프 위치 저장
        ArrayList<Integer> position = new ArrayList<>();

        for (int i = 0; i < lamp; i++) {
            position.add(Integer.parseInt(st.nextToken()));
        }

        int res = 0;

        int min = 1;
        int max = bridgeLength;

        while (min <= max) {
            int mid = (min + max) / 2;
            boolean flag = true;

            int point = 0;
            for (int i = 0; i < position.size(); i++) {
                if (position.get(i) - mid <= point) {
                    point = position.get(i) + mid;
                }
                else flag = false;
            }

            if (bridgeLength - point > 0)   flag = false;
            else flag = true;

            if (flag) {
                res = mid;
                max = mid - 1;
            }
            else min = mid + 1;

        }

        bw.write(res + "\n");

        bw.flush();
        bw.close();
        br.close();
    }
}

0개의 댓글