[백준 1744번] 그리디 알고리즘 - 수 묶기

김민지·2023년 7월 5일
0

냅다 시작 백준

목록 보기
51/118

✨ 문제 ✨

✨ 정답 ✨

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./예제.txt";
let input = fs.readFileSync(filePath).toString().trim();

// const fs = require('fs'); 
// let input = fs.readFileSync('/dev/stdin').toString().trim();

input = input.split('\n')
const N = +input[0]
let numbers = []
for (let i = 1; i <= N; i++) {
    numbers.push(+input[i])
}
// 음수의 개수
// 0의 유무

let positive = []
let negative = []
let zero = []

numbers.map((el) => el > 0 ? positive.push(el) : el === 0 ? zero.push(0) : negative.push(el))


positive.sort((a, b) => b - a)
// 앞에서부터 두 개씩 곱...해야...
// 양수....
let positiveAnswer = 0;

// console.log('l', positive.includes(1))

let ones=0;

if (positive.includes(1)){
    while(positive.includes(1)){
        positive.pop(1)
        ones++;
        
    }
}
// console.log(ones)
positiveAnswer+=ones
// console.log(positive)

if (positive.length % 2 === 0) {
    for (let i = 0; i < Math.floor(positive.length / 2); i++) {
        // console.log('.', positive[2 * i] ,positive[2 * i + 1])
        positiveAnswer += positive[2 * i] * positive[2 * i + 1]
    }
} else if (positive.length % 2 !== 0) {
    for (let i = 0; i < Math.floor(positive.length / 2); i++) {
        positiveAnswer += positive[2 * i] * positive[2 * i + 1]
    }
    if (positive[positive.length - 1]) {
        positiveAnswer += positive[positive.length - 1]
    }
}

// 음수.............
// 으아....

negative.sort((a, b) => a - b)
let negativeAnswer = 0;

// console.log(positive, negative)
if (negative.length % 2 === 0) {
    for (let i = 0; i < Math.floor(negative.length / 2); i++) {
        // console.log(negative[2 * i ] ,negative[2 * i + 1])

        negativeAnswer += negative[2 * i ] * negative[2 * i + 1]
    }
} else if (negativeAnswer.length % 2 !== 0) {
    if (negative.length === 1) {
        if (zero.length > 0) {
            negativeAnswer += negative[0] * 0
        } else {
            negativeAnswer += negative[0]
        }
    } else {
        for (let i = 0; i < Math.floor(negative.length / 2); i++) {
            // console.log( negative[2 * i + 1] ,negative[2 * (i + 1)])
            negativeAnswer += negative[2 * i ] * negative[2 * i + 1]
        }
        // console.log(negativeAnswer)
        if (zero.length > 0) {
            if (negative[negativeAnswer.length - 1]) {

                // 써주나마나지만 일단 예의상 적어주기
                negativeAnswer += negative[negativeAnswer.length - 1] * 0
            }
        } else {
            if (negative[negative.length - 1]) {

                negativeAnswer += negative[negative.length - 1]
            }

        }
    }
}

console.log(positiveAnswer + negativeAnswer)

// console.log(positiveAnswer)
// console.log(negativeAnswer)

🧵 참고한 정답지 🧵

나의 더러운 첫 번째 풀이는 정답지를 참고하지 않았다.
아래는 내 복잡한 코드와는 다르게 너무나도 깔끔해서 보고 충격 받은 정답지다.
https://tesseractjh.tistory.com/157
사실 밸로그 작성 끝내자마자 컴퓨터 끄려고 했는데 다른 분들 답안이 궁금해져서 검색해 보았다. 그리고 충격 받아서 다시 게시글 수정하기 버튼을 눌러서 이 부분을 추가한 것이다.

💡💡 기억해야 할 점 💡💡

  1. 와... 진짜... 엄청나게 뻘짓을 많이 했다. negativeAnswer이랑 negative랑 헷갈려서 혼용해서 쓰기도 했고, 인덱스 설정(21, 2i+1을 이상하게 했었다.)도 잘못했었다. 차라리 변수 이름을 n_sum, n_array 이런 식으로 지었어야 했나.
  2. 1은 곱하면 안된다. 손으로 풀어볼 때도 실수했던 부분인데 코드 작성할 때 적용을 안 했다. 코드를 짤 때 주의할 점은 무조건 위에 적어두어야 할 것 같다.
profile
이건 대체 어떻게 만든 거지?

0개의 댓글