전체 글
-
[백준 파이썬 1377번]★버블소트★시간초과★VER2.0★2022.12.31
-
★큐,덱★Ver2.0★카드2[백준 파이썬 2164번]2022.12.31
-
[백준 파이썬 17298번]오큰수★시간초과★VER2.0★2022.12.31
-
[백준 파이썬 1874번]스택수열★마지막 찾을값 조건생각하기★VER2.0★2022.12.30
[백준 파이썬 11724번]연결 요소의 개수 구하기★DFS★edge 리스트★VER3.0
https://www.acmicpc.net/problem/11724
11724번: 연결 요소의 개수
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주
www.acmicpc.net
VERSION 3.0 ==>연습연습!
import sys
sys.setrecursionlimit(10000) #최대 재귀한도
N , M = map(int,sys.stdin.readline().split())
edge = [ [] for i in range(N+1)]
visited = [False] * (N+1)
for i in range(M):
u, v = map(int, sys.stdin.readline().split())
edge[u].append(v)
edge[v].append(u)
def dfs(e):
if not visited[e]:
visited[e] = True
for p in edge[e]:
dfs(p)
count = 0
for j in range(1,N+1):
if not visited[j]:
dfs(j)
count+=1
print(count)
#%%
VERSION 2.0
import sys
sys.setrecursionlimit(10000)
N , M = map(int, sys.stdin.readline().split())
edge = [[] for i in range(N+1)]
visited = [False] * (N+1)
count = 0
for i in range(M):
u,v = map(int, sys.stdin.readline().split())
edge[u].append(v)
edge[v].append(u)
# print(edge)
def dfs(v):
for e in edge[v]:
if not visited[e]:
visited[e] = True
dfs(e)
for v in range(1, N+1):
if not visited[v]:
dfs(v)
count+=1
print(count)
#%%
VERSION 1.0
import sys
sys.setrecursionlimit(10000)
N, M = map(int, sys.stdin.readline().split())
adj = [[] for _ in range(N + 1)]
#N = 6 , M = 5
#adj(EDGE) = [ [] [] [] [] [] [] [] ]
visited = [False] * (N + 1)
#visted = [ False , False , False , False , False , False , False]
count = 0
for _ in range(M):
u, v = map(int, sys.stdin.readline().split())
adj[u].append(v)
adj[v].append(u)
#u , v = 1 , 2
#adj[1].append(2) ==> adj = [ [] [2] [] [] [] [] [] ]
#adj[2].append(1) ==> adj = [ [] [2] [1] [] [] [] [] ]
#u , v = 2 , 5
#adj[2].append(5) ==> adj = [ [] [2] [1,5] [] [] [] [] ]
#adj[5].append(2) ==> adj = [ [] [2] [1,5] [] [] [2] [] ]
#u , v = 5 , 1
#adj[5].append(1) ==> adj = [ [] [2] [1,5] [] [] [2,1] [] ]
#adj[1].append(5) ==> adj = [ [] [2,5] [1,5] [] [] [2,1] [] ]
#u , v = 3 , 4
#adj[3].append(4) ==> adj = [ [] [2,5] [1,5] [4] [] [2,1] [] ]
#adj[4].append(3) ==> adj = [ [] [2,5] [1,5] [4] [3] [2,1] [] ]
#u , v = 4 , 6
#adj[4].append(6) ==> adj = [ [] [2,5] [1,5] [4] [3,6] [2,1] [] ]
#adj[6].append(4) ==> adj = [ [] [2,5] [1,5] [4] [3,6] [2,1] [4] ]
def dfs(v):
visited[v] = True
for e in adj[v]:
#adj = [ [] [2,5] [1,5] [4] [3,6] [2,1] [4] ]
if not visited[e]:
dfs(e)
# #visited = [ False , False , False , False , False , False , False]
#
for j in range(1, N + 1):
if not visited[j]: #visited 가 False일때 , visited = [False , True , True , False,
dfs(j)
#j = 1
#dfs(1)
#visited[1] = True
# for e in adj[1]=[2,5] , e= 2 , 5
#visited[2] = False ==> dfs(2) , visited[5] = False ==> dfs(5)
#dfs(2)
#visited[2] = True
#for e in adj[2] = [1,5] , e = 1 , 5
#if not visited[1]= True'''' visited[5] = False
#dfs(5)
#visited[5] =True
#for e in adj[5] = [2 , 1] , e = 2 , 1:
#if not visited[2] = True , visited[1] = True
#visited = [False , True , True , False, False , True , False]
#count+= 1
#j = 2
#visited[2] = True
#j = 3
#visited[3] = False
#dfs(3)
#visited[3] = True
#for e in adj[3] = [4]
#if not visited[4] = False
#dfs(4)
#visited[4] = True
#for e in adj[4] = [3,6] , e= 3 ,6
#if not visited[3] = True , visited[6] = False
#dfs(6)
#visited[6] =True
#for e in adj[6] = 4
#if not visited[4] = True
#visited = [False , True , True, True , True, True, True]
#count+=1 = 2
#j = 4
#visited[4] = True
#j=5
#visited[5] = True
#j=6
#visited[6] = True
count += 1
print(count) # count = 2
1. 인접한 요소에 따른 리스트 생성
adj = [[] for _ in range(N + 1)] ==> 1부터 숫자가 있으므로, N+1 개 생성
visited = [False] * (N + 1)
#visted = [ False , False , False , False , False , False , False]
count = 0
2. 인접한 요소에 따른 리스트 생성
for _ in range(M):
u, v = map(int, sys.stdin.readline().split())
adj[u].append(v)
adj[v].append(u)
1번째 , u , v = 1 , 2
#adj[1].append(2) ==> adj = [ [] [2] [] [] [] [] [] ]
#adj[2].append(1) ==> adj = [ [] [2] [1] [] [] [] [] ]
2번째 ,u , v = 2 , 5
#adj[2].append(5) ==> adj = [ [] [2] [1,5] [] [] [] [] ]
#adj[5].append(2) ==> adj = [ [] [2] [1,5] [] [] [2] [] ]
3번째 , u , v = 5 , 1
#adj[5].append(1) ==> adj = [ [] [2] [1,5] [] [] [2,1] [] ]
#adj[1].append(5) ==> adj = [ [] [2,5] [1,5] [] [] [2,1] [] ]
4번째 , u , v = 3 , 4
#adj[3].append(4) ==> adj = [ [] [2,5] [1,5] [4] [] [2,1] [] ]
#adj[4].append(3) ==> adj = [ [] [2,5] [1,5] [4] [3] [2,1] [] ]
5번째 , u , v = 4 , 6
#adj[4].append(6) ==> adj = [ [] [2,5] [1,5] [4] [3,6] [2,1] [] ]
#adj[6].append(4) ==> adj = [ [] [2,5] [1,5] [4] [3,6] [2,1] [4] ]
==> 1번 요소는 2,5
==> 2번 요소는 1,5
==> 3번 요소는 4
==> 4번 요소는 3,6
==> 5번 요소는 2,1
==> 6번 요소는 4
3. DFS 선언
def dfs(v):
visited[v] = True
for e in adj[v]:
#adj = [ [] [2,5] [1,5] [4] [3,6] [2,1] [4] ] ==> adj[v]의 리스트 안에 있는 값이 2개일경우, e는 2개의 값을 받아 2번 실행하게 된다.
if not visited[e]:
dfs(e)
3. DFS 실행 ==> 재귀함수 실행
for j in range(1, N + 1):
if not visited[j]: #visited 가 False일때
dfs(j)
#j = 1
#dfs(1)
#visited[1] = True
# for e in adj[1]=[2,5] , e= 2 , 5
#visited[2] = False ==> dfs(2) , ★visited[5] = False ==> dfs(5)
#dfs(2)
#visited[2] = True
#for e in adj[2] = [1,5] , e = 1 , 5
#if not visited[1]= True, visited[5] = False
#dfs(5)
#visited[5] =True
#for e in adj[5] = [2 , 1] , e = 2 , 1:
#if not visited[2] = True , visited[1] = True
★ visited[5] = False--> True
#visited = [False , True , True , False, False , True , False]
#count+= 1
#j = 2
#visited[2] = True
#j = 3
#visited[3] = False
#dfs(3)
#visited[3] = True
#for e in adj[3] = [4]
#if not visited[4] = False
#dfs(4)
#visited[4] = True
#for e in adj[4] = [3,6] , e= 3 ,6
#if not visited[3] = True , visited[6] = False
#dfs(6)
#visited[6] =True
#for e in adj[6] = 4
#if not visited[4] = True
#visited = [False , True , True, True , True, True, True]
#count+=1 = 2
#j = 4
#visited[4] = True
#j=5
#visited[5] = True
#j=6
#visited[6] = True
'Python(백준) > DFS_깊이 우선탐색' 카테고리의 다른 글
[백준 파이썬 2023번]신기한 소수★DFS이용한 재귀 (0) | 2023.01.02 |
---|
[백준 파이썬 11004번]★K번째 수★sorted()??★퀵 정렬★VER2.0★
https://www.acmicpc.net/problem/11004
11004번: K번째 수
수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
VERSION 2.0
==> 퀵정렬 해보자
VERSION 1.0
import sys
N, K = map(int,sys.stdin.readline().split(' '))
A = sorted(list(map(int , sys.stdin.readline().split(' '))))
print(A[K-1])
'Python(백준) > 정렬' 카테고리의 다른 글
[백준 파이썬 25305번]커트라인★SORTED()★우선순위 큐로 풀어보기★VER2.0 (0) | 2023.04.09 |
---|---|
[백준 파이썬 2587번]대표값★우선순위 힙으로 풀어보기 (0) | 2023.04.09 |
[백준 파이썬 2750번]수 정렬하기★우선순위 힙으로 풀어보기★삽입,버블 정렬 추후에 해보기★VER2.0 (0) | 2023.04.09 |
[백준 파이썬 1377번]★버블소트★시간초과★VER2.0★ (0) | 2022.12.31 |
[백준 파이썬 18870번]좌표 압축★dictionary 활용!!!★ (0) | 2022.09.23 |
★VER2.0★DEQUE 활용★누적합★그리디알고리즘★ATM[백준 파이썬 11399번]
VERSION 2.0
import sys
from collections import deque
#p1 = 3 , p2 = 1 , p3 = 4 , p4 = 3, p5 =2 ==> 인출하는데 걸리는 시간
#[1,2,3,4,5] ==> 1번은 3분, 2번은 4분 , 3번은 3+1+4 = 8분 , 4번은 3+1+4+3= 11분 , 5번 13분
#3+4+8+11+13 = 15+24 = 39분
#[2,5,1,4,3] 순서 ==> 2번 1분 , 5번 1+2 =3분 , 1번 1+2+3 = 6분 , 4번 1+2+3+3 = 9
# 3번 1+2+3+3+4 = 13분 ==> 32분
#==시간이 작은거 순서대로 배열
N = int(sys.stdin.readline())
A = list(map(int,sys.stdin.readline().split(' '))) #인출하는데 걸리는 시간
A = deque(sorted(A))
B =deque()
res = 0
while len(A)>=1:
a = A.popleft()
# print(a)
res+= a
B.append(res)
print(sum(B))
==> DEQUE 활용하여 풀어보았다
VERSION 1.0
import sys
A= int(sys.stdin.readline())
B = list(map(int, sys.stdin.readline().split(' ')))
B = sorted(B , reverse = False)
#print(B)
for i in range(len(B)-1):
B[i+1] += B[i]
print(sum(B))
인출수가 적은 순서대로 하기위해 SORTED()함수 활용==> 누적합 알고리즘 활용 ==> SUM()함수 통해 구했다.
정렬알고리즘 참고
'Python(백준) > 그리디알고리즘' 카테고리의 다른 글
★sorted(a, key = lambda x : x[0])★그리디알고리즘★회의실배정[백준 파이썬 1931번] (0) | 2022.11.02 |
---|---|
★그리디알고리즘★주유소[백준 파이썬 13305번] (0) | 2022.11.01 |
★데이터타입변환map★re활용한 split()★잃어버린 괄호[백준 파이썬 1541번] (0) | 2022.11.01 |
★그리디알고리즘★ 동전 0 [백준 파이썬 11047번] (0) | 2022.11.01 |
[백준 파이썬 1377번]★버블소트★시간초과★VER2.0★
https://www.acmicpc.net/problem/1377
1377번: 버블 소트
첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,000보다 작거나 같은 자연수 또는 0이다.
www.acmicpc.net
VERSION 2.0
VERSION 1.0
import sys
N = int(sys.stdin.readline())
A = []
for i in range(N):
A.append(int(sys.stdin.readline()))
for i in range(N-1):
changed =False
for j in range(N-1):
if A[j]>=A[j+1]:
changed = True
idx = A[j]
A[j] = A[j+1]
A[j+1] = idx
# print(A)
if changed == False:
print(A[i])
break
==> 버블소트 BUT . 시간초과
'Python(백준) > 정렬' 카테고리의 다른 글
[백준 파이썬 25305번]커트라인★SORTED()★우선순위 큐로 풀어보기★VER2.0 (0) | 2023.04.09 |
---|---|
[백준 파이썬 2587번]대표값★우선순위 힙으로 풀어보기 (0) | 2023.04.09 |
[백준 파이썬 2750번]수 정렬하기★우선순위 힙으로 풀어보기★삽입,버블 정렬 추후에 해보기★VER2.0 (0) | 2023.04.09 |
[백준 파이썬 11004번]★K번째 수★sorted()??★퀵 정렬★VER2.0★ (0) | 2023.01.01 |
[백준 파이썬 18870번]좌표 압축★dictionary 활용!!!★ (0) | 2022.09.23 |
[백준 파이썬 11286번]★절댓값 힙 구현하기★heap.heappush(리스트 , (우선순위 비교값_1) , (우선순위 비교값_2)★heap.heappop(리스트) ==> 우선순위에 따른 pop()
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
import sys
import heapq
N = int(sys.stdin.readline())
res = []
for i in range(N):
x = int(sys.stdin.readline())
if x != 0:
heapq.heappush(res , (abs(x) , x))
print(res)
#heapq.heappush(결과를 저장할 리스트 , (비교할 값_1) , (비교할 값_2 )
#==> 우선순위에 따른 정렬을 해준다.
else:
if res:
print(heapq.heappop(res)[1])
else:
print(0)
==> 리스트 res에 (우선순위 , 값) 으로 표현해준다.
==> x값이 0일경우에 heapq.heappop(res) 해주는데 ==> 우선순위가 높은거 부터 빼준다!!!!
'Python(백준) > 큐,덱' 카테고리의 다른 글
★VER2.0★enumerate, lambda 정렬★프린터 큐[백준 파이썬 1966번] (0) | 2023.04.24 |
---|---|
★str, join 기억하기★VER2.0★요세푸스문제0[백준 파이썬 11866번]★ (0) | 2023.04.24 |
★큐,덱★Ver2.0★카드2[백준 파이썬 2164번] (0) | 2022.12.31 |
[백준 파이썬 17298번]오큰수★시간초과★VER2.0★ (0) | 2022.12.31 |
★큐,덱★라우터[백준 파이썬 15828번] (0) | 2022.11.03 |
★큐,덱★Ver2.0★카드2[백준 파이썬 2164번]
VERSION 2.0
import sys
from collections import deque
#N장의 카드 , 1번이 가장 위 n번이 가장 아래
# 1 2 3 4 ==> 1버리기 ==> 2 3 4 ==> 2를 아래로 ==> 3 4 2
# 3 4 2 ==> 3 버리기 ==> 4 2 ==> 4를 아래로 ==> 2 4
# 2 4 ==> 2 버리기 ==> 4
N = int(sys.stdin.readline())
A = deque([i for i in range(1, N+1)])
while len(A) > 1:
A.popleft()
A.append(A.popleft())
print(* A)
==> DEQUE 으로 풀면 쉽다.
VERSION 1.0
import sys
from collections import deque
N = int(sys.stdin.readline())
queue = deque()
for i in range(N):
queue.append(i+1)
while True:
if len(queue) == 1:
print(queue[0])
break
else:
queue.popleft()
# print(queue)
queue.append(queue.popleft())
# print(queue)
1. queue.popleft() 맨처음 위에꺼 삭제
2. queue.append(queue.popleft()) ==> popleft() 먼저 실행 ==> 나중에 queue 에 적재 ==> 한번에 실행가능
'Python(백준) > 큐,덱' 카테고리의 다른 글
★str, join 기억하기★VER2.0★요세푸스문제0[백준 파이썬 11866번]★ (0) | 2023.04.24 |
---|---|
[백준 파이썬 11286번]★절댓값 힙 구현하기★heap.heappush(리스트 , (우선순위 비교값_1) , (우선순위 비교값_2)★heap.heappop(리스트) ==> 우선순위에 따른 pop() (1) | 2022.12.31 |
[백준 파이썬 17298번]오큰수★시간초과★VER2.0★ (0) | 2022.12.31 |
★큐,덱★라우터[백준 파이썬 15828번] (0) | 2022.11.03 |
★큐,덱★큐 2[백준 파이썬 18258번] (0) | 2022.11.03 |
[백준 파이썬 17298번]오큰수★시간초과★VER2.0★
https://www.acmicpc.net/problem/17298
17298번: 오큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
VERSION 2.0
import sys
from collections import deque
N = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split(' ')))
res = [-1] * N
deque = deque()
deque.append(0)
for i in range(1, N):
while deque and A[deque[-1]] < A[i]:
res[deque.pop()] = A[i] #i값은 가만히 있고, deque값은 pop 되므로 작은 것들만 값을 바꿔준다.
deque.append(i)
for i in res:
print(i , end = ' ')
#%%
==> deque값을 인덱스화 하여 처리한다.
==> 결과값을 미리 -1로 추가한다.
VERSION 1.0
import sys
from collections import deque
N = int(sys.stdin.readline())
A = list(map(int , sys.stdin.readline().split(' ')))
B = deque()
for i in enumerate(A):
B.append(i)
res = [-1] * N
for k ,v in B:
p = k+1
# print(k)
# print(f' B[p][1] : {B[p][1]}')
while p<=N-1:
if B[k][1] <= B[p][1]:
res[k] = B[p][1]
break
else:
p+=1
for i in res:
print(i , end = ' ')
#%%
==> while 문에 p<=N-1 해놓기 ==> 시간초과 난다.
'Python(백준) > 큐,덱' 카테고리의 다른 글
★str, join 기억하기★VER2.0★요세푸스문제0[백준 파이썬 11866번]★ (0) | 2023.04.24 |
---|---|
[백준 파이썬 11286번]★절댓값 힙 구현하기★heap.heappush(리스트 , (우선순위 비교값_1) , (우선순위 비교값_2)★heap.heappop(리스트) ==> 우선순위에 따른 pop() (1) | 2022.12.31 |
★큐,덱★Ver2.0★카드2[백준 파이썬 2164번] (0) | 2022.12.31 |
★큐,덱★라우터[백준 파이썬 15828번] (0) | 2022.11.03 |
★큐,덱★큐 2[백준 파이썬 18258번] (0) | 2022.11.03 |
[백준 파이썬 1874번]스택수열★마지막 찾을값 조건생각하기★VER2.0★
https://www.acmicpc.net/problem/1874
1874번: 스택 수열
1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.
www.acmicpc.net
import sys
from collections import deque
n = int(sys.stdin.readline())
a = deque()
for i in range(n):
a.append(int(sys.stdin.readline()))
res = []
b = deque()
for i in range(1,n+1):
b.append(i)
res.append('+')
while True:
if len(b)==0:
break
if b[-1] == a[0]:
b.pop()
a.popleft()
res.append('-')
else:
if i==n and len(b)>0:
res =[]
res.append('NO')
break
for i in list(res):
print(i)
==> i==n and len(b)>0
==> 마지막 찾을 값이 마지막이고, 연속된 배열에 숫자가 남아있는경우 while 문 계속돌아간다
==> res 값에 NO 붙여주고 BREAK 시켜준다.
'Python(백준) > 스택' 카테고리의 다른 글
[백준 파이썬 4949번]균형잡힌 세상★.join(map(str , 변수)) (0) | 2023.04.23 |
---|---|
str★split()★괄호[백준 파이썬 9012번] (0) | 2022.11.02 |
★스택★제로[백준 파이썬 10828번] (0) | 2022.11.02 |
★스택★[백준 파이썬 10828번] (0) | 2022.11.02 |