백준-Node.js-11478, 서로 다른 부분 문자열의 개수

송철진·2023년 2월 23일
0

백준-Node.js

목록 보기
35/69

풀이

❓시간제한 1초라고 명시되어있지만 2056ms, 맞았습니다!라고 표시되는 점에서 미묘하다

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

const solution = input => {
  let obj = {}
  for(let i = 1; i<=input.length; i++){
    for(let j = 0; j<=input.length-i; j++){
      obj[input.slice(j, j+i)] = 0
    }
  }
  return Object.keys(obj).length
}

console.log(solution(input))

입력된 문자열을 규칙적으로 1글자씩, 2글자씩, ... , n글자씩 slice()하여 객체의 키로 넣고 Object.keys() 로 키만 뽑아 그 배열의 길이를 반환한다.

규칙이 한눈에 안 보일때는 이렇게 하나씩 나열해가며 규칙을 찾곤한다.

const input = 'ababc'
let obj = {}

  for(let i = 0; i+1<=input.length; i++){
    obj[input.slice(i,i+1)] = 0
  }
  for(let i = 0; i+2<=input.length; i++){
    obj[input.slice(i,i+2)] = 0
  }
  for(let i = 0; i+3<=input.length; i++){
    obj[input.slice(i,i+3)] = 0
  }
   for(let i = 0; i+4<=input.length; i++){
    obj[input.slice(i,i+4)] = 0
  }
    for(let i = 0; i+5<=input.length; i++){
    obj[input.slice(i,i+5)] = 0
  }

👉

  for(let i = 1; i<=input.length; i++){
    for(let j = 0; j<=input.length-i; j++){
      obj[input.slice(j, j+i)] = 0
    }
  }

다른 풀이

const input = 'ababc'
const solution = input => {
  let result = [];
  for (let i = 1; i <= input.length; i++) {
    for (let j = 0; j <= input.length - i; j++) {
      result.push( input.slice(j, j + i) );
    }
  }
  return new Set(result).size;
}

result = [ 'a', 'b', 'a', 'b', 'c', 'ab', 'ba', 'ab', 'bc', 'aba', 'bab', 'abc', 'abab', 'babc', 'ababc' ]로 중복된 값이 포함되어 있지만
new Set()을 사용하면 배열 안의 중복되는 데이터를 제거할 수 있다

Set

  • 생성자 : Set()
  • 속성 : size
  • 메소드 : add(value), clear(), delete(value), has(value)
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글