728x90
반응형

www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

from collections import deque 

n, k = map(int,input().split())
t = [0]*100001

def bfs():
  q = deque()
  q.append(n)

  while q:
    a = q.popleft()

    if a == k : 
      print( t[k])
      return 
    
    for b in ( a-1, a+1, a*2):
      if 0<= b < 100001 and not t[b]:
        t[b] = t[a] +1
        q.append(b)

bfs()

 

n부터 시작 -> 이동 가능한 칸으로 이동 -> 그 칸에서 다시 센다 

한 번 처리된 곳은 또 가지 않는다. 

생각해보면 처음 나왔을 때의 값보다 작은 값이 들어오지 않는다. 

 

+) 이걸 dfs 로 접근하면 무한 loop가 나온다. 

728x90
반응형

'백준 > DFS_BFS' 카테고리의 다른 글

#1743 음식물 피하기 파이썬  (0) 2021.04.08
# 11725 트리의 부모 찾기 파이썬  (0) 2021.03.11
# 2644 촌수계산  (0) 2021.03.11
# 2583번: 영역 구하기  (0) 2020.10.12
# 2468번: 안전 영역  (0) 2020.10.12
728x90
반응형

www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

import heapq
import sys 
input = sys.stdin.readline 

n = int(input())
data = [] 
for i in range(n) : data.append(int(input()))
heapq.heapify(data)
result = 0 

while data:
  first = heapq.heappop(data)

  if len(data)<=0:   # 원소가 1개 이하일 때 
    break 
  
  second = heapq.heappop(data)
  heapq.heappush(data, first+second )
  result += first + second 

for i in data : 
  result += i 

print(result)

 

처음 더한 값들이 반복되어 더해지므로, 가장 작은 값부터 더해야한다. 

우선순위 큐를 이용해서 작은 값을 꺼낸다. 

728x90
반응형

'백준 > 구현' 카테고리의 다른 글

# 1476번 : 날짜  (0) 2020.10.15
# 2309번 : 일곱 난쟁이  (0) 2020.10.15
# 18406: 럭키 스트레이트  (0) 2020.10.07
728x90
반응형

www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

import heapq
import sys
input = sys.stdin.readline 

n, m, x = map(int,input().split())
# n 명, 도로 m 개 , x 마을에서 

graph= [ [] for i in range(n+1)]
for i in range(m):
  a,b,c = map(int,input().split())
  graph[a].append((b,c))

def dij(start):
  q = []
  heapq.heappush(q, (0,start))
  dist = [1e9]*(n+1)
  dist[start] = 0 

  while q:
    d, now = heapq.heappop(q)
    if dist[now]<d : continue 
    for i in graph[now]:
      cost = d + i[1]
      if cost < dist[i[0]]:
        dist[i[0]] = cost 
        heapq.heappush(q,(cost,i[0]))
  return dist 

result = [0]
dist_x = dij(x)
for i in range(1,n+1):
  result.append( dij(i)[x] + dist_x[i] ) 

print ( max(result) )
728x90
반응형

'백준 > 최단경로' 카테고리의 다른 글

# 18352 특정 거리의 도시 찾기  (0) 2021.04.10
# 1504 특정한 최단 경로  (0) 2021.04.10
# 1916 최소비용 구하기 파이썬  (0) 2021.04.09
# 1753 최단 경로 파이썬  (0) 2021.04.09
728x90
반응형

www.acmicpc.net/problem/18352

 

18352번: 특정 거리의 도시 찾기

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개

www.acmicpc.net

import heapq
import sys
input = sys.stdin.readline 


n, m, k, x = map(int,input().split())
# 도시 도로 거리 출발 도시 
graph = [ [] for _ in range(n+1) ]
for i in range(m):
  a, b= map(int, input().split())
  graph[a].append(b)

# x에서 출발, 경로가 k 인 도시 오름차순 출력 없으면 -1 

def dij(start):
  q = []
  heapq.heappush(q, (0,start))
  dist = [1e9]*(n+1)
  dist[start]=0 

  while q:
    d, now = heapq.heappop(q)
    if dist[now]<d : continue 
    
    for i in graph[now]:
      cost = d + 1
      if cost<dist[i]:
        dist[i] = cost 
        heapq.heappush(q, (cost,i))
  return dist 

