morenow
morenow
morenow
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (5)
    • [MSA] Spring Cloud로 개발하는 마이.. (14)
    • Baekjoon Online Judge (40)
    • Programmers (11)
    • Spring Boot (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Feign Client
  • re-distribution
  • 백준 파이어스톰
  • jwt
  • write skew
  • copy up
  • 백준20058C++
  • JWT단점
  • successHandler
  • Id Token
  • B Tree
  • dirty write
  • 마법사 상어와 파이어스톰
  • Spring Boot
  • lost update
  • HttpExchange
  • HTTP Interface
  • Open Feign
  • B+ Tree
  • Refresh Token Refresh

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morenow
Baekjoon Online Judge

[BOJ] 1941: 영역 구하기 (Java)

Baekjoon Online Judge

[BOJ] 1941: 영역 구하기 (Java)

2023. 10. 19. 03:02

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

 

2583번: 영역 구하기

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

www.acmicpc.net

걸린 시간 : 47분 8초 (자바 미숙)


자바로 코테가 미숙해서 열심히 푸는 중...!! 자바 언어에 익숙해지고자 풀어봤다.

문제에서 입력할 때 M, N 순서로 주기도 하고 N, M 순서로 주기도 해서 주의해야 한다.

알고리즘

영역이 100 X 100 이하이므로 이 크기의 2차원 배열을 만들어 입력 받을 때 칠해진 곳을 체크한다.

그 후 DFS로 방문체크를 하며 연결요소의 수를 세면 된다. BFS도 가능하지만, 재귀가 가능한 DFS가 구현이 더 쉽다.

정답 코드

import java.io.*;
import java.util.*;
public class BOJ2583 {
static boolean[][] board = new boolean[101][101];
static boolean[][] vis = new boolean[101][101];
static int[] di = {-1, 0, 0, 1};
static int[] dj = {0, -1, 1, 0};
static int M, N, K;
static List<Integer> area = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine();
String[] tmp = s.split(" ");
M = Integer.parseInt(tmp[0]);
N = Integer.parseInt(tmp[1]);
K = Integer.parseInt(tmp[2]);
while (K-- > 0) {
s = bf.readLine();
StringTokenizer st = new StringTokenizer(s);
int j1 = Integer.parseInt(st.nextToken());
int i1 = Integer.parseInt(st.nextToken());
int j2 = Integer.parseInt(st.nextToken());
int i2 = Integer.parseInt(st.nextToken());
for (int i = i1; i < i2; i++) {
for (int j = j1; j < j2; j++) {
board[i][j] = true;
}
}
}
int answer = 0;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (!vis[i][j] && !board[i][j]) {
answer++;
area.add(dfs(i ,j));
}
}
}
System.out.println(answer);
Collections.sort(area);
for (int a : area) {
System.out.print(a + " ");
}
}
static int dfs (int ci, int cj) {
vis[ci][cj] = true;
int ret = 1;
for (int k = 0; k < 4; k++) {
int ni = ci + di[k];
int nj = cj + dj[k];
if (ni < 0 || ni >= M || nj < 0 || nj >= N || vis[ni][nj] || board[ni][nj]) continue;
ret += dfs(ni, nj);
}
return ret;
}
}

 

'Baekjoon Online Judge' 카테고리의 다른 글

[BOJ] 1744 : 수 묶기 (Java)  (1) 2023.10.26
[BOJ] 21608 : 상어 초등학교 (Java) with 정렬  (1) 2023.10.26
[BOJ] 1941: 소문난 칠공주 (Java) with 조합  (0) 2023.10.19
[BOJ] 1520 : 내리막 길 (C++) with Top Down DP  (1) 2023.10.05
[BOJ] 11404 : 플로이드 (C++) with 플로이드  (1) 2023.10.04
  • 알고리즘
  • 정답 코드
'Baekjoon Online Judge' 카테고리의 다른 글
  • [BOJ] 1744 : 수 묶기 (Java)
  • [BOJ] 21608 : 상어 초등학교 (Java) with 정렬
  • [BOJ] 1941: 소문난 칠공주 (Java) with 조합
  • [BOJ] 1520 : 내리막 길 (C++) with Top Down DP
morenow
morenow

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.