알고리즘 - [백준] 1764번 듣보잡

Seong Hyeon Kim·2022년 10월 10일
0

알고리즘

목록 보기
20/20
post-thumbnail

문제

풀이과정


//  듣보잡
const fs = require("fs");
let [A,...names] = fs
    .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt","utf8")
    .toString()
    .trim()
    .split("\r");
    
    names = names.map((e) => e.replaceAll('\n', ''));

    const N = Number(A[0])  /// 3
    const M = Number(A[2])  /// 4
    
    let noListenPeoples = [];       // 듣도못한
    let noSeePeoples = [];          // 보도못한
    
    for(let i=0; i<N; i++) noListenPeoples.push(names[i])
    for(let j=N; j<N+M; j++) noSeePeoples.push(names[j])

    // console.log(noListenPeoples,noSeePeoples)
    // console.log(noSeePeoples[0])
    
    let setLP = new Set(noListenPeoples)
    
    // let kk = setLP.has(noSeePeoples[1])
    // console.log(kk)
    
    let answer = []
    for(let k=0; k<noListenPeoples.length; k++){
        if(setLP.has(noSeePeoples[k])){
            answer.push(noSeePeoples[k])
        }
    }
    answer = answer.sort()
    const result = `${answer.length}`+('\n')+answer.join('\n')
    // console.log(answer)
    console.log(result)

이 문제 같은 경우 어떻게 풀어야될지는 바로 감이 잡혔지만,

다 풀기까지는 시행착오들이 좀 많았었다.

우선 문제는 3,4 라는 수가 주어지고 첫번째3 은 듣도 못한 / 두번째 4는 보도 못한

이라는 집합 이름들을 뜻하고 그 집합에 있는 사람 숫자를 말한다.

그리고 나머지 이름들은 위에서부터 순차적으로 3번째 까지는 듣도못한

그 이후부터는 보도못한 이라는 리스트에 이름들을 말한다.

그리고 두 집합 사이에 공통된 이름을 듣보잡 으로 취급하고

듣보잡인 사람들의 숫자와 명단을 출력하게 되는 문제이다

문제에서 요구하는 것 그대로 noListenPeoples(듣도못한) , noSeePeoples(보도못한)

이라는 배열에 문제에서 요구하는 이름들을 넣어놓고 교집합을 구하고자 했다.

그런데 맨처음 풀이에서는 위에 올려놓은 답과는 조금 다르게 코드를 작성했었다.

23번째 줄 부터 끝까지는 처음에는 조금 다르게 풀었었는데,


noListenPeoples 의 value 값은  [ 'ohhenrie', 'charlie', 'baesangwook' ] 

noSeePeoples의  value 값은 [ 'obama', 'baesangwook', 'ohhenrie', 'clinton' ]

즉,
noListenPeoples 2번째 인덱스인 baesangwook
noSeePeoples의 1번째 인덱스인 baesangwook

둘이 같은 인덱스니깐 그냥 평범하게 반복문을 돌리면 되겠지 하는 찰사에 혹시 몰라서

콘솔창으로 확인을 해보니까 둘다 같은 문자임에도 false 가 나왔다.

이게 대체 왜 이렇게 나오는지는 아직 찾지 못하였다.

무난하게 풀릴것 같던 문제가 여기서부터 조금 막혀서 글자 하나하나 다 split("") 으로

나눠서 대조해야되나 싶은 느낌까지 들어서 그럼 너무 오래걸리고 비효율적인데 하는 생각에

결국 다른 사람들은 어떻게 풀었는지 래퍼런스를 찾아보던 중 새로운 메소드를 알게되었다.


다른사람들의 풀이법에 공통적으로 new Sethas 가 많이 나왔길래 궁금해서 찾아보니

지금의 나에게 딱 필요한 메소드라서 공식문서를 확인 후 사용하였고,

지금 내 코드에서도 똑같이 작동하는지 실험용 코드도 작성해 본 후

지금의 완성된 코드가 나오게 되었다.


느낀점

아쉽게도 이 코드 역시 vs코드 상에서는 정상적으로 작동하지만 제출하면 9% 까지만 돌아가고

실패하였다고 나온다.

아마도 다른 반례들에서 통과가 안되는 부분이 발생한 것으로 예상이 된다.

그리고 위에서 있었던 다른 문제점인 같은 문자형에 같은 알파벳임에도 왜 false가 나왔는지는

여전히 찾지를 못했다.


열심히 풀었는데 두문제나 제출이 안되서 좀 아쉽긴 하지만

그래도 새로운 메소드도 알게되서 나름 보람차게 풀었던 것 같다.


새로 알게된 것

  • hasnew Set 으로 만들어진 객체에서 사용할 수 있는 메소드이다.

  • 사용하는 방식은 filter() 함수와 비슷하게 사용하면 되는 것 같다.

  • new Set 으로 만들어진 객체에만 사용할 수 있다.

var myArray = ['value1', 'value2', 'value3'];

// Array를 Set으로 변환하기 위해서는 정규 Set 생성자 사용
var mySet = new Set(myArray);

mySet.has('value1'); // true 반환

// set을 Array로 변환하기 위해 전개 연산자 사용함.
console.log([...mySet]); // myArray와 정확히 같은 배열을 보여줌
  • 위와 같이 기존에 배열을 new Set 의 객체형태로 다시 가공해서도 만들 수 있따.
profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글