result = dij(x)
answer = []

for i in range(n+1) : 
  if result[i] == k : 
    answer.append(i)

if answer == [] : print(-1)
else:
  answer.sort()
  for i in answer: print(i)
728x90
반응형

'백준 > 최단경로' 카테고리의 다른 글

# 1238 파티  (0) 2021.04.10
# 1504 특정한 최단 경로  (0) 2021.04.10
# 1916 최소비용 구하기 파이썬  (0) 2021.04.09
# 1753 최단 경로 파이썬  (0) 2021.04.09
728x90
반응형

www.acmicpc.net/problem/1504

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

import heapq
import sys
input = sys.stdin.readline

n, e = map(int,input().split()) # 정점, 간선 

graph=[ [] for _ in range(n+1) ]
for i in range(e): 
  a,b,c = map(int,input().split())
  graph[a].append((b,c))
  graph[b].append((a,c))

v1, v2 = map(int,input().split())

def dij(start):
  q = [] 
  heapq.heappush(q,(0,start))
  dist = [1e9]*(n+1)
  dist[start]=0 

  while q:
    d, now = heapq.heappop(q)
    if dist[now] < d : continue 

    for i in graph[now]:
      cost = d + i[1]
      if cost < dist[i[0]]:
        dist[i[0]] = cost 
        heapq.heappush(q, (cost,i[0]))
  return dist 


dist_1 = dij(1)
dist_v1 = dij(v1)
dist_v2 = dij(v2)

answer = min( dist_1[v1]+dist_v1[v2]+dist_v2[n], 
  dist_1[v2]+ dist_v2[v1]+dist_v1[n])

if answer >= 1e9 : 
  print(-1)
else : 
  print(answer)

 

주의사항 ) 

 

1. 양방향 그래프 => graph 에 추가할 때 앞 뒤로 다 해주기 

2. v1, v2 는 지나는 순서가 정해진 것은 x => 경우의 수 2개로 나누어서 더 작은 것으로 선택하기 

728x90
반응형

'백준 > 최단경로' 카테고리의 다른 글

# 1238 파티  (0) 2021.04.10
# 18352 특정 거리의 도시 찾기  (0) 2021.04.10
# 1916 최소비용 구하기 파이썬  (0) 2021.04.09
# 1753 최단 경로 파이썬  (0) 2021.04.09
728x90
반응형

www.acmicpc.net/problem/1916

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

import heapq
import sys
input = sys.stdin.readline 

n = int(input()) # 도시 
m = int(input()) # 버스 

graph = [ [] for _ in range(n+1)]
for i in range(m):
  s,e,c = map(int,input().split())
  graph[s].append((e,c)) # 도착, 비용 

s, e = map(int,input().split()) # 출발 도착 

def dij(start):
  q = []
  dist = [1e9]*(n+1)
  heapq.heappush(q, (0,start) )
  dist[start]=0

  while q : 
    d, now = heapq.heappop(q)

    if dist[now]< d : continue 

    for i in graph[now]:
      cost = d + i[1]
      if cost < dist[i[0]]:
        dist[i[0]] = cost 
        heapq.heappush(q, (cost,i[0]))

  return dist 

result = dij(s)
print(result[e])

 

기본 다익스트라 구현법 사용! 

728x90
반응형

'백준 > 최단경로' 카테고리의 다른 글

# 1238 파티  (0) 2021.04.10
# 18352 특정 거리의 도시 찾기  (0) 2021.04.10
# 1504 특정한 최단 경로  (0) 2021.04.10
# 1753 최단 경로 파이썬  (0) 2021.04.09
728x90
반응형

www.acmicpc.net/problem/1753

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.

www.acmicpc.net

import sys
import heapq 
input = sys.stdin.readline

V,e = map(int,input().split()) # 정점, 간선 
k = int(input()) # 시작 

graph = [ [] for _ in range(V+1)]

for i in range(e):
  u,v,w = map(int,input().split())
  graph[u].append( (v,w) ) # 이어진 곳, 거리 

# 경로 존재하지 않으면 INF 

