신호가 음수와 양수를 넘나든 횟수 세기
자바스크립트 코딩테스트 문제로 sign-transition 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.
신호 배열에서 양수와 음수가 바로 맞닿아 바뀌는 횟수를 세는 문제입니다.
문제 설명
정수 배열 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]]
아직 실행하지 않았습니다.
실행 결과
아직 실행하지 않았습니다.
예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.
댓글
문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.