현인

[프로그래머스] 튜플 with JS 본문

알고리즘

[프로그래머스] 튜플 with JS

현인(Hyeon In) 2023. 4. 3. 21:12

알고리즘 스프린트 12일차 - [프로그래머스] Lv 2. 튜플 ( 2019 카카오 개발자 겨울 인턴십 )

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

소요시간

40분

계획

풀이

  • 문자열 다루기 문제
  • 일단 스플릿을 해야되는데 ‘,’ 기준으로 단순히 스플릿을 할 수 없다
  • 직접 문자열 처음부터 반복하면서 알맞게 잘라내줬다
  • 원본 튜플은 어떻게 찾을까?
    • 원본 튜플의 부분집합들이 주어지니까 가장 많이 등장하는 원소가 가장 앞 원소임을 알 수 있다
      • 등장 횟수를 기록할 체크 배열을 만든다
      • 체크 배열은 [원소, 등장횟수]의 형태로 범위 내 숫자마다 만들어준다
      • ex) [[0, 0], [1, 0],[2, 0],[3, 0],[4,0],[5, 0]]
      • 이렇게 만들어 주면 원소를 인덱스로 사용하여 등장횟수를 증가시킬 수 있고
      • 등장 횟수를 기준으로 정렬을 할 수 있다
    • 문자열을 잘라내면서 원소 하나가 만들어 질 때마다 체크 배열에 등장 횟수를 증가시킨다. 
  • 나온 횟수 기준으로 정렬해서 큰 값부터 정답 배열에 순서대로 추가해주면 된다

결과

코드

더보기
function solution(s) {
    var answer = [];
    const check = Array.from({length: 100001}, (n, i) => [i,0]);
    var sSplit = [];
    let count = 0;
    let tempNum = "";
    
    //맨 처음, 맨 마지막 중괄호 빼고 문자열 반복 돌리기
    for(let i = 1; i < s.length-1; i++){
        if (s[i] == "{"){
            count = 0;
            continue
        }
        else if (s[i] == "}"){
            check[parseInt(tempNum)][1] += 1;
            tempNum = "";
        }
        else if (s[i] == ","){
            if(tempNum != ""){
                check[parseInt(tempNum)][1] += 1;
                tempNum = "";
            }
            count += 1;
            continue;
        }
        else{
            tempNum += s[i];
        }
    }
    
    // 나온 횟수로 내림차순 정렬
    check.sort(function(a, b) {
        return b[1] - a[1];
    })
    
    // 나온 횟수가 0 보다 큰 애들만 정답 배열에 넣기
    check.map(c => {
        if(c[1] == 0){
            return;
        }
        else{
            answer.push(c[0])
        }
    })
    return answer;
}

마치며

문자열 다루는 문제도 연습을 해둬야 관련 함수들이나 접근 방법을 빨리 떠올릴 수 있어서 이 문제를 풀게 되었다. 우선 순위 정렬 방법이 자바스크립트로는 익숙하지 않아서 애먹었지만 다음 번에는 잘 할 수 있을 것 같다. 내일은 다시 어려운 문제를 풀어야겠다!

반응형