https://www.acmicpc.net/problem/13023
13023번: ABCDE
문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.
www.acmicpc.net
'''
13023번: ABCDE / gold 5 / 백트래킹
'''
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**8)
# 백트래킹을 이용한 친구 관계 확인
def check_friend(s):
# 조건에 맞는 친구 관계 있을 시 / 종료조건
if len(visited) == 5:
print(1)
exit()
for next in relation[s]:
if next not in visited:
visited.add(next)
check_friend(next)
visited.remove(next)
# 입력받기
N, M = map(int, input().split())
relation = [[] for _ in range(N)]
for _ in range(M):
x, y = map(int, input().split())
relation[x].append(y)
relation[y].append(x)
# 0~N-1 친구까지 확인하기
start = 0
end = N - 1
while start <= end:
visited = set()
check_friend(start)
start += 1
print(0)
코드 리뷰
- 해당 문제를 풀고 정답 판정을 받을때 까지 약 35분 소요되었습니다.
(1) 처음에 틀렸던 부분은 A->B->C->D->E 친구관계 조건.
- 5번만! 친구관계가 이어지기만 하면 됨 (모든 N 친구들이 친구관계가 이어져야 된다 처음에 생각해 틀렸습니다)
(2) 중복된 친구관계를 나타내는 것을 방지 하기 위한 visited
- visited 를 통해서 이미 선택한 친구 번호는 중복 선택이 되지 않게 설정 (ex / A->B->A->...)
- 처음 visited 를 만들 시, visited = [0 for _ in range(N)] 으로 선언해 활용 했더니 메모리 초과나, 시간 초과가 발생했습니다.
- 따라서, visited를 set()로 선언하고, 선택된 친구 번호를 넣는 작업을 함으로서 문제를 해결했습니다.
'백준 문제풀이' 카테고리의 다른 글
16234번: 인구 이동 / gold 5 / 구현, 시뮬레이션 (0) | 2023.07.12 |
---|---|
17136번: 색종이 붙이기 / gold 2 / 백트래킹 (0) | 2023.06.26 |
14891번: 톱니바퀴 / gold 5 / 구현, 시뮬레이션 (0) | 2023.06.17 |
2583번: 영역 구하기 / silver 1 / DFS (0) | 2023.06.13 |
3085번: 사탕 게임 / silver 2 / 브루트포스 (0) | 2023.06.10 |