세그먼트 트리 예제 - 3
문제 분석
대부분의 세그먼트 트리는 구간 합, 최댓값, 최솟값에 대해 많은 문제가 출제된다.
이 문제는 조금은 색다른 구간 곱과 관련된 문제이다.
기본 틀은 세그먼트 트리의 다른 문제와 동일하고, 조건에 따라 기존의 알고리즘 코드를 수정할 수 있어야 한다.
손으로 풀어보기
1차원 리스트로 트리의 값을 초기화한다. 트리 리스트 크기가 예제 입력 기준 트리 리스트 크기가
N = 5이므로2^k >= N을 만족하는 k값은 3이고, 리스트의 크기는2^3 * 2 = 16이 된다. 시작 인덱스는2^3 = 8이다. 곱셈이기 때문에 초깃값은 1로 저장하고, 부모 노드를 양쪽 자식 노드의 곱으로 표현한다. 이때 MOD 연산을 지속적으로 수행해 값의 범위가 1,000,000,007을 넘지 않도록 해야 한다.질의값 연산 함수와 데이터 업데이트 함수를 수행하고 결괏값을 출력한다. 이때 값을 업데이트하거나 구간 곱을 구하는 각 곱셈마다 모두 MOD 연산을 수행한다.
곱셈의 성질에 따른 세부 코드가 변경돼야 하며, MOD 연산 로직을 수행해야 한다.
곱셈과 관련된 % 연산의 성질
(A * B) % C = (A % C) * (B % C) % C두 값을 곱셈한 후 % 연산한 결과는 각각 % 연산한 값을 곱해 %로 나눈 것과 동일함
업데이트할 때 기존 값이 0일 때
이 문제에서 고민해야 할 부분은 값 업데이트에서 기존의 값이 0일 때이다.
기존의 값이 0이었다면 이 부모 노드는 모두 0으로 저장돼 있는 상태다. 따라서 기존의 구간 합과 같이 변경된 값을 부모 노드에 적용해도
0 * 변경된 데이터의 형태이므로 업데이트되지 않는 현상이 발생한다.따라서 이 부분은 부모 노드의 값을 업데이트할 때 양쪽 자식의 곱으로 업데이트해 주도록 세부 로직을 고민해야 한다.
또한 각 프로세스마다 꼼꼼하게 MOD 연산을 수행하는 것도 잊지 말아야 한다.
슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated