• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

[๋ฐฑ์ค€] 2667

17 Mar 2021

๋ฌธ์ œ

๊ณผ๊ฑฐ์— c++๋กœ ํ’€์ดํ–ˆ์—ˆ๋˜ ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ ๋ฌธ์ œ๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ๋‹ค์‹œ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. dfs ํŒŒ์ด์ฌ ํ’€์ด๋ฒ•์„ ์†์— ์ตํžˆ๊ณ  ์žˆ๋Š” ์ค‘์ธ๋ฐ์š”. ํ™•์‹คํžˆ c++์— ๋น„ํ•ด ํ‘œํ˜„๋ ฅ์ด ์ข‹๋‹ค๋Š” ๋ง์ด ์‹ค๊ฐ์ด ๋‚ฉ๋‹ˆ๋‹ค.

C++๊ณผ์˜ ๋น„๊ต

c++์˜ ๊ฒฝ์šฐ์—๋Š” dfs๋Š” vector ๋ฐฐ์—ด๋กœ, bfs๋Š” queue์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŒํผ ํ’€์ด๋ฒ• ์ž์ฒด๋„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋‹ฌ๋ž์—ˆ๋Š”๋ฐ์š”.

python์˜ ๊ฒฝ์šฐ์—๋Š” dfs๋Š” list๋กœ, bfs๋Š” deque(list๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, pop(0)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N)์ด๊ธฐ ๋•Œ๋ฌธ์—, popleft์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ด ๋‚˜์˜ค๋Š” deque๋ฅผ ์‚ฌ์šฉ)๋กœ ํ’€๊ฒŒ ๋˜๋ฉฐ, ์ž๋ฃŒ๊ตฌ์กฐ๋งŒ ๋‹ค๋ฅผ ๋ฟ ํ’€์ด๊ฐ€ ๊ฑฐ์˜ ๊ฐ™์•„์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ ํ’€์ด ๋„์ค‘ dfs์—์„œ bfs๋กœ์˜ ์ „ํ™˜์ด ๋น ๋ฅผ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

ํ’€์ด

dfs, bfs ์ค‘ ์†์— ์ต์€ ์–ด๋–ค ๊ฒƒ์œผ๋กœ ํ‘ธ์…”๋„ ์ƒ๊ด€์—†๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ง€๋‚œ ํ’€์ด ๋•Œ์— dfs๋กœ ํ’€์—ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋น„๊ต๋ฅผ ์œ„ํ•ด dfs๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.

ํฐ ํ‹€์€ ๋ฉ”์ธ์—์„œ

  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ
  • ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ์ง‘์ด ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด
  • ๋‹จ์ง€ ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋Š˜๋ฆฌ๊ณ , ํ•ด๋‹น ๋‹จ์ง€์˜ ์ง‘ ๊ฐฏ์ˆ˜๋ฅผ 1๋กœ ํ• ๋‹นํ•ด์ค€ ํ›„, ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ dfs๋ฅผ ๋•๋‹ˆ๋‹ค.

dfs์—์„œ๋Š”, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์˜€์Œ์„ ํ‘œ์‹œํ•˜๊ณ ,
  2. ์ด๋™ ๊ฐ€๋Šฅํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ dfs๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ํ•ด๋‹น ๋‹จ์ง€์˜ ์ง‘ ๊ฐฏ์ˆ˜๋ฅผ 1 ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋™ ๊ฐ€๋Šฅ์˜ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ์ ํ•ฉํ•œ ์ขŒํ‘œ๊ฐ’์ผ ๊ฒƒ (0 ์ด์ƒ์ด๋ฉฐ, N๋ณด๋‹ค ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.)
    • ์ง‘์ด ์กด์žฌํ•  ๊ฒƒ
    • ๋ฐฉ๋ฌธํ•œ ์  ์—†์„ ๊ฒƒ

์ •๋‹ต ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •๋‹ต์ฝ”๋“œ (C++)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;

#define MAX 25

int MAP[MAX][MAX];
int DANJI[MAX*MAX];

int dir[4][2] = { {-1,0}, {1,0}, {0,-1}, {0,1}  };
int danji_cnt;
int n;
bool visited[MAX][MAX];

