Algorithm(Python)
[Python] Softeer - 징검다리
무럭무럭새싹
2023. 11. 3. 09:31
[Python] Softeer - 징검다리
Candidate | Softeer Assessment UI
softeer.ai
문제설명
남북으로 흐르는 개울에 동서로 징검다리가 놓여져 있다.
이 징검다리의 돌은 들쑥날쑥하여 높이가 모두 다르다. 철수는 개울의 서쪽에서 동쪽으로 높이가 점점 높은 돌을 밟으면서 개울을 지나가려고 한다.
돌의 높이가 서쪽의 돌부터 동쪽방향으로 주어졌을 때 철수가 밟을 수 있는 돌의 최대 개수는?
제약조건
1 ≤ N ≤ 3×103 인 정수
1 ≤ Ai ≤ 108 인 정수
입력형식
첫 번째 줄에 돌의 개수 N이 주어진다.
두 번째 줄에 돌의 높이 Ai (1 ≤ i ≤ N)가 서쪽부터 동쪽으로 차례로 주어진다.
출력형식
첫 번째 줄에 철수가 밟을 수 있는 돌의 최대 개수를 출력하라.
입력예제1
5 3 2 1 4 5
출력예제1
3
구현 코드
import sys
stone_num = int(sys.stdin.readline())
arr= list(map(int, sys.stdin.readline().split()))
dic = {}
num_list = []
for idx, value in enumerate(arr):
if idx==0:
dic[value] = 1
else:
max=0
for i in range(len(arr[:idx])):
if arr[i] < value:
if dic[arr[i]]>max:
max=dic[arr[i]]
dic[value] = max+1
maxCount = 0
for k, v in dic.items():
# print(k, v)
if v > maxCount:
maxCount = v
print(maxCount)
설명
- 간단한 그리디 알고리즘
- 철수가 동쪽으로 진행하면서 서쪽에서 동쪽으로 이동 가능한 돌을 판별하는 방식으로 동작
- 동쪽 돌의 높이가 더 높거나 같으면 해당 서쪽 돌은 밟을 수 없게 되며, 반대로 서쪽 돌의 높이가 더 높거나 같으면 동쪽 돌은 밟을 수 없음
- 각 돌에 대해 밟을 수 있는지 여부를 판단하고, 그 결과를 합산하여 최대로 밟을 수 있는 돌의 개수를 계산
- 시간복잡도: O(N), N은 돌의 갯수