728x90

문제


https://www.acmicpc.net/problem/1026

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거

www.acmicpc.net

 

코드


//실버4 보물
//https://www.acmicpc.net/problem/1026
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

let S = 0; //정답 변수
const N = Number(input[0]);
//A는 오름차순 배열
let A = input[1]
  .split(" ")
  .map((i) => Number(i))
  .sort((a, b) => a - b);
//B는 내림차순 배열
let B = input[2]
  .split(" ")
  .map((i) => Number(i))
  .sort((a, b) => b - a);

for (let i = 0; i < N; i++) {
  //정답에 A,B배열의 각 index요소를 곱하여 더하기
  S += A[i] * B[i];
}
console.log(S);

 

후기


  • 문제에 B는 재배열이 안된다는 함정이 숨어있었다. 하지만 출력은 결국 S를 하는 것이니 A,B를 어떻게 배열하든 그저 최소의 값만 만들면 되는 것이었다. 하나는 오름차순 하나는 내림차순 해서 각 index의 요소들을 곱해주면 그 값이 가장 최소값이 된다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
728x90

문제


https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

코드


//실버5 셀프 넘버
//https://www.acmicpc.net/problem/4673

function selfNumber(n) {
  let number = n; //생성자인 n copy
  let result = 0;

  //숫자를 10으로 나누며 각 자릿수를 result에 더함
  for (let i = 0; i < String(n).length; i++) {
    result += number % 10;
    number = Math.floor(number / 10);
  }

  return n + result; //입력받은 수 n과 result를 더하여 return
}

const range = 10000;
let selfNumbers = new Array(range + 1).fill(true); //0~10000까지의 index를 가지는 배열 생성하고 true로 초기화

//selfNumber함수에 생성자 i를 인자로 줬을 때, return되는 수는 셀프넘버가 아니므로 false로 만들기
for (let i = 0; i <= range; i++) {
  selfNumbers[selfNumber(i)] = false;
}
//정답 출력
for (let i = 0; i < range; i++) {
  if (selfNumbers[i] === true) console.log(i);
}

 

후기


  • 처음에 규칙을 찾는데도 시간이 좀 걸렸고, 판단된 셀프넘버를 어떻게 처리해줘야하는지에서도 고민이 길어졌다.
  • 다른 분의 풀이를 참고하여 범위가 주어졌으니 해당 크기의 배열을 선언하여 셀프넘버 여부를 처리해주는 게 시간 단축에도 좋아서 좋은 풀이라고 생각했다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
728x90

문제


https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

코드


//실버3 N과 M(2)
//https://www.acmicpc.net/problem/15650
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

function getPermutation(arr, selectNumber) {
  const result = []; //결과를 담을 배열
  if (selectNumber === 1) {
    return arr.map((value) => [value]); //1개 선택은 모든 원소를 그대로 return
  }

  arr.forEach((fixed, index, origin) => {
    const rest = [...origin.slice(index + 1)]; //해당하는 fixed를 제외한 나머지 배열
    const permutations = getPermutation(rest, selectNumber - 1); //나머지에 대한 순열을 구하기
    const attached = permutations.map((permutation) => [fixed, ...permutation]); //돌아온 순열에 떼 놓은 fixed값 붙이기

    result.push(...attached);
  });

  return result;
}

const N = Number(input[0].split(" ")[0]);
const M = Number(input[0].split(" ")[1]);
const numbers = [];
for (let i = 1; i <= N; i++) numbers.push(i); //1부터 N까지의 수를 담은 배열
const result = getPermutation(numbers, M); //numbers와 M으로 순열함수 호출
//result의 각 순열 결과에 대해 한 칸 띄워 출력하기
for (let i = 0; i < result.length; i++) {
  console.log(result[i].join(" "));
}

 

후기


  • N과 M(1)번 문제에 오름차순인 수열만 출력해야하는 조건이 하나 더 붙었다. 그래서 (1)번문제와 달리 이 문제는 조합을 이용하여 풀었다. 순열 말고 조합을 이용하면 중복 값을 제거해주므로 자동으로 오름차순된 수열만 return하는 특징이 있다 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
728x90

문제


https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

코드


//실버3 N과 M(1)
//https://www.acmicpc.net/problem/15649
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

function getPermutation(arr, selectNumber) {
  const result = []; //결과를 담을 배열
  if (selectNumber === 1) {
    return arr.map((value) => [value]); //1개 선택은 모든 원소를 그대로 return
  }

  arr.forEach((fixed, index, origin) => {
    const rest = [...origin.slice(0, index), ...origin.slice(index + 1)]; //해당하는 fixed를 제외한 나머지 배열
    const permutations = getPermutation(rest, selectNumber - 1); //나머지에 대한 순열을 구하기
    const attached = permutations.map((permutation) => [fixed, ...permutation]); //돌아온 순열에 떼 놓은 fixed값 붙이기

    result.push(...attached);
  });

  return result;
}

const N = Number(input[0].split(" ")[0]);
const M = Number(input[0].split(" ")[1]);
const numbers = [];
for (let i = 1; i <= N; i++) numbers.push(i); //1부터 N까지의 수를 담은 배열
const result = getPermutation(numbers, M); //numbers와 M으로 순열함수 호출
//result의 각 순열 결과에 대해 한 칸 띄워 출력하기
for (let i = 0; i < result.length; i++) {
  console.log(result[i].join(" "));
}

 


잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀

+ Recent posts