1. λ¬Έμ μ€λͺ π
λ¬Έμ μμλ λ€μ 3κ°μ§ λ¨λ°©ν₯ κ·Έλνλ₯Ό μ μνκ³ μλ€.
λλνμ μνν κ·Έλνμ΄κ³ , κ°μ μ κ°μμ μ μ μ κ°μκ° κ°λ€.
λ§λνμ λΉμνν κ·Έλνμ΄κ³ , μ μ μ κ°μ
- κ°μ μ κ°μ
= 1 μ΄λ€.
νμνμ μνν κ·Έλνμ΄κ³ , κ°μ μ κ°μ
- μ μ μ κ°μ
= 1 μ΄λ€.
μ΄λ¬ν 3κ°μ§ μ νμ ν΄λΉνλ κ·Έλνκ° μ΅μ 2κ° μ΄μ μ£Όμ΄μ§λ€. μ΄λ μ£Όμ΄μ§ λͺ¨λ κ·Έλνλ₯Ό μλ μ μ μ νλ κ·Έλ¦°λ€. μ°λ¦¬λ μ΄λ² λ¬Έμ νμ΄μμ ν΄λΉ μ μ μ λΏλ¦¬ μ μ
μ΄λΌ λΆλ₯΄κ² λ€. (λ¬Έμ μμ λ§λ
ν ν΄λΉ μ μ μ μ§μΉνλ μ©μ΄κ° μμ΄μ μμλ‘ λͺ
λͺ
νκ² λ€.) λΏλ¦¬ μ μ μ λΆμ°©ν μμλ λ€μκ³Ό κ°λ€.
μ΄λ λΏλ¦¬μ μ μ λ²νΈ
, λλν κ·Έλνμ μ
, λ§λ κ·Έλνμ μ
, νμν κ·Έλνμ μ
λ₯Ό μμλλ‘ κΈ°λ‘ν 1μ°¨μ λ°°μ΄μ μΆλ ₯νλ©΄ λλ€.
2. μ κ·Ό λ°©μ ποΈ
KEY WORD
: Simulation
νμλ ν΄λΉ λ¬Έμ λ₯Ό 2μκ° λκ² κ³ λ―Όνλ€κ° κ²°κ΅ λ΅μ§λ₯Ό λ΄€λ€. λ΅μ§ 첫 λ¬Έμ₯μ μ½μ, μμ΄λμ΄κ° μ΄ν΄κ° κ°λ€. λλ λ¨μν κ·ΈλνλΌκ³ ν΄μ BFS, DFS λ± κ·Έλν μκ³ λ¦¬μ¦μ νμ©ν΄μ λ¬Έμ λ₯Ό νμ΄μΌνλ€λ μκ°μ 맀λͺ°λμ΄ μμλ€. κ·Έλμ κ·Έλνμ νΉμ§ νμ μ μννλ κ²μ΄ λ¬Έμ λ₯Ό νμ§ λͺ»ν μ΄μ μΈ κ² κ°λ€.
μ, μ‘μ€μ κ°μ€νκ³ μ κ·Ό λ°©μμ λ€μκ³Ό κ°λ€.
λΏλ¦¬ μ μ
μ΄ μ°κ²°λ¨μΌλ‘ μΈν΄, κ·Έλν κ³ μ μ νΉμ§μ΄ μ¬λΌμ Έλ²λ¦ΌμΌλ‘, λΏλ¦¬ μ μ μ μλ³ν΄ μ κ±°νλ€.- μ΄μ λͺ¨λ
μ¨μ ν λΆλ¦¬λ
κ° κ·Έλνλ₯Ό νμΈνλ©° μ΄λ€ κ·Έλν μ νμΈμ§ νμΈνκ³ κ°μλ₯Ό μΌλ€.
(1) λΏλ¦¬ μ μ μ μ΄λ»κ² μλ³ν κΉ?
λΏλ¦¬ μ μ μμ²΄κ° ν κ·Έλνμ μ΄λ μ μ κ³Όλ μ°κ²°λ μ μμ΄μ, κ·Έλν κ°μ μ°κ²° κ΄κ²λ‘ μλ³νκΈ°λ λΆκ°λ₯νλ€. λ°λΌμ μ§μ
μ°¨μ
μ μ§μΆ μ°¨μ
λ₯Ό νμ©νλ€. ( μ§μ
μ°¨μ
λ λ°©ν₯ κ·Έλνμμ ν΄λΉ μ μ μΌλ‘ λ€μ΄μ€λ κ°μ μ κ°μλ₯Ό μλ―Ένκ³ , μ§μΆ μ°¨μ
λ ν΄λΉ μ μ μμ λκ°λ κ°μ μ κ°μμ΄λ€. )
μμΈν 보면, λΏλ¦¬ μ μ
μ λ¬Έμ μμ μ£Όμ΄μ§ κ·Έλνμ κ°μλ§νΌμ μ§μΆ μ°¨μλ₯Ό κ°μ§κ³ μκ³ , μ§μ
μ°¨μλ μλ€! λΉμ°νκ²λ λͺ¨λ κ·Έλνλ₯Ό λΆμ‘μμ μ°κ²°νκ³ μκΈ°μ, μ§μ
μ°¨μκ° μμ νμκ° μλ€.
λ°λΌμ λΏλ¦¬ μ μ μ μ§μ
μ°¨μκ° μκ³ , μ§μΆ μ°¨μκ° 2κ° μ΄μ
μΈ μ μ μ΄λ€.
μ? μΌλ° μ μ κ³Ό ν΄λΉ νΉμ§μ μ κ²ΉμΉλμ? π€π
μ κ²ΉμΉλ€. μν κ·Έλνλ λΉμ°ν μ§μΆμ°¨μκ° μμΌλ©΄ μ§μ
μ°¨μκ° νμνλ€ λ°λΌμ λλνκ³Ό νμν λ΄λΆ μ μ λ€μ λΏλ¦¬μ μ κ³Ό νΉμ§μ΄ μ κ²ΉμΉλ€. λ§λ κ·Έλνλ 2κ°μ§λ₯Ό μ μν΄μ λ΄μΌνλλ°, μ²«μ§Έλ‘ λ§λ κ·Έλνμ μμλΆλΆμ΄λ€. λΆλͺ
μ§μ
μ°¨μλ μμ§λ§, μ§μΆ μ°¨μκ° 1κ°λ‘ κ³ μ μ΄λ€. λ°λΌμ νΉμ§μ΄ μ κ²ΉμΉλ€. λν 맨 λ§μ§λ§ μ μ μ μ§μ
μ°¨μκ° 1κ°λ‘ κ³ μ μ΄κ³ , μ§μΆ μ°¨μλ μλ€. λ°λΌμ λ¬Έμ λ΄μ λΏλ¦¬ μ μ
κ³Ό ν΄λΉ νΉμ§μ΄ κ²ΉμΉλ μ μ μ μ‘΄μ¬νμ§ μλλ€.
(2) κ·Έλνλ€μ μ΄λ»κ² ꡬλΆν κΉ?
λΏλ¦¬ μ μ μ λ€μ΄λμμΌλ‘, κ·Έλνλ€μ λͺ¨λ λ
립μ μΌλ‘ μ‘΄μ¬νλ€. μ¬κΈ°μ λ¬Έμ μμ μ£Όμ΄μ§ λλ‘, μ μ
κ³Ό κ°μ
μ κ΄κ³λ₯Ό νμ©ν΄λ μ’κ² μ§λ§, μ΄λ κ² νλ €λ©΄, BFSλ‘ λͺ¨λ κ·Έλνλ₯Ό μ‘°νν΄μΌ νλ€λ λ²κ±°λ‘μμ΄ μλ€. ν΄λΉ λ²κ±°λ‘μμ μ€μ΄κ³ ν¨μ¨μ μΌλ‘ λ¬Έμ λ₯Ό νκΈ° μν΄ μ΄λ²μλ μ§μ
μ°¨μ
μ μ§μΆ μ°¨μ
λ₯Ό νμ©νλ€.
λ§λν
: λ§λνμ΄ λ€λ₯Έ λ κ·Έλνμ λλΉλλ μ°¨μ΄μ μ λ§λμ λ μ μ μ΄λ€. λλ¨Έμ§ 2κ°λ μνν κ·ΈλνλΌ μ μ λ§λ€ 무쑰건 μ§μ μ°¨μμ μ§μΆ μ°¨μκ° 1κ°μ©μ μ‘΄μ¬ν΄μΌ νμ§λ§, λ§λνμ 맨 λ§μ§λ§ λΆλΆμ μ§μΆ μ°¨μκ° μ‘΄μ¬νμ§ μλλ€. λ°λΌμ μ μ μ‘°ν μ, μ§μΆ μ°¨μκ° μλ μ μ μ μλ₯Ό μΈλ©΄ κ·Έκ²μ΄ λ§λν κ·Έλνμ μμ΄λ€.νμν
: νμνμ 8μμ νλ¦¬κ° λλ λΆλΆμ΄ 무쑰건 μ§μ μ°¨μ 2κ°μ μ§μΆ μ°¨μ 2κ°λ₯Ό κ°μ§λ€. μ΄ νΉμ§μ κ°μ§ μ μ μ κ°μλ₯Ό μΈλ©΄ κ·Έκ²μ΄ νμν κ·Έλνμ μμ΄λ€.λλν
: λλνμ λͺ¨λ μ μ μ΄ λ¬΄μ‘°κ±΄ νλμ μ§μ μ°¨μμ μ§μΆ μ°¨μλ₯Ό κ°μ§λ€. κ·Όλ° μ΄ νΉμ§μ κ°μ§ μ μ μ λ§λν κ·Έλνμ λͺΈν΅κ³Ό νμν κ·Έλνμλ μμμ΄ μ‘΄μ¬νλ€. λ°λΌμ λλν κ·Έλνμ κ°μλμ 체
-λλ¨Έμ§ λ κ·Έλν κ°μμ ν©
μΌλ‘ μΌλ€.
3. μ½λ μκ° π
λ¨Όμ μ 체 μ½λλ₯Ό 보μ¬μ€ λ€, νλμ© λΆμν΄λ³΄κ² λ€.
(1) μ 체 μ½λ
import java.io.*;
import java.util.*;
class Solution {
static ArrayList<Edge> [] lists;
public int[] solution(int[][] edges) {
// 0. initialize
int [] answer = new int[4];
lists = new ArrayList [findMaxVertex(edges)+1];
for(int i = 0; i < edges.length; i++){
int start = edges[i][0];
int end = edges[i][1];
if(lists[start] == null) {lists[start] = new ArrayList<>();}
lists[start].add(new Edge(end, true));
if(lists[end] == null) {lists[end] = new ArrayList<>();}
lists[end].add(new Edge(start, false));
}
// μ°κ²° μ μ μ μ°Ύμμ μΈμ 리μ€νΈμμ μ§μ°κΈ°
for(int i = 1; i < lists.length; i++){
if(lists[i] == null) continue;
int out = 0; int in = 0;
for(int j = 0; j < lists[i].size(); j++){
Edge next = lists[i].get(j);
if(next.isAdvance) out++;
else in++;
}
if(in == 0 && out >=2) {
answer[0] = i;
break;
}
}
// μ°κ²° μ μ μ μμμ κ°μ μ§μΆν μ μ μ μμλ.
// ν΄λΉ μ μ μμμμ μ§μ
μ°¨μλ‘ λ€μ΄μ¨, μ°κ²° μ μ μ κ±°
answer[1] = lists[answer[0]].size();
for(int i = 0; i < lists[answer[0]].size(); i++){
Edge next = lists[answer[0]].get(i);
for(int j = 0; j < lists[next.dest].size(); j++){
if(lists[next.dest].get(j).dest == answer[0]) {
lists[next.dest].remove(lists[next.dest].get(j));
break;
}
}
}
lists[answer[0]].clear();
// λ§λ(μ§μ
1, μ§μΆ x) λ 8μ (μ§μ
2, μ§μΆ 2) μ°ΎκΈ°
for(int i = 1; i < lists.length; i++){
if(i == answer[0] || lists[i] == null) continue;
int in = 0; int out = 0;
for(int j = 0; j < lists[i].size(); j++){
Edge next = lists[i].get(j);
if(next.isAdvance) out++;
else in++;
}
// System.out.printf("νμ¬ μ μ λ²νΈ: %d / μ§μ
μ°¨μ: %d, μ§μΆ μ°¨μ: %d\n", i, in, out);
if( out == 0) answer[2]++;
if(in == 2 && out == 2) answer[3]++;
}
answer[1] -= (answer[2]+answer[3]);
return answer;
}
public int findMaxVertex (int [][] edges){
int ans = 0;
for(int i = 0; i < edges.length; i++){
ans = Math.max(ans, edges[i][0]);
ans = Math.max(ans, edges[i][1]);
}
return ans;
}
}
class Edge {
int dest;
boolean isAdvance;
public Edge(int dest, boolean isAdvance){
this.dest = dest;
this.isAdvance = isAdvance;
}
}
1. Class Edge
class Edge {
int dest;
boolean isAdvance;
public Edge(int dest, boolean isAdvance){
this.dest = dest;
this.isAdvance = isAdvance;
}
}
μλ μΈμ 리μ€νΈλ ν΄λΉ μ μ μμ μ§μΆ νλ κ°μ κ³Ό λμ°© μ μ λ§ νννλ©΄ λμ§λ§, λ¬Έμ λ₯Ό μν΄ λ³ννλ€. λλ μ§μ
κ°μ κ³Ό μ§μΆ κ°μ μ ꡬλΆνμ¬ μ μ₯νλ Class
λ‘μ Edgeλ₯Ό ꡬννλ€.
λ¨Όμ destλ μ μ λ²νΈμ΄λ€. isAdvance == true
λΌλ©΄ ν μ μ β destλ‘ μ§μΆνλ κ°μ μ΄λ€. isAdvance == false
λΌλ©΄, dest β ν μ μ μΌλ‘ μ§μ
νλ κ°μ μ΄λ€. λ°λΌμ μ΄κΈ°ν ν λ λ€μκ³Ό κ°μ΄ λλ€.
2. μ΄κΈ°ν
// 0. initialize
int [] answer = new int[4];
lists = new ArrayList [findMaxVertex(edges)+1];
for(int i = 0; i < edges.length; i++){
int start = edges[i][0];
int end = edges[i][1];
if(lists[start] == null) {lists[start] = new ArrayList<>();}
lists[start].add(new Edge(end, true));
if(lists[end] == null) {lists[end] = new ArrayList<>();}
lists[end].add(new Edge(start, false));
}
edgesμμλ μ§μΆκ°μ λ§ μ 곡νλ―λ‘ μ§μ κ°μ λ λ°λ‘ νννλ€.
3. λΏλ¦¬ μ μ
μ§μ°κΈ°
// μ°κ²° μ μ μ μ°Ύμμ μΈμ 리μ€νΈμμ μ§μ°κΈ°
for(int i = 1; i < lists.length; i++){
if(lists[i] == null) continue;
int out = 0; int in = 0;
for(int j = 0; j < lists[i].size(); j++){
Edge next = lists[i].get(j);
if(next.isAdvance) out++;
else in++;
}
if(in == 0 && out >=2) {
answer[0] = i;
break;
}
}
// μ°κ²° μ μ μ μμμ κ°μ μ§μΆν μ μ μ μμλ.
// ν΄λΉ μ μ μμμμ μ§μ
μ°¨μλ‘ λ€μ΄μ¨, μ°κ²° μ μ μ κ±°
answer[1] = lists[answer[0]].size();
for(int i = 0; i < lists[answer[0]].size(); i++){
Edge next = lists[answer[0]].get(i);
for(int j = 0; j < lists[next.dest].size(); j++){
if(lists[next.dest].get(j).dest == answer[0]) {
lists[next.dest].remove(lists[next.dest].get(j));
break;
}
}
}
lists[answer[0]].clear();
μ κ·Ό λ°©μμμ λ§νλλ‘, μ§μΆ μ°¨μλ 2κ° μ΄μμΈλ° μ§μ μ°¨μκ° μλ κ²½μ°μ μ μ μ λ¨Όμ μ°Ύλλ€. κ·Έ ν, μΈμ 리μ€νΈμμ ν΄λΉ μ μ μ μ§μΆ κ°μ μ λͺ¨λ μ§μ΄λ€. νμ μ λͺ¨λ μ§μ°λ €λ©΄, 2κ°μ§λ₯Ό μ κ²½μ¨μΌ νλ€.
- λΏλ¦¬ μ μ μ체 μμ κΈ°
- λΏλ¦¬ μ μ μμμ μ§μ κ°μ μ μ μ₯νκ³ μλ μΈμ 리μ€νΈ λ°°μ΄μ μμ μμμ ν΄λΉ μ μ μ§μ°κΈ°
4. κ·Έλν μ νλ³ κ°μ ꡬνκΈ°
// λ§λ(μ§μ
1, μ§μΆ x) λ 8μ (μ§μ
2, μ§μΆ 2) μ°ΎκΈ°
for(int i = 1; i < lists.length; i++){
if(i == answer[0] || lists[i] == null) continue;
int in = 0; int out = 0;
for(int j = 0; j < lists[i].size(); j++){
Edge next = lists[i].get(j);
if(next.isAdvance) out++;
else in++;
}
// System.out.printf("νμ¬ μ μ λ²νΈ: %d / μ§μ
μ°¨μ: %d, μ§μΆ μ°¨μ: %d\n", i, in, out);
if( out == 0) answer[2]++;
if(in == 2 && out == 2) answer[3]++;
}
answer[1] -= (answer[2]+answer[3]);
μ 체 κ·Έλνμ κ°μλ λΉμ°ν λΏλ¦¬ μ μ μμμ μ§μΆ μ°¨μμ κ°λ€. κ·Έλ₯Ό μ΄μ©νλ€.
4. λ°°μ΄ κ²λ€ π―
35λ² ν μ€νΈ μΌμ΄μ€κ° μκΎΈ λ°νμ μλ¬κ° λ¬λ μ΄μ π
μ°λ¦¬κ° νμ κ°κ³Όνκ³ μ§λκ°μ λͺ» λ³Έ κ²½μ°κ° λ§μ§λ§, λ³΄ν΅ κ·Έλν λ¬Έμ μμλ μ μ λ²νΈλ₯Ό 1
NκΉμ§ λΌκ³ λͺ
νν μ£Όμ΄μ€λ€. νμ§λ§ ν΄λΉ λ¬Έμ μμλ κ·Έλ¬μ§ μμλ€. λ°λΌμ μ μ λ²νΈκ° 1
NκΉμ§ μ°μλμ§ μκ³ , 1,3,5,10 λ± λ°μλ°μ μμ μ μλ€. κ·Έλ°λ°, μ΄λ₯Ό μμ νμ§ μκ³ , λ¬Έμ μμ μ£Όμ΄μ€ μ μλ μ μ λ²νΈκΉμ§ κ³μ°νλ €κ³ νλ©΄ μ μ΄λΆν° μ£Όμ΄μ§ λ°μ΄ν°κ° μμ΄ μ΄κΈ°ν νμ§ μμμΌλ―λ‘ NullPointer Exceptionμ΄ λ° μ λ°μ μλ€.