40일간의 99클럽 2기 여정이 끝나고 몇주간 폐관수련...을 하고 나니 어느덧 3기 시작일이 다가왔다. 그동안 얼마나 성장했는지도 궁금하고, 3기를 거치고 앞으로 얼마나 성장할지도 기대된다. 파이팅! 😊
비기너, 미들러, 챌린저 문제 모두 작성해놓았으니 참고해주세요!
Notion에서 작성한 글이라, 여기에서 더 깔끔하게 보실 수 있습니다 😮😊
n%10
으로 마지막 자리를 추출하고, n//=10
으로 그 다음 자리를 추출하는 방식 반복return [*map(int, str(n)[::-1])]
reversed(str(n))
을 이용할 수 있다.answer = []
while n:
answer.append(n%10)
n //= 10
return answer
def solution(n, left, right):
arr = [[0]*n for _ in range(n)]
delta = ((1, 0), (1, 1), (0, 1))
prev = [(0, 0)]
f = 1
arr[0][0] = 1
while prev:
f += 1
cur = []
for y, x in prev:
for dy, dx in delta:
ny = y+dy
nx = x+dx
if 0<=ny<n and 0<=nx<n and not arr[ny][nx]:
arr[ny][nx] = f
cur.append((ny, nx))
prev = cur
return [e for row in arr for e in row][left:right+1]
Time Complexity :
특별한 알고리즘적 테크닉을 사용하는 것보다, 숫자가 채워지는 특정 패턴을 찾아서 한 번에 초기화하는 것이 필요해 보였다.
결론부터 말하면 이 방법도 배열의 값을 전부 계산해놓고 Slicing하는 것이기 때문에 으로 시간 초과가 난다.
인 경우에 대해 생각해 보자.
이를 일반화시켜보면 다음과 같다.
1번째 칸 | 2번째 칸 | 3번째 칸 | |
---|---|---|---|
1번째 줄 | max(1, 1) | max(1, 2) | max(1, 3) |
2번쨰 줄 | max(2, 1) | max(2, 2) | max(2, 3) |
3번째 줄 | max(3, 1) | max(3, 2) | max(3, 3) |
def solution(n, left, right):
return [max(i, j)+1 for i in range(n) for j in range(n)][left:right+1]
Time Complexity :
BFS를 이용하는 방법에 비해 일반항을 구해서 한 번에 초기화하는 방식은 약 두 배 이상 빠르게 동작했으나, 로 여전히 시간 초과를 피할 수는 없었다.
위 코드에서 더 소요 시간을 줄일 부분을 생각해 보면,
def solution(n, left, right):
return [max(i//n, i%n)+1 for i in range(left, right+1)]
Time Complexity :
Monotone Stack을 이용하여 에 풀 수 있는 오큰수 NGE(Next Greater Element) 문제이다.
n = len(numbers)
answer = [-1]*n
for i in range(n):
for j in range(i+1, n):
if numbers[i] < numbers[j]:
answer[i] = numbers[j]
break
return answer
def solution(numbers):
n = len(numbers)
answer = [-1]*n
stack = []
for i in range(n):
while stack and numbers[stack[-1]] < numbers[i]:
answer[stack.pop()] = numbers[i]
stack.append(i)
return answer
answer
를 -1로 초기화하자. (∵ Description - 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.)number
의 값이 담기는 게 아니라, index들이 담긴다.numbers
의 각 항목에 대해 순회한다.numbers[i]
) 보다 작다는 것 ⇒ 스택의 top이 가리키는 numbers의 뒤에 있는 큰 수는 현재 값(numbers[i]
)라는 것 ∴ pop하고 answer
를 갱신해 주면 된다.