신호가 음수와 양수를 넘나든 횟수 세기

자바스크립트 코딩테스트 문제로 sign-transition 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.

today easy sign-transition 함수명: countSignalZeroCrossings 제한 시간: 200ms

신호 배열에서 양수와 음수가 바로 맞닿아 바뀌는 횟수를 세는 문제입니다.

문제 설명

정수 배열 signals가 주어집니다.

인접한 두 값 중 하나가 양수, 다른 하나가 음수이면 신호가 한 번 부호를 넘나들었다고 봅니다.

이런 부호 전환이 배열 전체에서 몇 번 일어나는지 반환하는 countSignalZeroCrossings 함수를 작성하세요.

단, 0은 양수도 음수도 아니므로 0이 포함된 인접 쌍은 부호 전환으로 세지 않습니다.

예를 들어 [3, -2, -5, 4, -1]에서는

  • 3 -> -2 에서 1번
  • -5 -> 4 에서 1번
  • 4 -> -1 에서 1번

3번의 부호 전환이 일어납니다.

제한사항

  • signals의 길이는 1 이상 100,000 이하입니다.
  • signals의 각 원소는 -1,000,000 이상 1,000,000 이하의 정수입니다.
  • 0은 부호가 없는 값으로 취급합니다.
  • 오직 인접한 두 값이 바로 양수/음수로 갈릴 때만 부호 전환으로 셉니다.

예시

  • 입력: signals = [3, -2, -5, 4, -1] → 출력: 3
  • 입력: signals = [1, 2, 3, 4] → 출력: 0
  • 입력: signals = [-7, 0, 5, -6] → 출력: 1
  • 입력: signals = [0, 0, 0] → 출력: 0

힌트

  • 배열을 왼쪽부터 보면서 현재 값과 바로 이전 값의 부호만 비교하면 됩니다.
  • 두 값의 곱이 음수인지 확인하는 방법도 떠올릴 수 있습니다.
  • 단, 0이 끼어 있으면 전환으로 세면 안 됩니다.

해설

이 문제는 배열 전체를 한 번만 보면서 인접한 두 값의 부호가 서로 반대인지 확인하면 됩니다.

각 위치 i에서 이전 값 signals[i - 1]와 현재 값 signals[i]를 비교합니다.

  • 하나가 양수이고 다른 하나가 음수면 전환 횟수를 1 증가시킵니다.
  • 둘 다 양수이거나 둘 다 음수면 넘어갑니다.
  • 둘 중 하나라도 0이면 전환으로 세지 않습니다.

예를 들어 [-7, 0, 5, -6]을 보면

  • -7 -> 0 : 0이 있으므로 세지 않음
  • 0 -> 5 : 0이 있으므로 세지 않음
  • 5 -> -6 : 양수에서 음수로 바뀌었으므로 1번

따라서 정답은 1입니다.

이 방식은 모든 원소를 한 번씩만 확인하므로 시간 복잡도는 O(n)이고, 추가 공간은 O(1)입니다.

코드 작성

starter code를 바탕으로 함수를 완성한 뒤 예제 테스트를 실행해보세요.

JavaScript 에디터 로딩 중...

커스텀 테스트

함수 인자를 JSON 배열 형태로 입력하세요. 예: [3, 5], [[1, 2, 3]]

아직 실행하지 않았습니다.

실행 결과

아직 실행하지 않았습니다.

예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.

댓글

문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.