Skip to content

251203 : [BOJ 1461] 도서관 - #2220

Merged
sunha20 merged 1 commit into
mainfrom
sunha/2219/1
Jan 12, 2026
Merged

sunha20 merged 1 commit into
mainfrom
sunha/2219/1

Conversation

@sunha20

@sunha20 sunha20 commented Dec 2, 2025 •

Copy link
Copy Markdown
Contributor

🚀 이슈 번호

Resolve: {#2219}

🧩 문제 해결

스스로 해결: ✅(40m)

🔎 접근 과정

문제 해결을 위한 접근 방식을 설명해주세요.

  • 🔹 어떤 알고리즘을 사용했는지 그리디
  • 🔹 어떤 방식으로 접근했는지

접근: 최단경로라길래 그래프나 DP(M값 기준)를 잠시 고려했는데 좌표가 1차원 선상에 있고. 딱히 기존 값을 참고해서 값이 변하는 것도 아니라서 그리디를 고려. 가장 먼 책들부터 처리하는 방식이 최적해를 보장 해서 그리디로 해결했습니다.

풀이: 마지막을 제외하고는 0에서 출발해서 0으로 돌아와야하기 때문에 좌표를 음수/양수로 나누어 리스트에 저장. 마지막은 돌아오지 않기 때문에 가장 먼 좌표를 선택해서 따로 편도 처리하고 나머지 이동을 처리.

⏱️ 시간 복잡도

시간 복잡도 분석을 작성해주세요.
최악의 경우 수행 시간은 어느 정도인지 분석합니다.

  • Big-O 표기법: O(nlogn)
  • 이유:
    리스트에 저장: O(N)
    리스트 정렬: O(NlogN)
    리스트 순회/계산: O(N/M)
    N이 50이기 때문에 O(NlogN)도 충분함

💻 구현 코드

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));
        int N,M, result = 0;
        ArrayList<Integer> plus = new ArrayList<>();
        ArrayList<Integer> minus = new ArrayList<>();

        String[] temp = br.readLine().split(" ");
        N = Integer.parseInt(temp[0]);
        M = Integer.parseInt(temp[1]);

        StringTokenizer st = new StringTokenizer(br.readLine());
        int num;
        for (int n=0; n<N; n++) {
            num = Integer.parseInt(st.nextToken());
            if (num < 0) minus.add(Math.abs(num));
            else plus.add(num);
        }

        // 역순 정렬
        Collections.sort(plus, (o1, o2) -> o2- o1);
        Collections.sort(minus, (o1, o2) -> o2- o1);


        // 마지막에 놓을 책 결정.
        int pi=0, mi=0;

        // plus0이랑 minus0이랑 비교
        // plus0이 더 크면
        // 없는 경우도 체크해야함.
        int max_plus = !plus.isEmpty() ? plus.get(0) : 0;
        int max_minus = !minus.isEmpty() ? minus.get(0) : 0;

        if (max_plus > max_minus){
            // M만큼 idx를 이동하고
            pi = M;
            // result에 plus0의 값을 더함
            result += max_plus;
        }
        // minus0이랑 더 크면
        else {
            // M만큼 idx를 이동하고
            mi = M;
            // result에 minus0이랑 값을 더함
            result += max_minus;
        }


        // 나머지 경로 체크
        // plus
        while (pi < plus.size()) {
            // idx가 plus size보다 작은 동안 까지 반복
            // idx를 M씩 이동하면서 최댓값 * 2를 더함
            result += plus.get(pi)*2;
            pi += M;
        }

        // minus
        while (mi < minus.size()) {
            // idx가 plus size보다 작은 동안 까지 반복
            // idx를 M씩 이동하면서 최댓값 * 2를 더함
            result += minus.get(mi) * 2;
            mi += M;
        }

        System.out.println(result);
    }
}

@sunha20 sunha20 self-assigned this Dec 2, 2025
@sunha20
sunha20 requested a review from Eunjin3395 as a code owner December 2, 2025 23:12
@sunha20 sunha20 linked an issue Dec 2, 2025 that may be closed by this pull request
@sunha20
sunha20 merged commit deee160 into main Jan 12, 2026
3 checks passed
@sunha20
sunha20 deleted the sunha/2219/1 branch January 13, 2026 05:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

251203 : 코딩테스트

1 participant