Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 최소 신장 트리
- 투포인터
- 구현
- 2021 KAKAO BLIND RECRUITMENT
- BFS
- 백트래킹
- 다익스트라
- 이분탐색
- 플로이드 와샬
- 우선순위큐
- 2018 KAKAO BLIND RECRUITMENT
- 플로이드와샬
- 파이썬
- GIT
- 크루스칼
- 로봇 청소기
- Spring
- 프로그래머스
- SWEA
- 2019 KAKAO BLIND RECRUITMENT
- 스택
- 브루트포스
- 시뮬레이션
- 백준
- 투 포인터
- 2020 카카오 인턴십
- 2020 KAKAO BLIND RECRUITMENT
- 비트마스킹
- 트라이
- 조합
Archives
- Today
- Total
개발조아
[BOJ/백준] 2026 소풍 파이썬 본문
728x90
문제 링크 : https://www.acmicpc.net/problem/2026
2026번: 소풍
만약 K명의 친구 관계인 학생들이 존재하지 않는다면 -1을 출력한다. 그 외의 경우에는, K개의 줄에 학생들의 번호를 증가하는 순서로 한 줄에 한 개씩 출력한다. 여러 경우가 존재한다면 첫 번째
www.acmicpc.net
처음에 문제 조건을 잘못이해해서 틀렸었다.
나는 a-b, b-c라면 a-c도 친구라고 이해하고 풀었더니 63%였나 그쯤에서 틀렸다고 나왔다.
그래서 예제를 찾아보고 돌려보니 a-b, b-c라면 a-c라는 관계도 있어야한다.
즉 모든 친구가 서로서로 모두 친구사이어야한다. 건너서 친구면 친구가 아닌 것이다.
우선 나는 BFS로 풀었다.
사용하는 자료구조는 우선순위큐와 인접행렬, 인접리스트를 사용 사용했다.
인접행렬은 두 학생이 친구관계인지 체크하기 위함이고, 인접 리스트는 친구 목록이 필요하기 때문이다.
우선순위큐는 친구의 번호를 작은것 부터 접근해야하기 때문이다.
자신의 친구들을 접근할때도 번호 순서대로 접근해야하므로 인접리스트도 정렬해서 저장해놨다.
이제 BFS 돌면서 본인의 친구들을 체크한다. 방문하지 않았고, 현재 이전에 방문한 친구들과 현재 방문하려는 친구와도 친구관계인지 체크한 후 큐에 넣어주고 방문한 친구 배열에 번호를 넣어준다.
BFS 돌다가 친구의 수가 k개라면 종료 출력하면 된다.
from sys import stdin
from heapq import heappush,heappop
input = stdin.readline
k,n,f = map(int, input().split())
adj_list = [[] for _ in range(n+1)]
adj_mat = [[False]*(n+1) for _ in range(n+1)]
for _ in range(f):
a,b = map(int, input().split())
adj_list[a].append(b)
adj_list[b].append(a)
adj_mat[a][b] = adj_mat[b][a] = True
for idx in range(1,n+1):
adj_list[idx].sort()
end = -1
def solv():
for start in range(1,n+1):
rst = bfs(start)
if rst:
rst.sort()
for num in rst:
print(num)
return
print(-1)
def bfs(start):
visited = [False]*(n+1)
path = [start]
pq = [start]
visited[start] = True
while pq:
now = heappop(pq)
for nxt in adj_list[now]:
if not visited[nxt]:
visited[nxt] = True
flag = False
for target in path:
if not adj_mat[nxt][target]:
flag = True
break
if not flag:
path.append(nxt)
if len(path) == k:
return path
heappush(pq,nxt)
return None
if k == 1:
print(1)
else:
solv()
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 14496 그대, 그머가 되어 파이썬 (0) | 2021.10.04 |
---|---|
[BOJ/백준] 5214 환승 파이썬 (0) | 2021.10.04 |
[BOJ/백준] 9202 Boggle 파이썬 (0) | 2021.09.29 |
[BOJ/백준] 7682 틱택토 (0) | 2021.09.27 |
[BOJ/백준] 19942 다이어트 파이썬 (0) | 2021.09.26 |
Comments