• graph값이 1일 때 BFS 시작
    • 방문 여부를 체크하기 위해 방문한 곳의 값은 0으로 초기화
    • 그림 크기를 재기 위해 count 선언
    • BFS 탐색 끝나면 count값을 return해줌
  • return 받은 count값을 paint리스트에 저장
  • paint 값 중 가장 큰 값을 출력

 

from collections import deque
 
n, m = map(int, input().split())
graph = []
 
for i in range(n):
    graph.append(list(map(int, input().split())))
 
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
 
def bfs(a, b):
    queue = deque()
    queue.append((a, b))
    graph[a][b] = 0
    count = 1
 
    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if nx < 0 or nx >= n or ny < 0 or ny >= m:
                continue

            if graph[nx][ny] == 1:
                graph[nx][ny] = 0
                queue.append((nx, ny))
                count += 1

    return count
 
paint = []
for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:
            paint.append(bfs(i, j))
 
# 이렇게 안 하면 런타임 에러 발생
if len(paint) == 0:
    print(len(paint))
    print(0)
else:
    print(len(paint))
    print(max(paint))

'◦ Algorithm > Python' 카테고리의 다른 글

백준 파이썬 4170 불 BFS  (0) 2023.03.26
11번가 괄호문제 dict update, replace  (0) 2023.03.26
백준 파이썬 7576 토마토 BFS  (0) 2023.03.25
pop, remove, del, clear 차이  (0) 2023.03.25
백준 뒤집기 1439 그리디  (0) 2023.03.23

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

  • graph에서 값이 1인 곳의 좌표를 queue에 삽입
    • 1인 곳이 여러 개일 때 동시에 돌리는 듯한 효과를 줄 수 있음
  • BFS가 끝나면(여기서는 while문) 마지막 x,y 좌표에 해당하는 값 출력
    • 이때 x, y를 전역변수로 사용해주기 위해 위에 먼저 선언해줘야함을 주의!
  • 만약 graph에 여전히 0이 존재하면 -1을 출력하고 그렇지 않으면 앞에서 구한 마지막 x,y 좌표에 있는 값 출력
from collections import deque

M, N = map(int, input().split())
graph = []
x = y = -1

for _ in range(N):
    graph.append(list(map(int, input().split())))

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

queue = deque()
for i in range(N):
    for j in range(M):
        if(graph[i][j] == 1):
            queue.append((i,j))

while(queue):
    x, y = queue.popleft()
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        if nx < 0 or ny < 0 or nx >= N or ny >= M:
            continue

        if graph[nx][ny] == 0:
            queue.append((nx, ny))
            graph[nx][ny] = graph[x][y] + 1

answer = graph[x][y]-1

for i in range(N):
    for j in range(M):
        if(graph[i][j] == 0):
            answer = -1

print(answer)

1. pop

  • index를 입력받아 리스트에서 해당 index 삭제
  • 해당 index에 있는 값을 return해줌
    • del과의 차이
    • del은 return값이 없음
  • 입력받은 인자에 해당하는 index가 존재하지 않는 경우 IndexError 발생
lst = [10,20,30,40,50]
lst.pop(3)
print(lst)

 

2. remove

  • 값을 입력받아 리스트에 값이 존재할 경우 해당 값 삭제
    • pop은 index를, remove는 값을 인자로 받는다
  • 값이 존재하지 않는 경우 ValueError 발생
lst = [10,20,30,40,50]
lst.remove(30)
print(lst)

 

3. del

  • index를 입력받아 리스트에서 해당 index 삭제
  • pop과 달리 인덱싱이 가능하다
  • pop고 달리 return값이 없고 삭제 기능만 수행한다
lst = [10,20,30,40,50]
del lst[0:2]
print(lst)

 

4. clear

  • 리스트의 모든 요소 삭제
  • 리스트 방 자체는 남아있음
lst = [10,20,30,40,50]
lst.clear()
print(lst)

 

 

https://www.acmicpc.net/problem/1439

 

1439번: 뒤집기

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모

www.acmicpc.net

 

  • 각각 0 또는 1로 이루어진 뭉치의 개수를 센 다음 뭉치가 적은 개수 출력

 

s = input()

count = {'0' : 0, '1' : 0}
num = s[0]
count[num] += 1

for i in range(1,len(s)):
    if(s[i] != num):
       	num = s[i]
        count[num] += 1

print(min(count.values()))
  • 0이나 1이 나오면 더하고 아닐 경우 곱한다
  • answer가 0이나 1일 경우도 마찬가지

 

s = input()

answer = 0
for i in s:
    if(int(i) <= 1 or answer <= 1):
        answer += int(i)
    else:
        answer *= int(i)

print(answer)
  • counter로 각 그룹에 속한 원소 개수 세어준 다음 그룹명으로 오름차순 정렬
  • rest = 0으로 초기화 : 그룹화하고 남은 사람 수 저장할 공간
  • count에 담긴 값들을 하나씩 pop하면서 그룹명보다 '원소 개수+rest'가 크면 '(원소 수 + rest)/그룹 명'한 몫을 answer(=구성된 그룹)에 더해주고 남은 사람은 rest에 저장
  • 반대의 경우 rest에 원소 개수 저장
  • count를 모두 순회할 때까지 반복

 

from collections import Counter

N = int(input())
A = list(map(int, input().split()))
count = Counter(A)
count = sorted(count.items(), key=lambda x : x[0])

answer = 0
rest = 0
while(count):
    (n, i) = count.pop(0)
    if(n <= i+rest):
        answer += (i+rest) // n
        rest = (i+rest) % n
    else:
        rest += i

print(answer)

 

 

이코테 해설

  • 공포도가 낮은 것부터 하나씩 확인하며 현재 그룹에 해당 모험가를 포함시키기
  • 현재 그룹에 포함된 모험가 수가 현재의 공포도 이상이면 그룹 결성
    • 총 그룹 수 증가시키기
    • 현재 그룹에 포함된 모험가 수 초기화
N = int(input())
A = list(map(int, input().split()))
A.sort()

answer = 0
count = 0
for i in A:
    count += 1
    if count >= i:
        answer += 1
        count = 0

print(answer)
  • N이 1보다 클 때 K로 나누어 떨어지면 K로 나누고 그렇지 않으면 1씩 빼준다

 

N, K = map(int, input().split())

answer = 0
while N > 1:
    if(N%K == 0):
        N /= K
        answer += 1
    else:
        N -= 1
        answer += 1

print(answer)
  • 각 행의 가장 작은 값 중 가장 큰 값 찾기
  • result = 0으로 놓고 min_val과 그때그때 max로 비교해주면 내 코드처럼 새로운 list를 만들 필요없음

 

N, M = map(int, input().split())

result = 0
for i in range(N):
    data = list(map(int, input().split()))
    min_val = min(data)
    result = max(result, min_val)
    
print(result)

'''
A = []
for _ in range(N):
    A.append(list(map(int, input().split())))

a = []
for i in range(N):
    a.append(min(A[i]))

result = max(a)
print(result)
'''

 

 

+ Recent posts