#17298

zzwwoonn·2022년 5월 22일
0

Algorithm

목록 보기
30/71

N = int(input())
inputList = list(map(int, input().split()))

maxInt = 0
maxList = []

for i in range(len(inputList)):
    if i == 0:
        maxInt = inputList[i]
        continue
    if i == len(inputList):
        maxList.append(-1)
        break
    if inputList[i] > maxInt:
        maxInt = inputList[i]
        maxList.append(maxInt)
    else:
        maxList.append(0)
maxList.append(-1)

# print(maxList)

notZeroNum = 0

for i in range(len(maxList)-1, 0, -1):
    # print("maxList[",i,"] = ", maxList[i])
    if maxList[i] != 0:
        notZeroNum = maxList[i]
    else:
        maxList[i] = notZeroNum

# print(maxList)

for i in range(len(maxList)):
    print(maxList[i], end=' ')

제일 첫 입력이 가장 큰 수로 들어올 때 예외 처리를 하지 못함

자기 보다 큰 수 중에서 가장 왼쪽인 걸 보면 되니까 입력을 받을 때 마다 이전까지 기록하고 있던 최대값이랑 비교해서 내가 더 큰가? 를 체크하고 내가 더 크다면 내가 큰 수들 중에서 가장 왼쪽에 있는 수라고 할 수 있다.

1시간 머리 굴리다가 구글링

스택을 이용하는 문제였고 배열의 값이 아닌 배열의 인덱스를 저장해두고 이를 이용하는 문제였다.

i가 주어진 배열(A)의 길이만큼 차근 차근 증가한다.
이 때 마다 스택의 TOP의 원소(인덱스)의 값과 비교한다.
<스택의 TOP 원소 - 인덱스>의 값보다 현재 i 인덱스에 해당하는 값이 더 크다면?
-> 자기보다 큰 애들 중에서 가장 왼쪽이라는 말
=> 오큰수이므로 answer에 해당 인덱스 맞춰서 값 넣어준다.

stack이 있고, 현재 i 인덱스에 해당 하는 값이 <스택의 TOP 원소 - 인덱스>의 값보다 클 때만 위의 과정을 반복한다.

예를 들면 위의 그림에서
i가 3이고 A[3] > A[stack[-1]] 일 때 7이 2보다 크므로 stack에서 2를 pop 해오고 (이게 바로 index) A[index]의 값을 갱신 해주는 것이다(이게 오큰수)

from collections import deque
N = int(input())
A = list(map(int, input().split()))

answer = [-1] * N
stack = deque()

for i in range(N):
    while stack and A[i] > A[stack[-1]]:
        index = stack.pop()
        answer[index] = A[i]

    stack.append(i)
    
print(*answer)

어제 정현이 형, 병우 형, 현우랑 간단하게 맥주를 마셨다. 셋 다 알고리즘으로는 어느정도 이름을 날리는 중 이기에 좋은 말도 많이 해줬다. 덤으로 너무 두들겨 맞아서 어질어질했다.

지금 내가 하고 있는 알고리즘 공부 즉, 생각의 흐름, 풀이 과정, 왜 이렇게 풀었나, 왜 못풀었나 하는 과정들을 정리하는 것은 이미 1,2학년에 했어야 하는 과정이기에 지금 이렇게 하기엔 시간이 너무 부족하다는 얘기가 핵심이었다.

대회를 나갈게 아니고 알고리즘은 단지 취준의 목적이며 실무에서 거의 쓰이지 않는다. 취뽀를 위해서 정말 많은 걸 준비해야 하고 알고리즘은 그 중에 딱 하나임을 명심하란다.

앞으로는 이런 과정을 조금 줄이고 보다 효율적으로 공부를 해야겠다.

나보다 잘하는 사람이 정말 많다. 제도관에서 아무나 붙잡아도 나보다는 잘할 거 같다. 하지만 스트레스 받을 필요가 전혀 없다. 내가 그동안 안했고 걔네는 했으니 걔네가 더 잘하는 건 너무 당연하다.

알고리즘 공부를 시작한지 얼마 되지도 않았고 나는 여전히 좁밥이고 아직 갈 길이 멀다. 꾸준히 하면 내 실력은 언젠간 어떤 방식으로든 증명될 것이다.

병우행님 말씀 중에 딱 하나 머리에서 떠나가질 않는 게 있는데,

정말 많은 사람들의 코드를 봐야한다. 그 수많은 코드 중에서 딱 하나, 내가 마음에 드는, 나랑 잘 맞다고 느껴지는, 이건 딱 내꺼다 라는 코드가 있다. 그걸 찾아라. 그 코드는 내가 코드를 짜는 스타일과 습관 등이 가장 비슷한 코드일 것이고 그걸로 공부를 하면 된다.

그래서 구글에 코드를 뒤지다가 꿀팁 하나 찾았다.

  • 파이썬에서 배열을 print할 때, 앞에 *을 붙여주면 공백을 기준으로 원소들만 나열된다.

진짜 개꿀

그리고 또 하나

  • 파이썬의 collections의 내장 함수 중 하나인 deque는 리스트보다 push와 pop이 빠르므로 파이썬으로 코딩테스트를 준비하는 중이라면 사용하는 것을 추천한다고 한다.

0개의 댓글