728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12934

 

코딩테스트 연습 - 정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함

programmers.co.kr

 

코드


function solution(n) {
  let i = 1;
  while (i * i <= n && i * i !== n) {
    // 어떤 제곱수가 n이하이고, 그 제곱수가 n이 아닐때까지 반복하며 i++
    i++;
  }
  if (i * i === n) return (i + 1) * (i + 1);
  //어떤 제곱수가 n이하일 때, 그 수 중에서 n의 제곱근이 되는 i가 있다면 (i+1)의 제곱수 출력
  else return -1; //없다면 -1 출력
}
728x90

문제


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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

코드


// 실버4 숫자 카드
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//이분탐색 함수
function binarySearch(arr, num) {
  let start = 0;
  let middle = 0;
  let end = arr.length - 1;

  while (start <= end) {
    middle = Math.floor((start + end) / 2);

    if (arr[middle] < num) {
      start = middle + 1;
    } else if (arr[middle] > num) {
      end = middle - 1;
    } else if (arr[middle] === num) return 1;
  }
  return -1;
}

//상근이가 가지고 있는 카드배열 오름차순 정렬
let sangkeun = input[1]
  .split(" ")
  .map((i) => parseInt(i))
  .sort((a, b) => a - b);
//비교할 카드배열
let compare = input[3].split(" ").map((i) => parseInt(i));

//비교할 카드배열의 각 요소에 대해
for (let i = 0; i < compare.length; i++) {
  if (binarySearch(sangkeun, compare[i]) === 1) compare[i] = 1;
  //상근이가 가지고 있는 카드에 있다면 비교할 카드배열의 해당 수는 1로 바꾸기
  else compare[i] = 0; //없다면 0으로 바꾸기
}

console.log(compare.join(" "));
728x90

문제


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

 

1822번: 차집합

첫째 줄에는 집합 A의 원소의 개수 n(A)와 집합 B의 원소의 개수 n(B)가 빈 칸을 사이에 두고 주어진다. (1 ≤ n(A), n(B) ≤ 500,000)이 주어진다. 둘째 줄에는 집합 A의 원소가, 셋째 줄에는 집합 B의 원소

www.acmicpc.net

 

코드


//실버4 차집합
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

//이분탐색 함수
function binarySearch(arr, num) {
  let start = 0;
  let middle = 0;
  let end = arr.length - 1;

  while (start <= end) {
    middle = Math.floor((start + end) / 2);
    if (arr[middle] < num) start = middle + 1;
    else if (arr[middle] > num) end = middle - 1;
    else if (arr[middle] === num) return 1; //원하는 수를 찾으면 return 1
  }
  return -1; //아니면 return -1
}

let A = input[1].split(" ").map((i) => parseInt(i)); //집합A를 숫자배열화
let B = input[2] //집합B를 숫자배열화 후 오름차순 정렬
  .split(" ")
  .map((i) => parseInt(i))
  .sort((a, b) => a - b);

let answer = []; //정답을 담을 배열
for (let i = 0; i < A.length; i++) {
  //A의 각 요소에 대해
  if (binarySearch(B, A[i]) !== 1) {
    //B에 해당 요소가 있는지 확인하여 없다면
    answer.push(A[i]); //정답에 push
  }
}
answer.sort((a, b) => a - b); //정답배열 오름차순 정렬
if (answer.length !== 0) {
  //정답에 원소가 있다면
  console.log(answer.length); //원소 개수 출력
  console.log(answer.join(" ")); //빈칸을 두고 출력
} else {
  //원소가 없다면
  console.log(0); //0을 출력
}
728x90

문제


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

 

11656번: 접미사 배열

첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000보다 작거나 같다.

www.acmicpc.net

 

코드


//실버4 접미사 배열
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

let suffix = []; //접미사들을 담을 배열
input = input.shift(); //배열에 담긴 문자열 빼내기
for (let i = 0; i < input.length; i++) {
  suffix.push(input.slice(i)); //0부터 문자열길이만큼 slice하며 접미사배열에 넣기
}
console.log(suffix.sort().join("\n")); //사전 순으로 정렬 후 개행으로 구분하여 출력

 

후기


  • 처음에는 문자열의 맨 앞부터 제거해나가는 것에 대해 slice함수가 생각이 안나서 문자열을 reverse해서 for문으로 돌려 한글자씩 suffix배열에 저장하며 저장한 걸 또 reverse함수써서 돌려놓고 이런식으로 구현했는데 결과적으로 정답은 맞았지만 다른 분들보다 메모리나 시간이 더 많이 걸렸고, slice함수가 생각나서 구현하니 바로 줄어들었다.

+ Recent posts