본문 바로가기
  • 살짝 구운 김 유나
Algorithm/Baekjoon

Baekjoon_1595_북쪽나라의도로

by yunae 2022. 10. 9.

Baekjoon_1595_북쪽나라의도로

 

 

1595번: 북쪽나라의 도로

입력은 여러줄에 걸쳐 주어진다. 입력의 각 줄은 세 개의 양의 정수로 구성되어있는데, 각각은 차례대로 서로 다른 두 도시의 번호와 두 도시를 연결하는 도로의 길이를 의미한다. 모든 도로는

www.acmicpc.net

 

문제

두 도시 사이에 도로를 만드는 일은 매우 비싸다. 때문에 북쪽나라는 특정 도시를 두 번 이상 지나가지 않고서 임의의 두 도시간을 이동하는 경로가 유일하도록 도로가 설계되어 있다.

또한 북쪽나라의 모든 도시는 다른 모든 도시로 이동할 수 있다고 한다. 이때, 거리가 가장 먼 두 도시 사이의 거리를 출력하는 것이 당신의 임무이다.

북쪽나라에는 최대 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_파이프옮기기

 

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

 

문제

유현이가 새 집으로 이사했다. 새 집의 크기는 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)

 

 

 

 

 

회식 끝나고 기언치 자전거 타고 집 가기-

혼자서 정말 많이 뒤적였던 대화가 있었던 길. 덕분에 쓸쓸하지 않았음!

댓글