1. 백준 2210. 숫자판 점프
https://www.acmicpc.net/problem/2210
2210번: 숫자판 점프
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.
www.acmicpc.net
문제
5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다.
숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.
입력
다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.
출력
첫째 줄에 만들 수 있는 수들의 개수를 출력한다.
import sys
input = sys.stdin.readline
def dfs(x, y, words):
if len(words) == 6:
if words not in result:
result.append(words)
return
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < 5 and 0 <= ny < 5:
dfs(nx, ny, words + graph[nx][ny])
graph = []
for _ in range(5):
graph.append(list(map(str, input().split())))
result = []
for i in range(5):
for j in range(5):
dfs(i, j, graph[i][j])
print(len(result))
- 글자 조합이 6개가 되는 순간을 찾아서 비교해야 해서인지 dfs가 적합했던 문제였다.
- dfs여도 방문처리를 하지 않아서 사실상 모든 조합과 경우의 수를 비교하는 완전탐색 문제로 이해했다.
- 5*5 크기였기에 가능한 문제이고, 문제풀이라 생각한다.
2. 백준 5567. 결혼식
https://www.acmicpc.net/problem/5567
5567번: 결혼식
예제 1의 경우 2와 3은 상근이의 친구이다. 또, 3과 4는 친구이기 때문에, 4는 상근이의 친구의 친구이다. 5와 6은 친구도 아니고, 친구의 친구도 아니다. 따라서 2, 3, 4 3명의 친구를 결혼식에 초대
www.acmicpc.net
문제
상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 친구의 친구를 초대하기로 했다. 상근이의 동기는 모두 N명이고, 이 학생들의 학번은 모두 1부터 N까지이다. 상근이의 학번은 1이다.
상근이는 동기들의 친구 관계를 모두 조사한 리스트를 가지고 있다. 이 리스트를 바탕으로 결혼식에 초대할 사람의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이의 동기의 수 n (2 ≤ n ≤ 500)이 주어진다. 둘째 줄에는 리스트의 길이 m (1 ≤ m ≤ 10000)이 주어진다. 다음 줄부터 m개 줄에는 친구 관계 ai bi가 주어진다. (1 ≤ ai < bi ≤ n) ai와 bi가 친구라는 뜻이며, bi와 ai도 친구관계이다.
출력
첫째 줄에 상근이의 결혼식에 초대하는 동기의 수를 출력한다.
import sys
input = sys.stdin.readline
n = int(input())
friends = [[] for _ in range(n+1)]
is_visited = [0] * (n+1)
T = int(input())
for _ in range(T):
a, b = map(int, input().split())
friends[a].append(b)
friends[b].append(a)
while friends[1]:
each = friends[1].pop()
is_visited[each] = 1
for e in friends[each]:
is_visited[e] = 1
cnt = 0
for i in range(2, n+1):
if is_visited[i] == 1:
cnt += 1
print(cnt)
- 친구 목록에서 그 친구의 친구까지만 그래프를 순회하면 되기 때문에 비교적 간단히 해결할 수 있던 문제였다.
- 설정을 조금 잘못해서 해결하느라 시간이 조금 더 걸렸다.
'알고리즘' 카테고리의 다른 글
[백준/Python] 2725. 보이는 점의 개수 & 15988. 1, 2, 3 더하기 3 (0) | 2023.09.06 |
---|---|
[프로그래머스/Python] 호텔 대실 & 배달 (0) | 2023.08.24 |
[백준/Python] 15990. 1, 2, 3 더하기 5 & 1965. 상자넣기 (0) | 2023.08.08 |
[백준/Python] 5397. 키로거 & 17087. 숨바꼭질 6 (0) | 2023.08.05 |
[백준/Python] 1326. 폴짝폴짝 & 21314. 민겸 수 (0) | 2023.08.03 |