김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Remote저장소
  • local저장소
  • KMU_WINK
  • 깃허브데스크탑
  • GitHubDesktop
  • 로컬저장소
  • ㄱ
  • 원격저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[백준2583&파이썬] 좌표평면을 배열로 표현하는 방법
•알고리즘(Algorithm )/문제풀이

[백준2583&파이썬] 좌표평면을 배열로 표현하는 방법

2023. 4. 6. 13:50

# 문제

백준2583 영역구하기 파이썬 풀이

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

# 코드

import sys
from collections import deque


M,N,K = map(int, sys.stdin.readline().split())
# M 행 , N 열

board = [ [False] * N for i in range(M)]

def printBoard() :
  for i in range(M) :
    print(board[i])

dirs = [
  (-1,0),(0,1),(1,0),(0,-1)
  ]

for _ in range(K) :
  x1,y1,x2,y2 = map(int, sys.stdin.readline().split())
  # 0 2 4 4
  for i in range(y1, y2):
    for j in range(x1, x2):
      board[i][j] = True

# printBoard()

cnt = 0
sizes = list()

for row in range(M) :
  for col in range(N) :
    size = 1
    if board[row][col] == False :
      cnt +=1
      # bfs로 세는거 시작해야함
      dq = deque()
      dq.append( (row,col))
      board[row][col] = True # 방문처리
      while len(dq) != 0 :
        cur = dq.popleft()

        for dir in dirs :
          next = ( cur[0] + dir[0], cur[1] + dir[1])

          # 범위 안에 드는지 확인
          if 0<= next[0] < M and 0<= next[1] < N :
            # 방문했는지 확인하기
            if board[next[0]][next[1]] == False :
              # 방문 및 넓이 카운트 하기
              board[next[0]][next[1]] = True
              size +=1
              dq.append(next)
      sizes.append(size)

print(cnt)
sizes.sort()
for _ in range(len(sizes)) :
  print(sizes[_],end=" ")

 

# 풀이

## 탐색 시작지점과 방문표시의 갯수 세기

BFS를 이용하여 푸는 전형적인 방법이다. BFS를 통한 풀이를 해봤다면 별다른 고민을 하지는 않아도 될 것 같다.

 

## 좌표평면을 배열로 나타내기

출처 : https://www.acmicpc.net/problem/2583

  • 배열로 나타내는 row와 col은 시작지점이 왼쪽 위부터이다. 그러나 문제에서는 좌표평면이 주어졌고 시작지점이 왼쪽 아래서부터이다.
  • 좌표는 0 2 4 4 와 같은 형태로 주어지고, 시작지점 (0,2) 마지막지점 (4,4)의 형태가 되고 이를 통해서 사각형을 칠할 수 있다.
  • 나는 이 좌표평면의 시작점이 다르기 때문에 이를 맞추기 위해서 보정작업을 하려고 했다.
  • 그러나 정확한 모양을 그리는게 아니라면 아래와 같이 반전된 모양으로 그대로 그릴 수 있다.
[False, False, False, False, True, True, False]
[False, True, False, False, True, True, False]
[True, True, True, True, False, False, False]
[True, True, True, True, False, False, False]
[False, True, False, False, False, False, False]
  • 아래와 같이 코드를 작성하자
for _ in range(K) :
  x1,y1,x2,y2 = map(int, sys.stdin.readline().split())
  for i in range(y1, y2):
    for j in range(x1, x2):
      board[i][j] = True

 

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준2468&파이썬] BFS를 사용할때 탐색 단위에 대한 생각이 필요하다.  (0) 2023.04.08
[백준5014&파이썬] BFS은 1차원에서도 최단거리를 구할 수 있다.  (0) 2023.04.08
[백준7562&파이썬] BFS를 활용하여 최단거리에 도달하는 방법  (0) 2023.04.05
[백준4179&파이썬] 불!/BFS를 이용해 조건에 맞는 최단거리를 구하는 방법  (0) 2023.04.04
[백준1926&파이썬] BFS를 활용하여, 연결된 노드의 너비를 세는 방법  (0) 2023.04.04
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준2468&파이썬] BFS를 사용할때 탐색 단위에 대한 생각이 필요하다.
    • [백준5014&파이썬] BFS은 1차원에서도 최단거리를 구할 수 있다.
    • [백준7562&파이썬] BFS를 활용하여 최단거리에 도달하는 방법
    • [백준4179&파이썬] 불!/BFS를 이용해 조건에 맞는 최단거리를 구하는 방법
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바