Hackerrank Sparse Arrays (JS)

김우진·2023년 5월 11일
post-thumbnail

우선 해커랭크 문제를 계속 풀어보고 있다.
풀면서 거의 기존에 썼던 메소드에게만 의존하게 되는데 아무래도 가장 많이 쓴 만큼 편안한 for 문과 if 문에 치중하게 되는거 같다.

이번 문제는 다른 방식의 반복문에 익숙하지 않아 애를 좀 먹었는데 결국 해결해보니 for문으로만도 풀 수 있었다
그럼 문제부터 보자!

내가 생성해야할 함수는 strings 와 queries 두개의 인자가 주어지고 쿼리의 배열을 바탕으로 각 배열당 스트링의 배열에 몇개씩 있는지를 배열로 반환하는 함수이다.
처음에는 뭐 세개 세개만 들어온다면 빈 배열과 3개의 0을 선언해두고 하나씩 세어보자 라고 생각했으나 문제는 queries 와 strings 안에 3개씩이 고정이 아닌 랜덤한 갯수였던 것이었다.

내가 아는 메서드들로만 사용해서 어떻게 해야하나 한참 고민했다.

// 처음에 생각했던 방법(틀린방법임)
let strings = ['ab', 'ab', 'abc']
let queries = ['ab', 'abc', 'bc']

function matchingStrings(strings, queries) {
  let result = [];
  let number = 0;
  for(let i = 0; i < queries.length; i ++){
    for(let j = 0; j< strings.length; j ++){
    if(queries[i] === strings[j]){
      result[i].push(number++)
    } 
   }
  } return result;
}

matchingStrings(strings, queries)

처음에는 이렇게 로직을 짜보았으나 될리가 없지..
어떻게 해야하나 한참 고민하다 떠올려 버렸다 그것을
!!"전개 연산자"!!
[...queries]
그렇다면 전개 연산자를 쓴다면 또 어떻게 쓸것인가? 그냥 무작정 queries 를 전개 연산자를 통해 복사만한다면 그안에 카운트하며 올라가는 숫자를 넣는것은 어떻게?!

그렇다면 이렇게 애초에 queries 의 틀을 가진 배열에 각 0만 남기면 될것이다

let queries = ['ab', 'abc', 'bc']

[...queries].fill(0) //  [0, 0, 0]

그리고 다시 재정비한 나의 함수는 다음과 같았다.

function matchingStrings(strings, queries) {
  let blankquery = [...queries].fill(0)
  for(let i = 0; i < queries.length; i ++){
    for(let j = 0; j< strings.length; j ++){
    if(queries[i] === strings[j]){
      blankquery[i]++
    } 
   }
  } return blankquery
}

제출 후 통과!

끝나고 다른 사람들은 어떻게 풀었는지 검색해보았는데 for in이나 for each문을 사용해 쉽게 푼거 같던데 나도 다른 반복문에 좀 익숙했다면 더 쉽게 풀 수 있지 않았을까 싶다 ㅎㅎㅎ 다른 반복문도 좀 익숙해져 봐야겠다.

0개의 댓글