알고리즘 - [백준] 10816번 숫자카드2

Seong Hyeon Kim·2022년 9월 29일
0

알고리즘

목록 보기
18/20

문제


해결과정

// 숫자카드 2
const fs = require("fs");
let [N,myCardArr,M,mArr] = fs
    .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt","utf8")
    .toString()
    .trim()
    .split("\n")
    .map((e) => e.replaceAll('\r', ''))

let mycard = myCardArr.split(" ").map(Number)
let targetArr = mArr.split(" ").map(Number)

let answerNumber = []

for(let i=0; i<M; i++){
    let targetNumber = targetArr[i]    /// 10
    let cntNumber = 0;
   for(let j=0; j<N; j++){
        let myCardNumber = mycard[j]
        // console.log(myCardNumber)
        if(myCardNumber==targetNumber){
            cntNumber++ 
            // console.log(cntNumber)
        }
    }
    answerNumber.push(cntNumber)
}
let result = answerNumber.join(" ")


console.log(result)


정수 N,M 을 사용해서 for문의 범위를 설정하였고

2번째 숫자배열을 mycard 라는 배열에

4번째 숫자 배열을 targetArr 이라는 배열로 만들고

두번째 for문에서는 targetArr의 i 번째의 있는 숫자가 mycard의 배열안에 있는지

있다면 cntNumber 라는 변수에 1을 더해주고 전부다 확인하였으면

cntNumber 의 값을 answerNumber 배열에 푸시 해준다.

이렇게 모든 targetArr의 검사를 끝내고 나면

let answerNumber = [3,0,0,1,2,0,0,2]

다음과같은 배열이 나온다

이 배열의 value 값을 join으로 공백만큼 나눠서 새롭게 할당하고

그값을 콘솔로 찍으면 결과값은 똑같이 나오게 된다.


느낀점

하지만 안타깝게도 이렇게 푼 풀이방식은 시간초과가 나오게된다.

자바스크립트로 이 문제를 풀려면 이중 for문으로는 시간복잡도가 너무 커져서

시간초과가 나오는 것 같다.

아마도 2진탐색 정도되는 방식으로 풀어야 시간초과가 안나오고 여유있게 제출이 될 것 같다.

이제 진짜 효율적인 코드를 짜기위해서 머리를 써야되는 시기가 온 것 같다.


새로 알게된 것

  • .split(" ") 을 사용하면 공백을 기준으로 내가 원하는 새로운 배열을 만들기에 편하다.
    이것은 input 값을 가공하는데 시간이 오래걸리는 나에게 두고두고 좋은 메소드가 될 것 같다.

  • map() 을 사용해서 문자형이나 숫자형으로 바꿀때에는 .map(Number) 이런식으로 사용해야 된다.

  • input 값을 가공하는 과정에서 나는 늘 새로운 변수를 만들어서 할당하는 방법을 사용하다가,

let a = 1234
string(a)

console.log(typeof a)		/// String (문자형)

위에 사용한것과 비슷하게 사용한 형태로도 사용할 수 있다는것을 알게 되고

저 방법을 남발하면서 사용했었는데, 저 방법이 안된다면 그냥 새로운 변수를 만들고

이전의 값을 할당하는 얕은 복사를 많이 사용하였다.


그러나 꼭 위 방법처럼 사용하는 것보다는

let으로 선언한 변수라면

let [N,myCardArr,M,mArr] = fs
    .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt","utf8")
    .toString()
    .trim()
    .split("\n")
    .map((e) => e.replaceAll('\r', ''))

let mycard = myCardArr.split(" ").map(Number)

여기서 사용한 mycard 처럼 한번 더 같은 변수명을 사용하면
일종의 덮어쓰기가 가능하다는것을 알게되었다.

이제 변수명을 여러개 사용하느라 새로 짓을려고 머리 싸매고 있을 시간을 줄이게 되었다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글