๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 2468_์•ˆ์ „ ์˜์—ญ

๋ฟŒ์•ผ._. 2022. 4. 1. 15:30

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: 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์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด์—ˆ๋‹ค.