update. 2023-03-28
순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다.
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return
dfs 함수 인자를 줄였으면 좋았을텐데 .. 줄이려면 global 전역변수 사용해야함.
depth와 len(numbers) 비교하고 target과 넘어오는 더하기 합 이용해 재귀 끝내기
def solution(numbers, target):
answer = 0
answer += dfs(0,numbers,0,target)
return answer
def dfs(depth, numbers,num,target):
answer = 0
if depth == len(numbers):
if target==num:
return 1
else : return 0
else :
answer += dfs(depth+1,numbers,num+numbers[depth],target)
answer += dfs(depth+1,numbers,num-numbers[depth],target)
return answer
모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.
입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.
데이터가 오지게 크면 이분 탐색.
- 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
- 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
- 심사관은 1명 이상 100,000명 이하입니다.
def solution(n,times):
times.sort()
start=1
end=times[len(times)-1]*n # 최대
mid = 0
# start,end,mid=1,times[len(times)-1]*n,0
while start <= end:
mid = (start+end)//2 # 최소 시간 후보
person = 0
for time in times:
person += mid // time
# 최소시간 후보 동안 상담 가능한 사람의 수
#
if person < n:
start = mid + 1
else:
end = mid - 1
return start
start = 1, end = 심사하는데 가장 오래 걸리는 시간 * n
mid = ( start + end ) // 2
→ 심사하는 데 걸리는 중간 시간. 이분 탐색
for time in times : person += mid // time
→ 심사하는데 걸리는 중간시간동안, 심사 가능한 사람 times로 나눴을 때 수가, 최소시간 후보동안 상담 가능한 사람의 수?
→ 최소 시간 후보(mid) 동안 상담 가능한 사람의 수 의 비교를 통해 start,end 다시 구성. start > end 이면 끝!
가장 멀리 있는 노드를 최단 경로로 이동
bfs(또는 dfs)는 "최소" , "가장빠른" 이라는 단어가 나오면 사용하면 좋다
- 가중치가 적용되지 않을 때, BFS의 부가 효과를 이용한다면, 최소 이동 횟수도 계산 가능
from collections import deque
def main():
print(solution(6,[[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]))
def solution(n,edge):
answer = 0
arr = [[] for i in range (n+1)]
visited = [0] *( n+1)
for i , j in edge:
arr[i].append(j)
arr[j].append(i)
visited[1] = 1
bfs(1,arr,visited)
for i in visited:
if i == max(visited):
answer += 1
return answer
def bfs(start,arr,visited):
que = deque([start]) # 양방향 큐
while que:
v = que.popleft() # Pop element from the start
for i in arr[v]:
if not visited[i]:
visited[i] = visited[v] + 1
que.append(i)
if __name__ == "__main__":
main()
인접행렬 만들기
초기값 설정
visited[1] = 1
bfs(start,adj,visited) → start에서 시작해 갈 수 있는 모든 정점
que = deque([start]).
que가 비어있지 않은동안. pop해서. 방문하지 않았다면 pop한 값 인접한 곳 방문 방문해서 또 que에 넣기 .
String
.startwith
(String)
def solution(phone_book):
phone_book.sort() # 정렬해서 앞뒤 비교 가능한 자원들이 위치하도록 한다.
for i in range(len(phone_book)-1):
# j가 접두어가 맞다면 : return false
if phone_book[i+1].startswith(phone_book[i]): return False
return True
to be continued ..
def solution(progresses, speeds):
stack=[]
progresses.reverse()
for i in range(len(progresses)):
stack.append(((100-progresses[i])//speeds[i])+(1 if 100-progresses[i] > 0 else 0))
answer=[]
while(stack):
cnt = 1
top=stack.pop()
print(cnt, stack)
while(stack and stack[-1] <= top):
print("here")
cnt+=1
stack.pop()
answer.append(cnt)
return answer
to be continued ..
def solution(jobs):
answer = 0
arr = []
k,start,end=0,-1,0
while len(jobs) > k:
for i in range(len(jobs)):
if start < jobs[i][0] <= end:
heapq.heappush(arr, [jobs[i][1],jobs[i][0]])
if len(arr)>0:
now = heapq.heappop(arr)
start = end
end += now[0]
answer += (end-now[1])
k += 1
else:
end += 1
return answer//(len(jobs))
to be continued ..
def solution(participant,completion):
participant.sort()
completion.sort()
for i in range (len(completion)):
if participant[i] != completion[i]:
return participant[i]
return participant[-1]
정렬해서, 가장 큰 것부터 접근해서 논문 인용 횟수 비교하기
to be continued ..
def solution(citations):
# citations.sort()
# return citations[(len(citations)-1)//2]
citations.sort()
n = len(citations)
for i in range (n):
if citations[i] >= n-i:
return n-i
return 0
to be continued ..
def solution(number, k):
stack=[]
for num in number:
while stack and stack[-1] < num and k > 0: # ***
stack.pop()
k -= 1
stack.append(num)
return ''.join(stack)
to be continued ..
def solution(triangle):
answer = 0
n = len(triangle)
dp = [[0 for j in range(n)] for i in range(n)]
dp[0][0] = triangle[0][0]
for i in range(n):
for j in range(i):
if j == 0:
dp[i][j] = dp[i-1][j] + triangle[i][j]
elif j == i:
dp[i][j] = dp[i-1][j-1] + triangle[i][j]
else:
dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + triangle[i][j]
answer = max(answer,dp[i][j])
return answer
to be continued ..
def solution(answers):
answer = [0,0,0]
patterns=[[1,2,3,4,5],[2,1,2,3,2,4,2,5],[3,3,1,1,2,2,4,4,5,5]]
for i in range(len(answers)):
if answers[i] == patterns[0][i%5]:
answer[0]+=1
if answers[i] == patterns[1][i%8]:
answer[1]+=1
if answers[i] == patterns[2][i%10]:
answer[2]+=1
max = 0
result=[]
for i in range(3):
if answer[i] > max:
max = answer[i]
for i in range(3):
if answer[i] == max:
result.append(i+1)
return result
to be continued ..
def solution(people, limit):
answer = 0
people.sort()
left, right = 0, len(people) - 1
while left <= right:
answer += 1
if people[left] + people[right] <= limit:
left += 1
right -= 1
return answer
to be continued ..