def dij(start):
  q = []
  dist = [1e9]*(V+1)
  heapq.heappush(q, (0,k) )
  dist[start]=0
  

  while q:
    d, now = heapq.heappop(q)

    if dist[now]< d : continue # 전에 방문한 적 있으면 처리하지 않음 

    for i in graph[now]:
      cost = d + i[1]
      if cost < dist[i[0]] :
        dist[i[0]] = cost
        heapq.heappush(q, (cost,i[0]))
  return dist 

result = dij(k)

for i in range(1,V+1):
  if result[i] == 1e9 : 
    print("INF")
  else:
    print(result[i])

 

 

정점 대문자 V 

중간에 입력 받는거 소문자 v.... 

728x90
반응형

'백준 > 최단경로' 카테고리의 다른 글

# 1238 파티  (0) 2021.04.10
# 18352 특정 거리의 도시 찾기  (0) 2021.04.10
# 1504 특정한 최단 경로  (0) 2021.04.10
# 1916 최소비용 구하기 파이썬  (0) 2021.04.09
728x90
반응형

www.acmicpc.net/problem/10942

 

10942번: 팰린드롬?

총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.

www.acmicpc.net

# 시간 초과

from collections import deque

n = int(input())
data = list(map(int,input().split()))
m = int(input())

result = [1]*m 

for i in range(m):
  s,e = map(int,input().split())
  if e-s <2 : continue 
  d = deque(data[s-1:e]) 
  while len(d) > 1 :
    if d.pop() != d.popleft() : 
      result[i] = 0 

for i in range(m): print(result[i])

 

 

# 정답 ( dp ) 

 

728x90
반응형

'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글

# 10211 Maximum Subarray 파이썬  (0) 2021.04.09
# 1890 점프 파이썬  (0) 2021.04.08
# 9465 스티커 파이썬  (0) 2021.03.11
# 11722 가장 긴 감소하는 부분 수열  (0) 2020.09.17
# 1965 상자넣기  (0) 2020.09.17
728x90
반응형

www.acmicpc.net/problem/10211

 

10211번: Maximum Subarray

크기 N인 정수형 배열 X가 있을 때, X의 부분 배열(X의 연속한 일부분) 중 각 원소의 합이 가장 큰 부분 배열을 찾는 Maximum subarray problem(최대 부분배열 문제)은 컴퓨터 과학에서 매우 잘 알려져 있

www.acmicpc.net

t = int(input())

def max_sub():
  n = int(input())
  data = list(map(int,input().split())) 

  for i in range(1,len(data)):
    data[i] += data[i-1] if data[i-1]>0 else 0
  
  return max(data)

p = []

for i in range(t):
  p.append(max_sub())

for i in range(t):
  print(p[i])
728x90
반응형

'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글

# 10942 팰린드롬? 파이썬  (0) 2021.04.09
# 1890 점프 파이썬  (0) 2021.04.08
# 9465 스티커 파이썬  (0) 2021.03.11
# 11722 가장 긴 감소하는 부분 수열  (0) 2020.09.17
# 1965 상자넣기  (0) 2020.09.17
728x90
반응형

www.acmicpc.net/problem/1890

 

1890번: 점프

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장

www.acmicpc.net

import sys
n = int(input())

graph = [list(map(int, input().split())) for i in range(n)]

d = [ [0]*n for _ in range(n) ] 
d[0][0] = 1

for i in range(n):
  for j in range(n):
    if i == j == n-1 : break 
    a = graph[i][j]

    if i+ a < n :
      d[i+a][j] += d[i][j]
    if j+a < n : 
      d[i][j+a] += d[i][j]

print(d[n-1][n-1])

 

d[n-1][n-1] = 0 은 항상 만족하는 조건이다. 

만약  이중 for 문에서 n-1, n-1 인 경우를 빼지 않으면 a = 0이고 i+a<n 과 j+a<n 이 모두 True 가 되어 

더하지 않아도 되는 계산을 하게 된다. 

따라서 맨 마지막 경우를 빼는 조건을 반드시 넣어 주도록 한다. 

728x90
반응형

'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글

# 10942 팰린드롬? 파이썬  (0) 2021.04.09
# 10211 Maximum Subarray 파이썬  (0) 2021.04.09
# 9465 스티커 파이썬  (0) 2021.03.11
# 11722 가장 긴 감소하는 부분 수열  (0) 2020.09.17
# 1965 상자넣기  (0) 2020.09.17

+ Recent posts