BOJ_1012 유기농 배추 - Python3

문제 접근

1. 아이디어
- BFS로 그룹 탐색
2. 복잡도
- O(V+E) : (50*50 + 4*50*50)T  >> 가능
3. 자료구조
- gragh: int[][]
- visited: bool[][]

해결 코드

from collections import deque  
import sys  
input = sys.stdin.readline

T = int(input().strip())

for \_ in range(T):  
m, n, k = map(int, input().strip().split()) # 배추밭의 가로, 세로, 배추가 심어져 있는 위치의 개수


farm = [[0]*m for _ in range(n)]
for _ in range(k):
    x, y = map(int, input().strip().split())
    farm[y][x] = 1

visited = [[False]*m for _ in range(n)]
answer = 0

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs(y,x):
    q = deque()
    q.append([y,x])

    while q:
        y, x = q.popleft()
        visited[y][x] = True
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0<= nx <m and 0<= ny <n:
                if farm[ny][nx] == 1 and visited[ny][nx] == False:
                    visited[ny][nx] = True
                    q.append([ny,nx])

for j in range(n):
    for i in range(m):
        if farm[j][i] == 1 and visited[j][i] == False:
            visited[j][i] = True
            bfs(j,i)
            answer +=1

print(answer)

'Etc > PS' 카테고리의 다른 글

BOJ_21314 민겸 수 - Python3  (0) 2022.08.01
BOJ_2667 단지번호붙이기 - Python3  (0) 2022.07.22
BOJ_1260 DFS와 BFS - Python3  (0) 2022.07.22
BOJ_2441 별 찍기 - 4 - Python3  (0) 2022.07.20
BOJ_10870 피보나치 수 5 - Python3  (0) 2022.07.20

BOJ_1260 DFS와 BFS - Python3

문제 분석

1. 아이디어
- bfs
- dfs
2. 복잡도
- O(V+E): 2000 >> 가능
- V : 1000
- E : 1000
3. 자료구조
- 그래프: int[][]
- 방문기록: bool[][]

해결 코드

from collections import deque
import sys
input = sys.stdin.readline

n,m,v = map(int, input().strip().split())

graph = [[] for _ in range(n+1)]

for _ in range(m):
    v1, v2 = map(int, input().strip().split())
    graph[v1].append(v2)
    graph[v2].append(v1)

for e in graph:
    e.sort()

visited_b =[False]*(n+1)
visited_d =[False]*(n+1)

def dfs(start):
    visited_d[start] = True
    print(start, end=' ')
    for i in graph[start]:
        if not visited_d[i]:
            dfs(i)

def bfs(start):
    q = deque([start])
    visited_b[start] = True
    while q:
        n = q.popleft()
        print(n, end=' ')
        for i in graph[n]:
            if not visited_b[i]:
                visited_b[i] = True
                q.append(i)

dfs(v)
print()
bfs(v)

'Etc > PS' 카테고리의 다른 글

BOJ_2667 단지번호붙이기 - Python3  (0) 2022.07.22
BOJ_1012 유기농 배추 - Python3  (0) 2022.07.22
BOJ_2441 별 찍기 - 4 - Python3  (0) 2022.07.20
BOJ_10870 피보나치 수 5 - Python3  (0) 2022.07.20
BOJ_10026 적록색약 - Python3  (1) 2022.07.14

BOJ_2441 별 찍기 - 4 - Python3

문제 접근

  1. 아이디어
  • .rjust(n,"") 로 우측정렬, 왼쪽 채우기
  1. 복잡도
  • O(n) loop
  1. 자료구조
  • 문자열

해결 코드

import sys
input = sys.stdin.readline

n = int(input())

for i in range(n,0,-1):
    star="*"*i
    print(star.rjust(n," "))

코멘트

  • 문자열 정렬, 공백의 수, 공백 대체 포멧팅의 경우 rjust(n,"") 혹은 ljust(n,"") 활용

'Etc > PS' 카테고리의 다른 글

BOJ_1012 유기농 배추 - Python3  (0) 2022.07.22
BOJ_1260 DFS와 BFS - Python3  (0) 2022.07.22
BOJ_10870 피보나치 수 5 - Python3  (0) 2022.07.20
BOJ_10026 적록색약 - Python3  (1) 2022.07.14
BOJ_2178 미로 탐색 - Python3  (0) 2022.07.14

BOJ_10870 피보나치 수 5 - Python3

해결 코드

1) 재귀 함수

import sys
input = sys.stdin.readline

def f(n):
    if n <=1:
        return n
    return f(n-1) + f(n-2)

n = int(input())
print(f(n))

2) for loop

import sys
input = sys.stdin.readline

n = int(input())
f = [0, 1]
for i in range(2, n+1):
    num = f[i-1] + f[i-2]
    f.append(num)
print(f[n])

'Etc > PS' 카테고리의 다른 글

