Baekjoon_1595_북쪽나라의도로
문제
두 도시 사이에 도로를 만드는 일은 매우 비싸다. 때문에 북쪽나라는 특정 도시를 두 번 이상 지나가지 않고서 임의의 두 도시간을 이동하는 경로가 유일하도록 도로가 설계되어 있다.
또한 북쪽나라의 모든 도시는 다른 모든 도시로 이동할 수 있다고 한다. 이때, 거리가 가장 먼 두 도시 사이의 거리를 출력하는 것이 당신의 임무이다.
북쪽나라에는 최대 10,000개의 도시가 있을 수 있고, 도시는 1 부터 숫자로 이름이 매겨져 있다.
입력
입력은 여러줄에 걸쳐 주어진다. 입력의 각 줄은 세 개의 양의 정수로 구성되어있는데, 각각은 차례대로 서로 다른 두 도시의 번호와 두 도시를 연결하는 도로의 길이를 의미한다. 모든 도로는 양방향으로 통행이 가능하다.
출력
가장 거리가 먼 두 도시간의 거리를 나타내는 정수 하나를 출력하면 된다.
해결방법
1. 입력이 있을 때까지만 받기
# 입력이 있을 때 까지만 받기
inputV = []
while True:
try:
u, v, l = map(int, input().split())
inputV.append((u, v, l))
except:
break
코드
from collections import deque
def bfs(v):
global maxV
dq = deque()
# 방문 처리, append((현재노드, 현재까지의 거리))
dq.append((v, 0))
visited[v] = 1
while dq:
node, dist = dq.popleft()
# 최댓값 갱신해주기
if dist > maxV :
maxV = dist
for next_node, next_dist in CITY[node]:
# 이미 방문한 노드이면 continue
if visited[next_node]:
continue
# 아니면 방문
else:
visited[next_node] = 1
# 현재까지의 거리 + 다음 노드까지의 거리로 누적
dq.append((next_node, dist+next_dist))
return
# 입력이 있을 때 까지만 받기
inputV = []
while True:
try:
u, v, l = map(int, input().split())
inputV.append((u, v, l))
except:
break
# 노드의 수 = 간선의 수 + 1
N = len(inputV) + 1
# 인접 리스트 CITY 선언
CITY = [[] for _ in range(10001)]
for a, b, c in inputV:
CITY[a].append((b, c))
CITY[b].append((a, c))
maxV = 0
# 모든 노드로부터 탐색 하기
for s in range(1, N+1):
visited = [0] * (N+1)
bfs(s)
print(maxV)
Baekjoon_17070_파이프옮기기
문제
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다.
오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다.
파이프는 회전시킬 수 있으며, 아래와 같이 3가지 방향이 가능하다.
파이프는 매우 무겁기 때문에, 유현이는 파이프를 밀어서 이동시키려고 한다. 벽에는 새로운 벽지를 발랐기 때문에, 파이프가 벽을 긁으면 안 된다. 즉, 파이프는 항상 빈 칸만 차지해야 한다.
파이프를 밀 수 있는 방향은 총 3가지가 있으며, →, ↘, ↓ 방향이다. 파이프는 밀면서 회전시킬 수 있다. 회전은 45도만 회전시킬 수 있으며, 미는 방향은 오른쪽, 아래, 또는 오른쪽 아래 대각선 방향이어야 한다.
파이프가 가로로 놓여진 경우에 가능한 이동 방법은 총 2가지, 세로로 놓여진 경우에는 2가지, 대각선 방향으로 놓여진 경우에는 3가지가 있다.
아래 그림은 파이프가 놓여진 방향에 따라서 이동할 수 있는 방법을 모두 나타낸 것이고, 꼭 빈 칸이어야 하는 곳은 색으로 표시되어져 있다.
가장 처음에 파이프는 (1, 1)와 (1, 2)를 차지하고 있고, 방향은 가로이다. 파이프의 한쪽 끝을 (N, N)로 이동시키는 방법의 개수를 구해보자.
입력
첫째 줄에 집의 크기 N(3 ≤ N ≤ 16)이 주어진다. 둘째 줄부터 N개의 줄에는 집의 상태가 주어진다. 빈 칸은 0, 벽은 1로 주어진다. (1, 1)과 (1, 2)는 항상 빈 칸이다.
출력
첫째 줄에 파이프의 한쪽 끝을 (N, N)으로 이동시키는 방법의 수를 출력한다. 이동시킬 수 없는 경우에는 0을 출력한다. 방법의 수는 항상 1,000,000보다 작거나 같다.
해결방법
- 대각선 파이프일 때 세가지 파이프 다 놓을 수 있는거 몰랐음,, 문제 꼼꼼히 읽자 ㅎ
- status 확인할 때 in 쓰니까 시간초과 얌전히 status == 0 or status == 1 이르케 바꿔주기,,
- 다른 코드 찾아보니까 bfs도 시간초과인 것 같드라,,
코드
import sys
input = sys.stdin.readline
def dfs(i, j, status):
global cnt
if i == N - 1 and j == N - 1:
cnt += 1
return
# 가로 방향 또는 대각선 방향일 때 가로 방향 파이프 놓기
if status == 0 or status == 2:
if j + 1 < N and arr[i][j + 1] == 0:
dfs(i, j + 1, 0)
# 세로 방향 또는 대각선 방향일 때 세로 방향 파이프 놓기
if status == 1 or status == 2:
if i + 1 < N and arr[i + 1][j] == 0:
dfs(i + 1, j, 1)
# 모든 방향에서 대각선 방향 파이프를 놓을 수 있음
if i + 1 < N and j + 1 < N:
if arr[i + 1][j] == 0 and arr[i][j + 1] == 0 and arr[i + 1][j + 1] == 0:
dfs(i + 1, j + 1, 2)
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
cnt = 0
dfs(0, 1, 0)
print(cnt)
회식 끝나고 기언치 자전거 타고 집 가기-
혼자서 정말 많이 뒤적였던 대화가 있었던 길. 덕분에 쓸쓸하지 않았음!
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon_14500_테트로미노 (0) | 2022.10.21 |
---|---|
Baekjoon_16235_나무재테크 (0) | 2022.10.18 |
Baekjoon_16234_인구이동 (0) | 2022.10.08 |
Baekjoon_2583_영역구하기, Baekjoon_2667_단지번호붙이기 (0) | 2022.09.15 |
Baekjoon_2468_안전영역 (0) | 2022.09.15 |
댓글