πAlgorithm/π₯Baekjoon
[Baekjoon] 2468_μμ μμ
λΏμΌ._.
2022. 4. 1. 15:30
λ¬Έμ (μΆμ²: https://www.acmicpc.net/problem/2468)
<μμ μμ>
λ¬Έμ
μ¬λλ°©μ¬μ²μμλ λ§μ λΉκ° λ΄λ¦¬λ μ₯λ§μ² μ λλΉν΄μ λ€μκ³Ό κ°μ μΌμ κ³ννκ³ μλ€. λ¨Όμ μ΄λ€ μ§μμ λμ΄ μ 보λ₯Ό νμ νλ€. κ·Έλ€μμ κ·Έ μ§μμ λ§μ λΉκ° λ΄λ Έμ λ λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ΄ μ΅λλ‘ λͺ κ°κ° λ§λ€μ΄μ§λ μ§λ₯Ό μ‘°μ¬νλ €κ³ νλ€. μ΄λ, λ¬Έμ λ₯Ό κ°λ¨νκ² νκΈ° μνμ¬, μ₯λ§μ² μ λ΄λ¦¬λ λΉμ μμ λ°λΌ μΌμ ν λμ΄ μ΄νμ λͺ¨λ μ§μ μ λ¬Όμ μ κΈ΄λ€κ³ κ°μ νλ€.
μ΄λ€ μ§μμ λμ΄ μ 보λ νκ³Ό μ΄μ ν¬κΈ°κ° κ°κ° NμΈ 2μ°¨μ λ°°μ΄ ννλ‘ μ£Όμ΄μ§λ©° λ°°μ΄μ κ° μμλ ν΄λΉ μ§μ μ λμ΄λ₯Ό νμνλ μμ°μμ΄λ€. μλ₯Ό λ€μ΄, λ€μμ N=5μΈ μ§μμ λμ΄ μ 보μ΄λ€.
μ΄μ μμ κ°μ μ§μμ λ§μ λΉκ° λ΄λ €μ λμ΄κ° 4 μ΄νμΈ λͺ¨λ μ§μ μ΄ λ¬Όμ μ κ²Όλ€κ³ νμ. μ΄ κ²½μ°μ λ¬Όμ μ κΈ°λ μ§μ μ νμμΌλ‘ νμνλ©΄ λ€μκ³Ό κ°λ€.
λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ΄λΌ ν¨μ λ¬Όμ μ κΈ°μ§ μλ μ§μ λ€μ΄ μ, μλ, μ€λ₯Έμͺ½ νΉμ μΌμͺ½μΌλ‘ μΈμ ν΄ μμΌλ©° κ·Έ ν¬κΈ°κ° μ΅λμΈ μμμ λ§νλ€. μμ κ²½μ°μμ λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ 5κ°κ° λλ€(κΌμ§μ μΌλ‘λ§ λΆμ΄ μλ λ μ§μ μ μΈμ νμ§ μλλ€κ³ μ·¨κΈνλ€).
λν μμ κ°μ μ§μμμ λμ΄κ° 6 μ΄νμΈ μ§μ μ λͺ¨λ μ κΈ°κ² λ§λλ λ§μ λΉκ° λ΄λ¦¬λ©΄ λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ μλ κ·Έλ¦Όμμμ κ°μ΄ λ€ κ°κ° λ¨μ νμΈν μ μλ€.
μ΄μ κ°μ΄ μ₯λ§μ² μ λ΄λ¦¬λ λΉμ μμ λ°λΌμ λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ κ°μλ λ€λ₯΄κ² λλ€. μμ μμ κ°μ μ§μμμ λ΄λ¦¬λ λΉμ μμ λ°λ₯Έ λͺ¨λ κ²½μ°λ₯Ό λ€ μ‘°μ¬ν΄ 보면 λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ κ°μ μ€μμ μ΅λμΈ κ²½μ°λ 5 μμ μ μ μλ€.
μ΄λ€ μ§μμ λμ΄ μ λ³΄κ° μ£Όμ΄μ‘μ λ, μ₯λ§μ² μ λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ μ΅λ κ°μλ₯Ό κ³μ°νλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μλ μ΄λ€ μ§μμ λνλ΄λ 2μ°¨μ λ°°μ΄μ νκ³Ό μ΄μ κ°μλ₯Ό λνλ΄λ μ Nμ΄ μ λ ₯λλ€. Nμ 2 μ΄μ 100 μ΄νμ μ μμ΄λ€. λμ§Έ μ€λΆν° Nκ°μ κ° μ€μλ 2μ°¨μ λ°°μ΄μ 첫 λ²μ§Έ νλΆν° Nλ²μ§Έ νκΉμ§ μμλλ‘ ν νμ© λμ΄ μ λ³΄κ° μ λ ₯λλ€. κ° μ€μλ κ° νμ 첫 λ²μ§Έ μ΄λΆν° Nλ²μ§Έ μ΄κΉμ§ Nκ°μ λμ΄ μ 보λ₯Ό λνλ΄λ μμ°μκ° λΉμΉΈμ μ¬μ΄μ λκ³ μ λ ₯λλ€. λμ΄λ 1 μ΄μ 100 μ΄νμ μ μμ΄λ€.
μΆλ ₯
첫째 μ€μ μ₯λ§μ² μ λ¬Όμ μ κΈ°μ§ μλ μμ ν μμμ μ΅λ κ°μλ₯Ό μΆλ ₯νλ€.
λ¬Έμ νμ΄
- my solution (Python)
import sys
from collections import deque
def safe(visited, a,b):
dx=[-1,1,0,0] # μνμ’μ°
dy=[0,0,-1,1]
queue=deque([[a,b]])
while queue:
temp=queue.popleft()
for i in range(4):
x=temp[0]+dx[i]
y=temp[1]+dy[i]
if x>=0 and x<len(visited) and y>=0 and y<len(visited[0]): # μ§μ λ²μ μ
if visited[x][y]==0: # μμ§ λ°©λ¬Ένμ§ μμμΌλ©΄
queue.append([x,y])
visited[x][y]=1
if __name__=='__main__':
n=int(input())
arr=[]
height=[]
for i in range(n):
temp=list(map(int, sys.stdin.readline().split()))
arr.append(temp)
height+=temp
height=set(height) # μ§μμ λμ΄
answer=1 # μ 체 μ§μμ΄ λ¬Όμ μ κΈ°μ§ μμ κ²½μ°
for i in height:
cnt = 0
visited=[[0]*n for j in range(n)]
for j in range(n):
for k in range(n):
if arr[j][k]<=i: # i λμ΄ μ΄ν μ§μ
visited[j][k]=1 # λ°©λ¬Έ o
for j in range(n):
for k in range(n):
if visited[j][k]==0: # μμ§ λ°©λ¬Ένμ§ μμμΌλ©΄
cnt+=1 # μμ ν μμ κ°μ
safe(visited, j, k)
if answer<cnt: # μμ ν μμμ μ΅λ κ°μ
answer=cnt
print(answer)
- my solution (JAVA)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
public class _2468_μμ μμ {
static void safe(int visited[][], int a, int b) {
int dx[]= {-1,1,0,0}; // μνμ’μ°
int dy[]= {0,0,-1,1};
Queue<int []> queue=new LinkedList<>();
queue.add(new int[]{a,b});
while(queue.size()!=0) {
int temp[]=queue.poll();
for(int i=0; i<4; i++) {
int x=temp[0]+dx[i];
int y=temp[1]+dy[i];
if(x>=0 && x<visited.length && y>=0 && y<visited[0].length) {
// μ§μ λ²μ μ
if(visited[x][y]==0) { // μμ§ λ°©λ¬Ένμ§ μμμΌλ©΄
queue.add(new int[] {x,y});
visited[x][y]=1; // λ°©λ¬Έ
}
}
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
int n= Integer.parseInt(bf.readLine());
int arr[][]=new int[n][n];
HashSet<Integer> set=new HashSet<>();
for(int i=0; i<n; i++) { // λμ΄ μ 보 μ μ₯
String str=bf.readLine();
for(int j=0; j<n; j++) {
int temp=Integer.parseInt(str.split(" ")[j]);
arr[i][j]=temp;
set.add(temp); // μ§μμ λμ΄
}
}
int answer=1; // μ 체 μ§μμ΄ λ¬Όμ μ κΈ°μ§ μμ κ²½μ° -> 1
for(int i:set) {
int cnt=0;
int visited[][]=new int[n][n];
for(int j=0; j<n; j++) {
for(int k=0; k<n; k++) {
if(arr[j][k]<=i) { // i λμ΄ μ΄ν μ§μ
visited[j][k]=1; // λ°©λ¬Έ o
}
}
}
for(int j=0; j<n; j++) {
for(int k=0; k<n; k++) {
if(visited[j][k]==0) { // μμ§ λ°©λ¬Ένμ§ μμμΌλ©΄
cnt+=1; // μμ ν μμ κ°μ
safe(visited,j,k);
}
}
}
if(answer<cnt) { // μμ ν μμμ μ΅λ κ°μ
answer=cnt;
}
}
System.out.println(answer);
}
}
μ£Όμ΄μ§ μ§μμ λμ΄λ€μ μ μ₯ν ν λͺ¨λ κ²½μ°μ μλ₯Ό λ°μ Έλ³Έλ€.
κ° λμ΄ μ΄νμΈ μ§μ μ λͺ¨λ μ κΈ°κ² λ λ μμ ν μμμ κ°μλ₯Ό μ°Ύλλ‘ ν΄μ€λ€.
λͺ¨λ κ²½μ°μ μλ₯Ό λ°μ Έ κ°μ₯ λ§μ μμ ν μμμ μλ₯Ό λ΅μΌλ‘ μΆλ ₯ν΄μ€λ€.
- safe
: dx, dy = μνμ’μ° νμ
: queueκ° λΉ λκΉμ§ λ°λ³΅ -> μ μΌ μ²μ κ°μ pop -> μνμ’μ° νμΈνμ¬ μ§μ λ²μ μμ΄λ©° μμ§ λ°©λ¬Ένμ§ μμλ€λ©΄ queueμ μΆκ° λ° λ°©λ¬Έ check - main
: n μ λ ₯
: arr = μ§μ λμ΄ μ 보 μ μ₯
: height = setμ νμ©νμ¬ μ€λ³΅λμ§ μκ² λμ΄ μ μ₯
: answer = μ 체 μ§μμ΄ λ¬Όμ μ κΈ°μ§ μμ κ²½μ° -> 1λ‘ μ€μ
: height => λμ΄ μ΄ν μ§μ μ λ°©λ¬Έν κ²μΌλ‘ νμ => μμ§ λ°©λ¬Ένμ§ μμμΌλ©΄ μμ ν μμ κ°μ(cnt) +1, ν¨μ νΈμΆ => answerλ³΄λ€ cnt κ°μ΄ λ ν¬λ©΄ answer= cnt
: answer μΆλ ₯
μκ°π€
λ¬Έμ μμ μ무 μ§μλ λ¬Όμ μ κΈ°μ§ μμ μλ μλ€ μ΄ λΆλΆμ λͺ λ²μ΄λ λ΄€μΌλ©΄μ λ°λ λ₯Ό μ°Ύμλ΄μ§ λͺ»νλ€.
μ λ§ λ»μ μ무 μ§μλ λ¬Όμ μ κΈ°μ§ μμμ λ μμ ν μ§μμ κ°μκ° 1μ΄ λ μ μλ€λ λ§μ΄μλ€.