완주하지 못한 선수

·2022년 3월 29일
0

알고리즘

목록 보기
31/47

어떤식으로 접근을 해야할지 몰라서 그냥 답지를 본 문제였다.

flite로 접근도 해보고 forEach로 반복문도 돌려봤는데 저 한개를 어떻게 빼야할지 모르겠더라.

그 중 sort()로 진입하여 문제를 손쉽게 처리하는 방법도 있었지만
이 문제는 해시 라는 문제 영역에 있었고, 그것은 자료구조의 영역 중
메모리 할당을 최소화하여 연산처리를 빠르게 하는 목적성을 가졌다.


아래는 나무위키에서 긁어온 설명이다.


알고리즘이 아니더라도 세상에 존재하는 모든 문제는 결국 어디서부터 시작하고,
어떤 방식으로 해결해나갈 것인가? 라는 원론적인 고민을 하게 되는데

위의 문제는 이런식으로 풀면 됐다.

  1. 기준을 잡는 데이터를 한 곳에 넣어둔 후
  2. 계산하고 싶은 데이터를 그 곳에서 같은 갯수만큼 빼는 방식으로 처리하면 된다고 생각을 했다.

기존의 정렬문제와는 다르고 중복 제거라는 문제와도 다른 조금은 신기한 방식의 문제라 생각을 했고
그만큼 문제는 더럽게 안풀렸고 분명 순서도 상으로는 말도 안되게 간단한 문제였는데 무릎을 꿇었따.....


아무튼 javascript에서는 2가지의 방법으로 문제를 풀어나갈 수 있는데

객체(Object)의 형태 비스무레하게 만들어서 풀어나가는데 그 중 나는 ES6에 생긴 Map()을 예시로 가져왔다.
가져온건가? 그냥 다른 분들 코드 보고 해석하는거다

function solution(participants, completions){
const myMap = new Map();
// 새로운 Map() 객체 생성
    for ( const participant of participants){
    // for of로 배열의 요소를 한개씩 participant에 집어넣음
        if(!myMap.get(participant)){
        // 만약에 myMap에 participant의 키값이 존재하지 않는다면
            myMap.set(participant, 1);
            // myMap에 participant를 키값으로 1을 value값으로 넣음
        }else{
            myMap.set(participant, myMap.get(participant)+1);
           // 존재한다면 participant => participnat의 주어진 수에 + 1을 해줌
        }
    }
    for(const completion of completions){
    // for of로 배열의 요소를 completion에 한개씩 집어넣음
        if(myMap.get(completion)){
        // 만약에 myMap에 completion의 키값이 존재한다면
            myMap.set(completion, myMap.get(completion)-1);
            // myMap에 completion의 값으로 들어간 value값을 1씩 깎음
        }
    }    
    for(const participant of participants){
    // for of로 배열의 요소를 한개씩 participant에 집어넣음
        if(myMap.get(participant) && myMap.get(participant) >=1 ){
        // participant의 요소가 존재하고, 그 값이 1보다 크거나 같을 경우
            answer = participant;
            // answer에 participant를 반환한다
        }
    }
    return answer 
}

너무 의문스러운게 if(myMap.get(participant) && myMap.get(participant) >=1 )
맨 아래쪽에 있는 조건문인데, 이 부분이 앞쪽만 있어도 통과는 된다.
그런데 속도차이가 50%정도 나는 것이 너무 이해가 안가는데
프로그래머스가 전반적으로 테스트케이스에 무엇이 들어있는지 확인이 안되서 좀 답답하다.

아무튼 서로 다른 배열의 중복을 검증해낼 때, 만약 중복 값이 여러개가 있을 경우에 활용할 수 있는 코드가 될 것 같다.

그러나 만약 중복된 횟수를 찾으라하면 음.... myMap.get(participant)로 보여주면 나온다! 코드로 확인했다! !

아무튼 좀 많이 어렵고 고민을 많이 해봤는데 못풀었던 문제다

sort()해서 find()로 푸는 문제도 있긴 했는데... 그렇게라도 풀었어야했는데 아직 많이 모자른 것 같다.
메소드 공부가 좀 많이 모자르다......어떻게 해야할지 ㅇㅔ휴

profile
물류 서비스 Backend Software Developer

0개의 댓글