백준 1461 도서관 js

2022. 5. 17. 23:02·Nodejs로 알고리즘 박살내기
 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

문제 설명

단순 정렬 문제입니다.

 

풀이.

중요한 포인트는 마지막으로 책을 놔두고 다시 0으로 돌아올 필요가 없다는 것 입니다.

따라서 마지막으로 두어야 할 책은 가장 먼 위치의 책입니다.

 

1. 책의 원래 위치가 0이 아닌 정수이므로 우선 위치가 음수인 배열과 양수인 배열로 나누어주고, 내림차순으로 정렬해 주었습니다.

 

2. 다시 0으로 돌아올 필요가 없는 가장 먼 위치의 책을 놔두는 경우를 먼저 제거해 줍니다.

양수의 배열과 음수의 배열을 절댓값으로 치환했을 때 더 큰 수가 존재하는 배열의 가장 큰 수를 정답에 더해주고, 큰 수 순으로 M개의 수를 배열에서 제거해 줍니다.

 

자 이제 가장 비용이 많이 드는 경우를 마지막으로 둔다고 가정하고 2번에서 제거해 주었으니, 나머지 책은 제자리에 두고 0으로 돌아와야 합니다. 가장 먼 위치에 존재하는 책의 거리 x 2를 정답에 더해주고, M개씩 책을 제거해주면 됩니다.

 

3. 양수의 배열과 음수의 배열 따로 M개씩 책을 제자리에 두고, 거리(왕복)만큼 정답에 더하여 정답을 구해줍니다.

 

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let N, M;

rl.on("line", function (line) {
  if (!N) {
    [N, M] = line.split(" ").map(Number);
  } else {
    let result = 0;
    const input = line.split(" ").map(Number);

    let positive = []; // 양수에 위치하는 책들
    let negative = []; // 음수에 위치하는 책들

    // 1. 양수, 음수 배열을 따로 나누고, 절댓값으로 치환.
    input.forEach((n) => {
      if (n > 0) {
        positive.push(n);
      } else {
        negative.push(Math.abs(n));
      }
    });

    // 1. 내림차순 정렬
    positive.sort((a, b) => b - a);
    negative.sort((a, b) => b - a);
    
    // 2. 양수의 배열과 음수의 배열 더 큰 수가 존재하는 배열은 
    // 가장 큰 수를 정답에 더해주고, M개의 수 만큼 제거.
    if (positive.length === 0 || positive[0] < negative[0]) {
      result += negative[0];
      negative = negative.slice(M);
    } else {
      result += positive[0];
      positive = positive.slice(M);
    }
    
    // 3. M개의 책씩 제자리에 두고, 가장 먼 위치의 거리(왕복)만큼
    // 정답에 더하여줍니다.
    let index = 0;
    while (index < negative.length) {
      result += negative[index] * 2;
      index += M;
    }
    index = 0;
    while (index < positive.length) {
      result += positive[index] * 2;
      index += M;
    }
    console.log(result);
    rl.close();
  }
});
저작자표시 비영리 변경금지 (새창열림)

'Nodejs로 알고리즘 박살내기' 카테고리의 다른 글

백준 5719 거의 최단 경로  (0) 2022.05.22
백준 2212 센서 js  (0) 2022.05.18
백준 19238 스타트 택시 js  (0) 2022.05.03
백준 3197 백조의 호수 js  (0) 2022.03.20
프로그래머스 LV.4 지형 이동 js  (1) 2022.03.11
'Nodejs로 알고리즘 박살내기' 카테고리의 다른 글
  • 백준 5719 거의 최단 경로
  • 백준 2212 센서 js
  • 백준 19238 스타트 택시 js
  • 백준 3197 백조의 호수 js
heesu
heesu
개발하면서 겪었던 경험을 공유합니다.
  • heesu
    heesu dev
    heesu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Nodejs로 알고리즘 박살내기
      • 사이드 프로젝트
        • Bitfolio
      • React Native
      • Etc
      • HTML
      • NextJS
      • Javascript
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    redux-persist
    부분합
    UnionFind
    최소 스패닝
    React Native
    JavaScript
    학습
    정렬
    백준
    union-find
    dfs
    Dijkstra
    certbot
    react-native
    프로그래머스
    cleancode
    시맨틱 태그
    asyncstorage
    우선순위 큐
    크루스칼
    BFS
    알고리즘
    Animated
    투 포인터
    lv4
    크루스칼 알고리즘
    완전 탐색
    letsencrypt
    Nodejs
    벨만포드 알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
heesu
백준 1461 도서관 js
상단으로

티스토리툴바