직관적으로는 모든 값을 이중 for문으로 순회하면서 능력치를 계산하는 방법이 있다.
그러나 이 방법으로 하면 시간초과가 난다.
리스트의 전체 값을 순회해야 하는데 정석대로 하면 시간초과가 나는 경우, 투 포인터를 사용해서 접근해볼 수 있다.
능력치는 (두 개발자 사이에 있는 개발자 수) * (두 개발자의 능력치 중 작은 값)으로 계산되므로, left와 right이라는 두 포인터를 리스트의 양 끝에 배치시켜서 두 개발자 사이에 있는 개발자 수를 최대로 만들어 보자.
그리고 두 포인터가 가리키는 값 중에서 누가 더 작은지를 비교해서, 더 작은 쪽의 값을 변화시키는 방식으로 포인터를 이동해 나간다.
left 쪽의 값이 더 작다면 left를 한 칸 오른쪽으로, right의 값이 작다면 right를 한 칸 왼쪽으로 이동하는 식이다.
그러면 이중 for문의 풀이는 O(n^2)였던 데 비해, 투 포인터로 O(n)에 풀 수 있어서 시간초과가 나지 않는다.
import sys
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
answer = 0
left, right = 0, N-1
while left < right:
cur = (right-left-1) * min(arr[left], arr[right])
answer = max(cur, answer)
if arr[left] > arr[right]:
right -= 1
else:
left += 1
print(answer)
'알고리즘' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리(파이썬) (0) | 2024.01.17 |
---|---|
[카카오 2024 인턴십 코테] 산 모양 타일링 (0) | 2024.01.17 |
[백준][Python 파이썬] 1541번 잃어버린 괄호 (2) | 2023.12.05 |
[백준][Python 파이썬] 1389번 케빈 베이컨의 6단계 법칙 (2) | 2023.12.05 |
[백준][Python 파이썬] 18870번 좌표 압축 (2) | 2023.12.03 |