백준 3015번 “오아시스 재결합” 문제는 스택을 이용하여 각 사람이 볼 수 있는 다른 사람의 쌍을 구하는 문제이다. 아래에 주어진 코드를 바탕으로 문제 풀이를 설명한다:
n, *nums = map(int,open(0).read().split())
stack = []
result = 0
for i in range(n):
count = 1
while stack and stack[-1][0] <= nums[i]:
top = stack.pop()
result += top[1]
if top[0] == nums[i]:
count += top[1]
if stack:
result += 1
stack.append((nums[i], count))
print(result)
코드 설명
- 초기화 및 입력 처리:
n
과nums
에 입력 데이터를 받아오고,stack
과result
를 초기화한다. - 스택을 이용한 탐색:
각 사람의 키를nums
에서 하나씩 순서대로 처리한다. 현재 사람의 키nums[i]
를 기준으로, 스택에 쌓인 이전 사람들 중nums[i]
보다 작거나 같은 키를 가진 사람들을 제거한다. 이 과정에서 키가 같은 사람 수를 저장하고, 그 수만큼 결과 값에 더해준다. - 스택 처리 후 추가 작업:
현재 처리 중인 사람이 스택의 마지막 사람보다 크면 그 사람은 보이지 않으므로, 결과에 1을 더해준다. 이후, 현재 사람의 키와 그 사람과 같은 키의 수를 스택에 저장한다.
예제 데이터 설명
예를 들어, 입력이 7 2 4 1 2 2 5 1
일 경우, 다음과 같은 과정이 진행된다:
- 첫 번째 사람
2
가 들어오면 스택은[(2,1)]
이 되고 결과는0
이다. - 두 번째 사람
4
는 첫 번째 사람보다 크므로, 스택에서2
를 제거하며 결과는1
이 된다. 스택에[(4,1)]
을 추가한다. - 세 번째 사람
1
이 들어오면 스택은[(4,1), (1,1)]
이 되며, 결과는1
이 추가되어2
가 된다. - 네 번째 사람
2
가 들어오면1
이 제거되고 결과가3
이 된다. 이후4
가 보이므로 결과는4
가 되고, 스택은[(4,1), (2,1)]
이 된다. - 다섯 번째 사람도
2
이므로, 앞서 추가된 사람과 같은 키를 가진 경우를 처리하고, 결과는5
가 된다.
이와 같은 방식으로 모든 사람을 처리한 후, 최종적으로 서로 볼 수 있는 쌍의 수는 10
이 된다.
이 문제의 핵심은 스택을 이용하여 현재 처리 중인 사람과 비교하며 볼 수 있는 쌍을 효율적으로 계산하는 것이다. 스택에 중복되는 키와 해당 키의 등장 횟수를 저장하여, 스택의 마지막 원소와 비교하여 처리하는 방식으로 시간 복잡도를 줄인다.
이 문제에 대한 추가적인 정보와 설명은 다음 블로그에서 확인할 수 있다:
https://justicehui.github.io/coi/2018/11/06/BOJ3015/
https://hyundoil.tistory.com/106
https://mingchin.tistory.com/425
'Tech > Coding' 카테고리의 다른 글
🚧Intro2Algo🐨22장.기본 그래프 알고리즘 (01)그래프의 표현 (0) | 2024.08.06 |
---|---|
파이썬🐨더욱 더 로우레벨한 입출력 (0) | 2024.07.31 |
백준17298🐨오큰수.py .c + 백준17299🐨오등큰수.py (0) | 2024.07.28 |
백준11320🐨삼각 무늬 - 1 .C (0) | 2024.07.27 |
백준2293🐨동전 1 (0) | 2024.07.21 |