알고리즘 Inflearn 블루투포스

Imnottired·2023년 3월 24일
0
post-thumbnail

문제는 수가 주어지면 뒤집고 소수인지 판별하는 것이었다.

로직 퍼포먼스 비교

function isPrime(num) {
  if (num === 1) return false;
  for (let i = 2; i < parseInt(Math.sqrt(num)); i++) {
    if (num % i === 0) {
      return false;
    }
  }
  return true;
}

let numArray = input[1].split(" ").map(Number);
let answer = [];
for (let i of numArray) {
  let num = i;
  let result = 0;
  while (num) {
    let rest = num % 10;
    result = result * 10 + rest;
    num = Math.floor(num / 10);
  }
  if (isPrime(result)) {
    answer.push(result);
  }
}

console.log(answer.join(" "));

플랜 B

  let result = 0;
  while (num) {
    let rest = num % 10;
    result = result * 10 + rest;
    num = Math.floor(num / 10);
  }
  //위 식을 대체하여 아래식으로 바꿀 수 있다.
  let result = Number(num.split("").reverse().join(""));

답지 로직

let num = Number(input[0]);
let numArray = input[1]
  .split(" ")
  .map((el) => Number(el.split("").reverse().join("")));
let maxNum = Math.max(...numArray);
let isPrime = new Array(maxNum + 1).fill(true, 2); // fill

for (let i = 2; i * i <= maxNum; i++) {
  //   if (!isPrime[i]) continue;
  for (let j = i * i; j <= maxNum; j += i) {
    isPrime[j] = false;
  }
}

// 1 2 3 4 5 6 7 8 9 10  <10
//
for (let i of numArray) if (isPrime[i]) console.log(i);

나의 로직

완벽한 나의 패배였다.

에라토스테네스의 체를 사용하여 미리 할당하고 푸는 방식이었고 콘솔로그 여러번 찍는걸로 하였는데 그것보다 한번에 보내는 방식이 더 좋았던 것 같다.

졸업선물 문제

let isNum = input[0].split(" ").map(Number);
let isMoney = isNum[1];
isNum = isNum[0];

let moneyArray = input.slice(1).map((el) => el.split(" ").map(Number));

let count = 0;
for (let i = 0; i < isNum; i++) {
  let backUp = moneyArray[i][0];
  moneyArray[i][0] = moneyArray[i][0] / 2; //기존 배열은 살려야함

  let newArray = [];

  for (let j = 0; j < isNum; j++) {
    //각각 더할거야
    newArray.push(moneyArray[j][0] + moneyArray[j][1]);
  }
  newArray.sort((a, b) => a - b); //큰순서대로 정렬

  let sumResult = 0;
  let blockCount = 0;

  for (let j = 0; j < isNum; j++) {
    // 더해보기
    sumResult += newArray[j];

    if (sumResult > isMoney) {
      break;
    }
    blockCount++;
  }

  if (blockCount > count) count = blockCount; // 가장큰 카운트

  moneyArray[i][0] = backUp;
}

console.log(count);

답지를 보니 문제점이 있었다. 나는 백업을 하거나 새로운 배열을 만들어서 그 값을 더해주고 count올라간 수를 측정하엿는데 강사님은 백업 없이 돈에서 금액을 빼는 방법으로 계산하였다.


let isNum = input[0].split(" ").map(Number);
let isMoney = isNum[1];
isNum = isNum[0];

let moneyArray = input
  .slice(1)
  .map((el) => el.split(" ").map(Number))
  .sort((a, b) => a[0] + a[1] - (b[0] + b[1]));

let count = 0;

for (let i = 0; i < isNum; i++) {
  let moneyResult = isMoney - (moneyArray[i][0] / 2 + moneyArray[i][1]);
  let cnt = 1;
  for (let j = 0; j < isNum; j++) {
    if (i !== j && moneyResult >= moneyArray[j][0] + moneyArray[j][1]) {
      moneyResult -= moneyArray[j][0] + moneyArray[j][1];
      cnt++;
    }
  } //같은 경우에도 뺴줄 수 있음

  count = Math.max(cnt, count);
}

답지를 보고 다시 해보았다.
sort를 배열값 두개끼리 계산한 경험은 처음이었고,
빼는 방식으로 계산 하는 것도 인상적이었다.
또한 빼쭈는 경우의 수에서 같은 경우도 잘 고려해주어야한다.

K번째 큰 수

이 문제는 아쉬웠던 것이 문제의 의도를 파악하지 못했다.

그래서 강의를 보게되었다.

여기서 배웠던 것은 new Set이라는 것을 처음 써보았다.

이 메소드는 .add로 로 추가할 수 있고 객체를 반환한다.
그래서 중복된 value값을 막을 수 있고
이를 Array.from을 활용해서 배열로 만들어주었다.

const input = require("fs")
  .readFileSync("20230324/example5.txt")
  .toString()
  .trim()
  .split("\n");

let num = input[0].split(" ").map(Number);
let numNumber = num[1];
num = num[0];

let numArray = input[1].split(" ").map(Number);

let answer = 0;
let tmp = new Set(); //중복 제거 객체 뱉음
for (let i = 0; i < num; i++) {
  for (let j = i + 1; j < num; j++) {
    for (let k = j + 1; k < num; k++) {
      tmp.add(numArray[i] + numArray[j] + numArray[k]);
    }
  }
}
let process = Array.from(tmp).sort((a, b) => b - a);
console.log(process[numNumber - 1]); // length 값 -1

// '/dev/stdin'
// [Solved✌🏻]낙준_최대, 최소

// BOJ_10818_N.java

Set

var mySet = new Set();

mySet.add(1); // Set { 1 }
mySet.add(5); // Set { 1, 5 }
mySet.add(5); // Set { 1, 5 }
mySet.add('some text'); // Set { 1, 5, 'some text' }
var o = {a: 1, b: 2};
mySet.add(o);

mySet.add({a: 1, b: 2}); // o와 다른 객체를 참조하므로 괜찮음

mySet.has(1); // true
mySet.has(3); // false, 3은 set에 추가되지 않았음
mySet.has(5);              // true
mySet.has(Math.sqrt(25));  // true
mySet.has('Some Text'.toLowerCase()); // true
mySet.has(o); // true

mySet.size; // 5

mySet.delete(5); // set에서 5를 제거함
mySet.has(5);    // false, 5가 제거되었음

mySet.size; // 4, 방금 값을 하나 제거했음
console.log(mySet);// Set {1, "some text", Object {a: 1, b: 2}, Object {a: 1, b: 2}}

Set은 add 메소드를 통해 추가할 수 있고 has를 통해 value값을 확인할 수 있다.
size는 들어있는 lenght을 값을 알려주며 delete로 제거할 수 있다.

profile
새로운 것을 배우는 것보다 정리하는 것이 중요하다.

0개의 댓글