BOJ_1260 DFS와 BFS - Python3  (0) 2022.07.22
BOJ_2441 별 찍기 - 4 - Python3  (0) 2022.07.20
BOJ_10026 적록색약 - Python3  (1) 2022.07.14
BOJ_2178 미로 탐색 - Python3  (0) 2022.07.14
BOJ_11279 최대 힙 - Python3  (1) 2022.07.11

10026 적록색약

문제 분석

1. 아이디어
- 인접한 픽셀의 색이 같은 경우 dfs
- 방문하지 않은 노드에 대하여 dfs 반복하여 모든 그룹 카운팅
- 적록색맹의 경우 R,G를 통일하여 같은 방식으로 그룹 탐색

2. 복잡도
- O(n*2)

3. 자료구조
- 재귀, 리스트

해결 코드

import sys
sys.setrecursionlimit(10 ** 6) # 재귀 최대 깊이 설정( 파이썬의 재귀 최대 깊이의 기본 설정이 1,000회 이기 때문에 추가 필요)
input = sys.stdin.readline

n = int(input().rstrip())
pic = [list(input().rstrip()) for _ in range(n)]
visited=[[False]*n for _ in range(n)]

dxdy = [[-1,0],[1,0],[0,-1],[0,1]]
rg_y_cnt, rg_n_cnt = 0, 0

# 색상이 같은 경우 dfs하여 그룹 방문처리
def dfs(x,y):
    # 현재 색상 좌표를 방문
    visited[x][y]= True # 방문처리
    current_color = pic[x][y]

    for dir in dxdy: # 상하좌우 방문
        nx,ny = x+dir[0],y+dir[1]
        if 0<= nx <n and 0<= ny <n:  # 범위 내에 있고
            if visited[nx][ny]==False: # 미방문인 경우
                if pic[nx][ny] == current_color: # 현재 좌표의 색상과 상하좌우 좌표 색상이 같으면 끝까지 탐색
                    dfs(nx,ny)

# 미방문인경우 dfs하여 그룹 탐색
for i in range(n):
    for j in range(n):
        if visited[i][j]==False:
            dfs(i,j)
            rg_y_cnt+=1

# 적록색맹의 경우 R,G 구분 못 하므로 G로 통일
for i in range(n):
    for j in range(n):
        if pic[i][j]=='R':
            pic[i][j]='G'

# 방문처리 초기화
visited = [[False]*n for _ in range(n)]

for i in range(n):
    for j in range(n):
        if visited[i][j]==False:
            dfs(i,j)
            rg_n_cnt+=1

print(rg_y_cnt,rg_n_cnt)

'Etc > PS' 카테고리의 다른 글

BOJ_2441 별 찍기 - 4 - Python3  (0) 2022.07.20
BOJ_10870 피보나치 수 5 - Python3  (0) 2022.07.20
BOJ_2178 미로 탐색 - Python3  (0) 2022.07.14
BOJ_11279 최대 힙 - Python3  (1) 2022.07.11
BOJ_1927 최소 힙 - Python3  (0) 2022.07.11

2178 미로 탐색

문제 분석

1.  아이디어
-   최단거리 탐색 문제
-   BFS는 현재 노드에서 가까운 곳부터 찾기 때문에 경로 탐색 시 첫번째로 찾아지는 해답이 최단거리임을 보장
-   상하좌우 모두 탐색
-   상하좌우 좌표가 미로의 범위 밖 or 0이면 탈락

2.  복잡도
-   상하좌우 BFS O(n)

3.  자료구조
-   리스트, 큐

해결코드

import sys
from collections import deque
input = sys.stdin.readline

n, m = map(int, input().split())    # n줄, 길이 m짜리 입력
maze = list(list(map(int,' '.join(input()).split())) for _ in range(n))    # ' '.join(input()) 입력된 문자열을 ' '간격을 하나의 문자열로 반환

# 이동
dx = [-1,1,0,0]
dy = [0,0,-1,1]

q = deque([(0,0)])
result = 0

while q:
    x,y=q.popleft()
    for i in range(4):    # 상하좌우 방문
        nx,ny=x+dx[i],y+dy[i]
        if 0<=nx<n and 0<=ny<m:    # 미로의 범위내에 있고
            if maze[nx][ny]==1:    # 다음이 1이라면
                #방문처리
                maze[nx][ny]=maze[x][y]+1    # 탐색하면서 미로에 이동거리 업데이트
                q.append((nx,ny))    # 방문 노드
print(maze[n-1][m-1])   # 도착 좌표 이동거리 출력

'Etc > PS' 카테고리의 다른 글

BOJ_10870 피보나치 수 5 - Python3  (0) 2022.07.20
BOJ_10026 적록색약 - Python3  (1) 2022.07.14
BOJ_11279 최대 힙 - Python3  (1) 2022.07.11
BOJ_1927 최소 힙 - Python3  (0) 2022.07.11
BOJ_1996 프린터 큐 - Python3  (0) 2022.07.08

+ Recent posts