[BOJ][Python]수열 #2491

https://www.acmicpc.net/problem/2491

📌풀이


내가 쓴 풀이(성공)

array_len = int(input())
array = list(map(int,input().split()))
result = 1

#길이가 2이상인 경우만 계산
if array_len != 1 :
    #이전 값 설정, 인덱스 설정
    #갯수 세기용, 같은 정수가 나오는 경우
    previous = array[0]
    idx = 1
    cnt, keep = 1, 0
    #커지는지, 작아지는지 판단하는 flag(양의 방향 1, 음의 방향 -1)
    flag = 0
    while idx < array_len:
        now = array[idx]
        
        #값이 같은 경우
        if now == previous :
            keep += 1
        #커지는 경우
        elif now > previous:
            if flag == 1:
                cnt += keep + 1
            elif flag == 0 :
                flag = 1
                cnt += keep + 1
            else :
                flag = 1
                cnt = 2 + keep 
            keep = 0
        #작아지는 경우
        else:
            if flag == -1:
                cnt += keep + 1
            elif flag == 0 :
                flag = -1
                cnt += keep + 1
            else :
                flag = -1
                cnt = 2 + keep 
            keep = 0
        
        if result < cnt + keep :
            result = cnt + keep
            
        previous = now
        idx += 1
        
print(result)
  • 리스트 안을 돌면서, 값이 이전 값과 비교했을 때 같은 경우, 큰 경우, 작은 경우를 나눠서 계산
  • keep이라는 변수를 활용하여 같은 값이 유지되는 경우, cnt에 값을 더하지 않고 keep에 추가하였다가 나중에 연산

다른 사람의 풀이

https://home-body.tistory.com/108

array_len = int(input())
array = list(map(int,input().split()))
cnt, result = 1, 1

#커지는 케이스
for idx in range(1, array_len):
    if array[idx] >= array[idx-1]:
        cnt += 1
    else :
        cnt = 1
        
    if cnt > result:
        result = cnt

#작아지는 케이스
cnt = 1
for idx in range(1, array_len):
    if array[idx] <= array[idx-1]:
        cnt += 1
    else :
        cnt = 1
        
    if cnt > result:
        result = cnt

print(result)

📌후기


시간적인 측면에서는 내 코드가 더 좋았지만, 큰 차이가 나타나지는 않았다.(둘다 O(n))

나름 되게 머리써서 구현했다고 생각했는데, 다른사람의 풀이를 보니 뭔가 간단한 길을 돌아돌아 풀어낸 느낌이었다...ㅠ

좋은 웹페이지 즐겨찾기