현인
[프로그래머스] 튜플 with JS 본문
알고리즘 스프린트 12일차 - [프로그래머스] Lv 2. 튜플 ( 2019 카카오 개발자 겨울 인턴십 )
https://school.programmers.co.kr/learn/courses/30/lessons/64065
소요시간
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;
}
마치며
문자열 다루는 문제도 연습을 해둬야 관련 함수들이나 접근 방법을 빨리 떠올릴 수 있어서 이 문제를 풀게 되었다. 우선 순위 정렬 방법이 자바스크립트로는 익숙하지 않아서 애먹었지만 다음 번에는 잘 할 수 있을 것 같다. 내일은 다시 어려운 문제를 풀어야겠다!
반응형
'알고리즘' 카테고리의 다른 글
MST (0) | 2023.07.06 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 with JS (0) | 2023.04.12 |
[프로그래머스] 코딩테스트 연습 with JS (0) | 2023.04.02 |
[프로그래머스] 징검다리 건너기 with JS (0) | 2023.04.02 |
[프로그래머스] 피로도 with JS (0) | 2023.03.31 |