티스토리 뷰
풀이
def accumulator(index, target_DNA, DNA_mapper):
for DNA in DNA_mapper:
if target_DNA == DNA:
DNA_mapper[target_DNA][index + 1] = DNA_mapper[target_DNA][index] + 1
else:
DNA_mapper[DNA][index + 1] = DNA_mapper[DNA][index]
def get_minumum_impact_factor(start_index, end_index, DNA_mapper):
for DNA in DNA_mapper:
if DNA_mapper[DNA][end_index + 1] - DNA_mapper[DNA][start_index] > 0:
return DNA
else:
return 'T'
def solution(S, P, Q):
answer = []
impact_factor = {
'A': 1,
'C': 2,
'G': 3,
'T': 4
}
# A - C - G - T 순으로 존재하는지 검사해야함
# min factor 하나만 저장하는 것이 아니라 factor별로 구간 누적 값을 갖고 있어야
# 해당 구간에 해당 factor가 있는지 없는지를 바로 알 수 있다.
A, C, G = [0] * (len(S) + 1), [0] * (len(S) + 1), [0] * (len(S) + 1)
DNA_mapper = {
'A': A,
'C': C,
'G': G
}
for i, DNA in enumerate(S):
accumulator(i, DNA, DNA_mapper)
for i, j in zip(P, Q):
minumum = get_minumum_impact_factor(i, j, DNA_mapper)
answer.append(impact_factor[minumum])
return answer
포인트
prefix sums 개념을 응용해서 푸는 문제. array slice에 대해 매번 최소값을 찾고자 한다면 O(N * M) 만큼 시간이 걸린다. prefix sums가 합계를 누적해서 어떤 구간의 합계를 빨리 구하는 방법이듯이, 이 문제도 어떤 구간의 최소값을 빨리 구해야 한다. 맨 처음에는 하나의 배열에 최소값을 누적하려나 생각했는데, 그건 의미가 없다. 인덱스 0에 A가 나타나면 그 뒤에 오는 어떤 인덱스까지의 범위에도 최소값은 A인데, 정작 우리가 구하려는 구간에 A가 있음을 확신할 수는 없기 때문이다.
그러므로 검사하는 해당 구간에 A가 존재하는지, 그 다음으로는 C가 존재하는지, 그 다음으로는 G가 존재하는지 한 번에 알 수 있는 방법이 필요하다. DNA별로 각각 배열을 만들어서 누적 카운트를 저장하고, index로 접근해서 카운트 변동이 그 구간에 없었으면 검사하는 DNA가 그 구간에 나타나지 않았음을 알 수 있다.
Ref
'Data Structure & Algorithm' 카테고리의 다른 글
Prefix Sums (0) | 2021.03.02 |
---|---|
Dynamic Programming - 1 (0) | 2021.01.31 |
Rotation point 찾기 문제(ft. Binary Search) (0) | 2019.12.03 |
퀵 정렬(Quick sort) (0) | 2019.12.02 |
선택 정렬(Selection Sort) (0) | 2019.11.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- jQuery
- 개발 공부
- rxjs
- linkedlist
- til
- Java
- this
- GIT
- JavaScript
- Redux
- SQL
- 포인터 변수
- oracle
- 리덕스
- 인스턴스
- package.json
- 자바
- Session
- useEffect
- Conflict
- youtube data api
- c언어
- react
- getter
- 깃
- Data Structure
- Prefix Sums
- 알고리즘
- CSS
- 제네릭스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함