[백준] 3108 로고 java

2022. 3. 24. 14:59· Dev/PS

import java.io.*;
import java.util.*;
class Rect {
    int x1;
    int y1;
    int x2;
    int y2;
    Rect(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
}

public class Logo {
    static BufferedReader br;
    static StringTokenizer st;
    static int n;
    static int ans;
    static boolean[] checked;
    static Rect[] rectArr;
    static Queue<Integer> q;
    public static void main(String[] args) throws IOException{
        input();
        bfs();
        System.out.println(ans-1);
    }

    public static void input() throws IOException{
        br = new BufferedReader(new InputStreamReader(System.in));
        ans = 0;
        n = Integer.parseInt(br.readLine());
        rectArr = new Rect[n+1];
        checked = new boolean[n+1];
        rectArr[0] = new Rect(0, 0, 0, 0);
        for(int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            int x1 = Integer.parseInt(st.nextToken());
            int y1 = Integer.parseInt(st.nextToken());
            int x2 = Integer.parseInt(st.nextToken());
            int y2 = Integer.parseInt(st.nextToken());
            rectArr[i] = new Rect(x1, y1, x2, y2);
        }
    }

    public static void bfs() {
        q = new LinkedList<>();

        for(int i = 0; i <= n; i++) {
            if(checked[i]) continue;
            checked[i] = true;
            q.add(i);
            while(!q.isEmpty()) {
                int cur = q.poll();
                for(int j = 0; j <= n; j++) {
                    //현재와 같거나 접점이 없거나 이미 방문한 경우는 제외
                    if(cur == j || !checkConnected(cur, j) || checked[j]) continue;
                    checked[j] = true;
                    q.add(j);
                }
            }
            ans++;
        }
    }

    public static boolean checkConnected(int cur, int next) {
        Rect c = rectArr[cur];
        Rect n = rectArr[next];
        if((c.x1 < n.x1 && n.x2 < c.x2 && c.y1 < n.y1 && n.y2 < c.y2)
                || (c.x1 > n.x1 && n.x2 > c.x2 && c.y1 > n.y1 && n.y2 > c.y2)
                || (c.x2 < n.x1 || n.x2 < c.x1 || c.y2 < n.y1 || n.y2 < c.y1)) {
            return false;
        }
        return true;
    }
}

문제를 풀 때 마다 나는 말하는 감자란걸 느낀다.. bfs를 좀 더 다양하게 쓸 수 있구나란 생각이 드는 동시에 이렇게 풀 생각을 한번에 하는 사람들은 정말 머리가 비상하구나 라고 느꼈다. 나는 그저 계속 (풀이를 보며) 풀어갈뿐..

 

이 문제의 핵심 아이디어는 n개의 직사각형 중에서 다른 직사각형과 접점이 없는 직사각형의 갯수를 세면 된다. 명령어는 크게 신경을 안써도 될 것이 어처피 거북이가 펜을 드는 최소값을 찾는 것이니 다른 명령어는 신경 쓸 필요가 없다.

그리고 접점이 있는 직사각형들은 이어서 그릴 수가 있기때문에 묶어서 하나로 생각할 수 있다.

 

그렇다면 접점이 없는 직사각형은 어떻게 판별할 수 있을까?

 

1. A가 B를 완전히 내포하고 있는 경우

2. A가 B에 내포되고 있는 경우

3. 상, 하, 좌, 우 완전히 접점이 없는 경우

 

이렇게 판별 메서드를 만들어서 BFS를 구현해 접점이 있다고 판단되면 계속해서 다른 직사각형들이 접점이 있는지 탐색한다. 그리고 탐색이 끝나면 Count를 하나 추가해준다. 

 

하지만 이렇게 되면 작은 문제가 하나 발생한다. 0, 0에서 거북이가 펜을 내리고 시작하니 만약 n개의 직사각형 중에 0,0 좌표에 접점이 있는 직사각형이 있을 경우 나온 답에서 -1을 해주어야 한다. 

 

그러려면 입력받은 직사각형 중에 0, 0을 지나는 직사각형이 있는지 확인해서 있다면 -1을 해주어야 하는데 그럼 비효율적이니 애초에 0, 0, 0, 0을 하나 넣어둬서 (펜이 내려져서 시작하니) 처음부터 바로 나아가고 무조건 -1을 해주면 된다. 

 

저작자표시

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

[백준] 2580 스도쿠 java  (0) 2022.03.27
[백준] 5014 스타트링크 java  (0) 2022.03.25
[백준] 1759 암호 만들기 java  (0) 2022.03.22
[백준] 2186 문자판 java  (0) 2022.03.21
[백준] 2251 물통 java  (0) 2022.03.19
'Dev/PS' 카테고리의 다른 글
  • [백준] 2580 스도쿠 java
  • [백준] 5014 스타트링크 java
  • [백준] 1759 암호 만들기 java
  • [백준] 2186 문자판 java
풋데브
풋데브
지속가능한 삶
풋데브
지루함에 익숙해지자
풋데브
전체
오늘
어제
  • 분류 전체보기 (90)
    • 일상 (4)
    • 후기 (2)
    • 운동 (0)
    • Dev (84)
      • PS (72)
      • CS (0)
      • Java (1)
      • Spring (0)
      • DB (4)
      • Test (2)
      • Web (0)
      • 트러블 슈팅 (2)
      • Etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 개발자
  • 투포인터
  • java
  • combination
  • DP
  • Developer
  • Implement
  • 구현
  • 백엔드
  • 너비우선탐색
  • bruteforce
  • 코딩테스트
  • programming
  • DFS
  • 깊이우선탐색
  • BFS
  • codingtest
  • 자료구조
  • 코테
  • 그래프
  • 백트래킹
  • graph
  • 자바
  • BOJ
  • algorithm
  • 백준
  • 완전탐색
  • 다이나믹프로그래밍
  • 알고리즘
  • 조합

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
풋데브
[백준] 3108 로고 java
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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