Coding Problem

[BOJ 2841] 외계인의 기타 연주

Yepchani 2025. 2. 27. 20:00
반응형

문제

외계인의 기타 연주

https://www.acmicpc.net/problem/2841

 

 

풀이

설명

멜로디를 연주하는데 필요한 최소 손가락 움직임을 구하는 문제입니다.

 

주의해야 할 점은 다음과 같습니다.

  1. 기타는 1번부터 6번 줄까지 있습니다.
  2. 어떤 줄의 프렛을 여러 개 누르고 있다면, 가장 높은 프렛의 음이 발생합니다.
  3. 손가락으로 프렛을 한 번 누르거나 떼는 것을 손가락을 한 번 움직였다고 합니다.

 

스택을 이용해 해결할 수 있습니다.

 

스택에는 해당 줄에서 누르고 있는 프렛들이 들어있습니다.

 

멜로디가 입력되면 다음 과정을 수행합니다.

  1. 멜로디의 줄이 처음 연주됐다면 스택에 프렛을 추가합니다.
  2. 아니라면 스택에서 멜로디의 프렛보다 높은 프렛은 모두 제거합니다.
    1. 멜로디의 프렛을 이미 누르고 있지 않다면, 스택에 추가합니다.

 

예시 코드

function solution() {
  const TOTAL_STRINGS = 6;
  const [n, p] = input().split(" ").map(Number);
  const stacks = Array.from({ length: TOTAL_STRINGS + 1 }, () => []);
  let fingerMoves = 0;

  for (let i = 0; i < n; i++) {
    const [string, fret] = input().split(" ").map(Number);
    const stack = stacks[string];

    if (!stack.length) {
      stack.push(fret);
      fingerMoves++;
    } else {
      while (stack.at(-1) > fret) {
        stack.pop();
        fingerMoves++;
      }
      if (stack.at(-1) !== fret) {
        stack.push(fret);
        fingerMoves++;
      }
    }
  }

  return fingerMoves;
}

'Coding Problem' 카테고리의 다른 글

[BOJ 3190] 뱀  (0) 2025.03.03
[BOJ 2206] 벽 부수고 이동하기  (0) 2025.03.02
[BOJ 1697] 숨바꼭질  (0) 2025.02.26
[BOJ 1043] 거짓말  (0) 2025.02.25
[BOJ 2003] 수들의 합 2  (0) 2025.02.24