백준 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
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바