728x90
해당 문제를 잘못 이해한 부분이 있었다. 인접 정점을 오름차순, 내림차순으로 방문한다고 해서 특정 차수 기준 오름차순 방문인 줄 알고 PriorityQueue를 썼다가 여러번 시도 끝에 그냥 queue로 돌렸더니 pass가 됐다.
<문제 접근/풀이과정>
1. 시간 제한 : 1초 => 약 1억 번 연산 가능
2. 메모리 제한 : 512MB => 정수(4바이트) 기준 256 x 1024 x 512 개 생성 가능 = 2^8 x 2^10 x 2^9 = 2^27
3. N개 정점, M개 간선 & 무향 그래프 정점의 수 N (5 ≤ N ≤ 100,000), 간선의 수 M (1 ≤ M ≤ 200,000), 시작 정점 R (1 ≤ R ≤N) -> 2차원 배열로는 100,000 x 100,000이므로 인접리스트, 리스트로 풀어야 함
4. 1 ~ n / 간선 가중치 1
5. 정점 R에서 시작(인접정점 오름차, 내림차순 방문)
6. 노드 방문 순서 출력
<24444번 알고리즘 수업 - 너비 우선 탐색 1 소스코드>
package boj;
import java.io.*;
import java.util.*;
public class Boj_24444 {
public static void main(String[] args) throws Exception {
// 시간 제한 : 1초 => 약 1억 번 연산 가능
// 메모리 제한 : 512MB => 정수(4바이트) 기준 256 x 1024 x 512 개 생성 가능 = 2^8 x 2^10 x 2^9 = 2^27
// N개 정점, M개 간선 & 무향 그래프
// 1 ~ n / 간선 가중치 1
// 정점 R에서 시작
// 노드 방문 순서 출력(오름차순)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stz = new StringTokenizer(br.readLine());
// N, M, R 순서로 입력
int N = Integer.parseInt(stz.nextToken());
int M = Integer.parseInt(stz.nextToken());
int R = Integer.parseInt(stz.nextToken());
List[] arr = new ArrayList[N+1];
// 배열 초기화
for(int i = 0; i <= N; i++) {
arr[i] = new ArrayList<>();
}
// 그래프 입력 받기
for(int i = 0; i < M; i++) {
stz = new StringTokenizer(br.readLine());
int from = Integer.parseInt(stz.nextToken());
int to = Integer.parseInt(stz.nextToken());
arr[from].add(to);
arr[to].add(from);
}
//오름차순 정렬
for (int i = 1; i <= N; i++) {
Collections.sort(arr[i]);
}
// 시작점 부터 Queue에 넣고 bfs시작
boolean visited[] = new boolean[N+1];
int answer[] = new int[N+1];
int index = 1;
answer[R] = index++;
visited[R] = true;
Queue<Integer> q = new LinkedList<>();
PriorityQueue<Integer> pq = new PriorityQueue<>();
q.add(R);
while(!q.isEmpty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
int temp = q.poll();
List<Integer> tempArr = arr[temp];
for (int j = 0; j < arr[temp].size(); j++) {
int node = tempArr.get(j);
// 기방문 노드
if(visited[node]) continue;
answer[node] = index++;
q.add(node);
visited[node] = true;
}
}
// while(!pq.isEmpty()) {
// q.add(pq.poll());
// }
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= N; i++) {
sb.append(answer[i]).append("\n");
}
sb.setLength(sb.length()-1);
System.out.println(sb.toString());
}
}
<24445번 알고리즘 수업 - 너비 우선 탐색 2 소스코드>
package boj;
import java.io.*;
import java.util.*;
public class Boj_24445 {
public static void main(String[] args) throws Exception {
// 시간 제한 : 1초 => 약 1억 번 연산 가능
// 메모리 제한 : 512MB => 정수(4바이트) 기준 256 x 1024 x 512 개 생성 가능 = 2^8 x 2^10 x 2^9 = 2^27
// N개 정점, M개 간선 & 무향 그래프
// 1 ~ n / 간선 가중치 1
// 정점 R에서 시작
// 노드 방문 순서 출력(오름차순)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stz = new StringTokenizer(br.readLine());
// N, M, R 순서로 입력
int N = Integer.parseInt(stz.nextToken());
int M = Integer.parseInt(stz.nextToken());
int R = Integer.parseInt(stz.nextToken());
List[] arr = new ArrayList[N+1];
// 배열 초기화
for(int i = 0; i <= N; i++) {
arr[i] = new ArrayList<>();
}
// 그래프 입력 받기
for(int i = 0; i < M; i++) {
stz = new StringTokenizer(br.readLine());
int from = Integer.parseInt(stz.nextToken());
int to = Integer.parseInt(stz.nextToken());
arr[from].add(to);
arr[to].add(from);
}
//오름차순 정렬
for (int i = 1; i <= N; i++) {
Collections.sort(arr[i]);
}
// 시작점 부터 Queue에 넣고 bfs시작
boolean visited[] = new boolean[N+1];
int answer[] = new int[N+1];
int index = 1;
answer[R] = index++;
visited[R] = true;
Queue<Integer> q = new LinkedList<>();
PriorityQueue<Integer> pq = new PriorityQueue<>();
q.add(R);
while(!q.isEmpty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
int temp = q.poll();
List<Integer> tempArr = arr[temp];
for (int j = arr[temp].size()-1; j >= 0; j--) {
int node = tempArr.get(j);
// 기방문 노드
if(visited[node]) continue;
answer[node] = index++;
q.add(node);
visited[node] = true;
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= N; i++) {
sb.append(answer[i]).append("\n");
}
sb.setLength(sb.length()-1);
System.out.println(sb.toString());
}
}
728x90
'알고리즘공부(Algorithm Study) > 문제풀이(ProblemSolving)' 카테고리의 다른 글
백준 1637 java - 날카로운 눈(이진탐색, 누적합, 정수론/feat.생애첫플레 1솔) (0) | 2022.05.29 |
---|---|
백준 12015 java - 가장 긴 증가하는 부분 수열 2(이진 탐색/2가지 풀이) (0) | 2022.05.29 |
백준 24479 & 24480 알고리즘 수업 - 깊이 우선 탐색 1&2(DFS) (0) | 2022.05.24 |
백준 1520 java - 내리막길(DP, 동적계획법) (0) | 2022.05.23 |
백준 11049 java - 행렬 곱셈 순서(DP/동적계획법) (0) | 2022.05.22 |
댓글