알고리즘 166

[Python/프로그래머스]아이템 줍기_(BFS)

https://school.programmers.co.kr/learn/courses/30/lessons/87694 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 🐾 20220924 테두리 처리 어떻게하지....? 를 생각하다 모르겠어서 구글링했다. 생각보다 간단한 방법을 쓴다. 내부일 경우 0으로 채우고 내부가 아닌경우 0이 아닌지 확인하고(다른 도형의 내부인지) 둘 다 아니면 1을 저장해 모서리라는 것을 알려준다. 그런데 다들 *2를 해서 왜들 이러나... 이해가 안됐는데 아래 참고 블로그를 보고 단번에 이해했다. 경계선이 인접할 경우 의도하지 않은 최..

[Python/프로그래머스]게임 맵 최단거리_(BFS)

https://school.programmers.co.kr/learn/courses/30/lessons/1844 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 정말 쉽다. 그냥 BFS from collections import deque dx = [0,1,0,-1] dy = [1,0,-1,0] def solution(maps): q = deque([[0,0]]) n,m = len(maps), len(maps[0]) while q : x,y = q.popleft() for i in range(4) : nx,ny= x + dx[i], y + dy[i] if 0

[Python/프로그래머스]배달_다익스트라

https://school.programmers.co.kr/learn/courses/30/lessons/12978 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 🐾 20221014 전형적인 다익스트라 문제 + 리스트 돌면서 k보다 작은 수 구해 return 하면 된다. 이 문제는 양방향이다!! 양방향인지 단방향인지 잘 보고 해야한다. 코드 : import heapq def dijkstra(distance,mp) : q = [] # dist는 0, node 시작 번호는 1 heapq.heappush(q,[0,1]) distance[1] = 0 while q..

[Python]다익스트라_최단경로알고리즘 (feat. heap)

다익스트라는 그리디와 DP의 유형으로 분류되는 최단경로 알고리즘이다. DP는 계속해서 그래프를 갱신하기 때문이고 그리디는 그 순간 가장 짧은 정점을 선택하기 때문이다. 음의 가중치가 적용될 수 없어 일상생활 문제에서 잘 사용될 수 있다. 특정한 한 노드에서 다른 모든 노드로 가는 최단 경로를 찾는 알고리즘이다. 원래는 O(V^2)의 시간복잡도를 가진다. ( 리스트 이용, 돌면서 가장 거리가 짧은 노드를 찾는 경우) 이것은 5,000개 까지는 괜찮지만 개수가 10,000개가 되면 시간초과가 될 가능성이 농후하다. (파이썬은 1초에 2천만 연산이라고 생각하면 됨) 시간초과를 막기 위해서 heap을 이용하면 된다. (방문하지 않은 최단거리의 정점을 찾을 때 이용) 파이썬의 minheap은 heappop을 하면..

SQL_group,having,join

group by : 그룹화 having : 그룹에 조건을 건다. where : 레코드에 조건을 건다. hour(datetime) : 시간만 추출 Join 양쪽에 다 있는 것 : inner join 양쪽 + 왼쪽 : left outer join 예시 ) select * from topic left join author on topic.author_id = author.author_id topic 테이블을 왼쪽에 놓고 오른쪽에 author 테이블을 놓는데 이 둘은 author_id로 연결되는 것이다 . 만약 topic에는 있지만 author 테이블에 없다면 authro에 있는 data를 null로 처리한다.

[Python/프로그래머스]양궁대회_Bfs

https://school.programmers.co.kr/learn/courses/30/lessons/92342 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 🐾 2022-10-20 라이언이 이기려면 1. (해당 점수에 )어피치보다 많이 쏘기 2. (해당 점수에 쏠 )화살 아껴서 다른 화살에 몰빵하기 이 경우를 나누어서 deque에 넣는다. - 만약 n발 보다 많이 쏘면? continue - 마지막에 쏜다면 남은 화살 다 쏘기 - 만약 n발이라면 lion, apeach의 점수를 구해서 가장 큰 GAP을 만드는 화살의 리스트를 res에 넣기 focus는 ..

[Python/프로그래머스]k진수에서 소수 개수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/92335?language=python3 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 🐾 20221021 1. k진수로 변환 2. 소수 찾아 개수 구하기 코드 : def solution(n, k): word = "" # k 진수로 변환 while n : word = str(n%k) + word n = n//k word = word.split('0') cnt = 0 for w in word : # 빈공간이라면 if len(w) == 0 : continu..

[Python/BOJ] 백준 1106 호텔_DP

문제에서 적어도 c명을 늘리는 것이므로 더 많이 늘리는 것도 생각을 해주어야 하기 때문에 dp의 크기를 c+100으로 한다. 100의 이유는 100명보다 작거나 같게만 고객의 수가 비용에 따라 증가할 수 있기 때문이다. 입력받은 (비용과 고객의 수)리스트를 돈다. (첫번째 for문) 입력받은 고객의 수에서 시작해서 dp리스트의 끝까지 돈다. (두번째 for문) 최소 고객의 수보다 작게는 증가를 못시키기 때문이다. dp[i]의 의미는 i 명을 증가시키는데 필요한 돈의 최솟값이다. 점화식 : dp[i] = min(dp[i-custo] + cost , dp[i]) 고객을 custo 만큼 늘린 대신 cost를 더한 값과 원래 값중에서 더 저렴한 값으로 갱신한다. i가 원했던 고객의 수 보다 크보다 같은 경우 값..

여러 알고리즘 시간복잡도_재귀의 시간복잡도가 O(2^n)인 이유

Big - O는 알고리즘 성능을 예측한다. 작은 차수는 무시하고 계수도 무시한다. 이진탐색 : O(logn) 재귀 : O(2^n) 정렬 : O(nlogn) heap : - 생성 : nlogn - push, pop : log(n) 여기서 궁금했던 것은 왜 재귀가 2^n 인지이다. 재귀 중 피보나치를 생각했을 때 이렇게 생각하면 된다. T(n) > 2 * T(n-2) T(n) > 2^2 * T(n-4) ... T(0)이 되면 T(n) > 2^(n/2) * T(0) 이다. T(0)은 계수가 되어 의미가 없어지고 1/2도 의미가 없어진다. 즉 재귀의 시간복잡도는 O(2^n)이 된다.

[Python/BOJ] 백준 1713 후보 추천하기_구현

이걸 어떻게 풀지...고민을 많이 했다. dict? defaultdict? 하다가 점수와 시간을 같이 dict에 넣어서 정렬해서 하려면 머리가 복잡해서 이게 맞나 찾아봤는데 그냥 list 2개를 쓰면 되는거였다. picture 리스트와 score 리스트를 index로 연결하여 이미 사진틀에 있다면 해당 인덱스의 score를 1증가시킨다. 만약 없다면 - 자리가 없다면 -> picture에서 하나 빼고, score에서 하나 빼고 - 자리가 있다면 -> picture에서 하나 추가하고, score에서 하나 추가한다. 코드 : if __name__=="__main__" : n = int(input()) vote = int(input()) student = list(map(int,input().split()))..