bool isInside(int x, int y)
{
	return (x>=0 && x<n) && (y>=0 && y<n);
}

void dfs(int x, int y, int key)
{
	DANJI[key]++;

	visited[x][y] = true;
	MAP[x][y] = key;
	
	for(int i=0;i<4;i++)
	{
		int dx = x + dir[i][0];
		int dy = y + dir[i][1];

		if(isInside(dx, dy) && (MAP[dx][dy] == 1))
		{		
			if(!visited[dx][dy]) dfs(dx, dy, key);
		}
	}
}
void Solution(int n)
{
	danji_cnt=1;
	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(MAP[i][j]==1)
			{
				if(!visited[i][j]) dfs(i, j, danji_cnt++);
			}
		}
	}
	
}

int main()
{	
	cin >> n;
	for(int i=0;i<n;i++)
	{
		DANJI[i]=0;
	
		for(int j=0;j<n;j++)
		{
			scanf("%1d",&MAP[i][j]);
		}
	}
	
	Solution(n);
	
	danji_cnt--;
	cout << danji_cnt << '\n';
	sort(DANJI, DANJI+danji_cnt+1);
	for(int i=1;i<=danji_cnt;i++)
	{
		cout << DANJI[i] << '\n';
	}
	if(DANJI[1]==0) cout << 0;
	return 0;
}

์ •๋‹ต ์ฝ”๋“œ(Python)

N = int(input())
address = []
danjiCnt = 0
danjiArr = {}
for _ in range(N) :
  address.append(list(map(int, input())))
visited = [[False]*N for _ in range(N)]
dir = [[-1,0],[1,0],[0,-1],[0,1]]

def isValidate(x,y) :
  return x >= 0 and x < N and y >= 0 and y < N

def dfs(x, y) :
  visited[y][x] = True
  for i in range(len(dir)) :
    nextX = x + dir[i][0]
    nextY = y + dir[i][1]
    if(isValidate(nextX, nextY) and address[nextY][nextX]==1 and visited[nextY][nextX]==False) :
      danjiArr[danjiCnt]+=1
      dfs(nextX, nextY)

for y in range(N) :
  for x in range(N) :
    if(visited[y][x]==False and address[y][x]==1) :
      danjiCnt+=1
      danjiArr[danjiCnt]=1
      dfs(x,y)

arr = sorted(list(n for n in danjiArr.values()))
print(len(arr))
for n in arr : print(n)

๋ฉ”๋ชจ๋ฆฌ, ์†๋„ ๋น„๊ต

image-20210317232350074

c++์ด ํ™•์‹คํžˆ ๋ฉ”๋ชจ๋ฆฌ๋„, ์‹œ๊ฐ„๋„ ํšจ์œจ์ ์ธ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ…Œ์ŠคํŠธ์—์„  ๊ฐ ์–ธ์–ด์— ๋งž๋Š” ์‹œ๊ฐ„ ์ œํ•œ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋”ฐ๋กœ ๋‘๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ ๊ตฌํ˜„๋ ฅ์ด ์ข‹๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’์€ python์„ ์•ž์œผ๋กœ๋„ ์ญ‰ ๋ฌธ์ œํ’€์ด์— ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. (ํŠนํžˆ ๋ฌธ์ž์—ด ํŒŒ์‹ฑ์ด ์••๋„์ ์œผ๋กœ ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์—โ€ฆ)

1๋…„ ์ „ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋‹ˆ ์•ˆ ์˜ˆ์œ ๋ถ€๋ถ„๋„ ๋ณด์ด๊ธด ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜ ์ด๋ฆ„์ด๋‚˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋Œ€์ฒด๋กœ ๊ฐ™์•„์„œ ๋†€๋ž์Šต๋‹ˆ๋‹ค. danji๋ฅผ 1๋…„ ์ „์—๋„ danji๋ผ๊ณ  ์ผ์—ˆ๋‹ค๋‹ˆโ€ฆ ์กฐ๊ธˆ ๋ฏผ๋งํ•˜๋„ค์š”.



problem_solvingpython Share Tweet +1