jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 1753 최단경로 javascript
  • fetch 취소하기
  • 프로그래머스 숫자카드나누기 javascript
  • 백준 17406 nodeJS
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 대충만든자판 javascript
  • JavaScript
  • 자바스크립트 이벤트 위임
  • 병합정렬 자바스크립트
  • 억억단을 외우자 javascript
  • 자바스크립트 커링
  • 25632 소수 부르기 게임
  • 자바스크립트 배열의 특수함
  • safari Date format NaN
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 자바스크립트 sort는 왜 그모양일까
  • safari invalid date error
  • 자바스크립트 모듈 시스템
  • 계수정렬 자바스크립트
  • 백준 자바스크립트 입력 템플릿
  • 덧칠하기 javascript
  • 외벽 점검 javascript
  • javascript use strict
  • 퀵정렬 자바스크립트
  • 리코쳇 로봇 javascript
  • 13460 javascript nodejs
  • 리액트 프로젝트 디버깅하기
  • 가사 검색 자바스크립트
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 자바스크립트 채팅방 스크롤

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae
DS & Algorithm/programmers

[프로그래머스] 방금그곡 - 자바스크립트

DS & Algorithm/programmers

[프로그래머스] 방금그곡 - 자바스크립트

2021. 6. 28. 17:08

문제

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

코드

function solution(m, musicinfos) {
  const arr = musicinfos.map((mi) => {
    const [start, end, title, code] = mi.split(",");
    const hour = end.slice(0, 2) - start.slice(0, 2);
    const minute = end.slice(3) - start.slice(3);
    const runtime = 60 * hour + minute;

    const codeArr = code.match(/[A-Z]#?/g);
    let stream = code.repeat(Math.floor(runtime / codeArr.length));
    stream += codeArr.slice(0,runtime % codeArr.length).join("");
    return [title, runtime, stream];
  });

  const answer = arr.filter(([_, __, stream]) => {
    let i = stream.indexOf(m);
    if (i === -1) return false;
    while (i !== -1) {
      if (stream[i + m.length] !== "#") return true;
      i = stream.indexOf(m, i + 1);
    }
  });
  if (!answer.length) return "(None)";

  answer.sort((a, b) => {
    if (a[1] === b[1]) return 0;
    return b[1] - a[1];
  });
  return answer[0][0];
}

 

풀이

코드 설명을 코드 라인에 주석으로 달아놨다.

 

문제 풀이 흐름은 다음과 같다.

 

musicinfos 배열의 각각의 문자열은 다음과 같이 구성된다.

"시작 시간, 끝난 시간, 음악 제목, 악보 정보"

 

각각의 문자열은 아래의 절차를 거친다.

 

1. (끝난 시간 - 시작 시간)으로 총 재생 시간을 구한다.
2. 악보 정보로부터 악보에 사용된 음들을 #을 포함해 [A, C#, C, D#] 등으로 나눠준다.
3. 재생 시간동안 재생된 음들을 연속적인 문자열로 기록한다.
4. [음악 제목, 총 재생 시간, 총 재생된 음 정보]의 배열로 반환한다.

 

위 절차를 거친 결과 배열을 가지고
각각의 결과에 대해 문자열 m이 포함되었는지 검사한다.

 

포함된 결과가 없다면 (None)을 반환한다.

 

총 재생 시간 순으로 내림차순 정렬한다.

총 재생 시간이 같을 때는 입력된 순서를 유지해준다.

 

이렇게 정렬된 결과 배열의 첫번째 요소의 제목이 정답이다.

 

주석을 포함한 코드

function solution(m, musicinfos) {
    const arr = musicinfos.map((mi)=>{ // 입력 배열의 문자열 각각에 대해 수행한다.
        const [start, end, title, code] = mi.split(","); // 문자열에서 ,를 구분자로 각 정보를 분리
        const hour = end.slice(0,2)-start.slice(0,2); // 문자열의 0~1번째 문자는 시간
        const minute = end.slice(3)-start.slice(3); // 문자열의 3~4번째 문자는 분
        const runtime = 60 * hour + minute; // 총 재생 시간

        const codeArr = code.match(/[A-Z]#?/g); // 알파벳, 알파벳#를 찾아 각각 배열의 인덱스에 분리한다.
        let stream = code.repeat(Math.floor(runtime/codeArr.length)); // 곡이 반복된 수 n만큼 악보 정보를 더한다.
        stream += codeArr.slice(0,runtime % codeArr.length).join(""); // 재생 도중에 멈춘 시점의 음까지를 추가로 더해준다.
        return [title, runtime, stream]; // 음악 제목, 총 재생 시간, 재생된 음 정보를 반환한다.
    })

    // 다음의 filter 함수는 조건을 충족하는(return true하는) 원소만 출력하는 함수
    const answer = arr.filter(([_,__,stream])=>{ // 각각의 결과 배열에 대해 다음을 수행한다.
        let i = stream.indexOf(m); // 재생된 음 정보에 문자열 m이 포함되었는지 검사한다.
        if(i === -1) return false; // 포함되어있지 않다면 넘어간다.
        while(i !== -1){ // 포함되어 있다면
            if(stream[i+m.length] !== "#") return true;
            i = stream.indexOf(m, i+1);
           // 찾은 문자 뒤에 #이 없다면 배열 정보를 그대로 반환한다.
           // ( stream = ABC#EFG 일 때 m= ABC를 찾을 수 있다.) 
           // 찾은 문자 뒤에 #이 있다면 정답이 아니므로, 찾은 문자 뒤에 m과 일치하는 문자가 있는지 찾아야 한다.
        }        
    });
    if(!answer.length) return "(None)"; // answer 배열에 원소가 없다면 조건에 일치하는 음악이 없는 것.

    answer.sort((a,b)=>{
        if(a[1] === b[1]) return 0;
        return b[1] - a[1];
    }) // 1번 인덱스(총 재생수)가 같다면 순서를 유지하고, 같지 않다면 내림차순 정렬한다.
    return answer[0][0]; // 입력 순서 + 내림차순을 반영했으므로 배열의 첫번째 원소의 제목이 정답이다.
}
저작자표시 (새창열림)

'DS & Algorithm > programmers' 카테고리의 다른 글

[프로그래머스] 행렬 테두리 회전하기 - 자바스크립트  (0) 2021.06.29
[프로그래머스] 프렌즈4블록 - 자바스크립트  (0) 2021.06.29
[프로그래머스] 쿼드 압축 후 개수 세기 - 자바스크립트  (0) 2021.06.28
[프로그래머스] 괄호 회전하기 - 자바스크립트  (0) 2021.06.27
[프로그래머스] 압축 - 자바스크립트  (0) 2021.06.27
  • 문제
  •  
  • 코드
  •  
  • 풀이
'DS & Algorithm/programmers' 카테고리의 다른 글
  • [프로그래머스] 행렬 테두리 회전하기 - 자바스크립트
  • [프로그래머스] 프렌즈4블록 - 자바스크립트
  • [프로그래머스] 쿼드 압축 후 개수 세기 - 자바스크립트
  • [프로그래머스] 괄호 회전하기 - 자바스크립트
jiho_bae
jiho_bae
하루에 한 걸음씩

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.