[백준] 1799 비숍 - Java

2023. 9. 30. 16:25· Algorithm/백준 문제풀이
목차
  1. 문제 출저
  2. 문제 풀이
  3. 소스 코드

 

 

문제 출저

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

 

1799번: 비숍

첫째 줄에 체스판의 크기가 주어진다. 체스판의 크기는 10이하의 자연수이다. 둘째 줄부터 아래의 예와 같이 체스판의 각 칸에 비숍을 놓을 수 있는지 없는지에 대한 정보가 체스판 한 줄 단위로

www.acmicpc.net

 

 

 

문제 풀이

체스판 크기 N이 주어집니다. 그리고 비숍을 둘 수 있는 위치가 주어집니다. (1 : 가능, 0 : 불가능)

비숍을 겹치지 않게 가장 많이 둘려고 할 때, 둘 수 있는 최댓값을 구하는게 이 문제의 요구사항 입니다.

 

 

백 트래킹으로 풀었습니다.

이 때, 비숍은 대각선으로만 움직이기 때문에 흑과 백이 서로를 간섭할 수 없습니다.

따라서 흑과 백을 따로 백트래킹을 돌린 다음 값을 더합니다.

 

 

 

 

소스 코드

package baekjoon.backjoon9.day30;

/*
비숍
https://www.acmicpc.net/problem/1799

1 : 비숍을 놓을 수 있는 위치
0 : 비숍을 놓을 수 없는 위치

비숍을 놓았을 때 비숍의 영역을 색칠하는게 아니라
비숍을 놓는다고 가정했을 때 경로에 비숍에 없는지를 체크

3
0 1 1
1 1 1
1 1 1

ans:4

5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

ans:8

8
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

ans : 14

10
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

ans:18


 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B1799 {

    static int n;
    static int[][] board;
    static int[][] chess;

    static boolean[][] visited;

    static int black;
    static int white;

    static int answer;

    // 대각선  우하, 좌하, 좌상, 우상
    static int[] dx = {1, -1, -1, 1};
    static int[] dy = {1, 1, -1, -1};


    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        board = new int[n][n];
        visited = new boolean[n][n];

        for(int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j = 0; j < n; j ++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        chess = new int[n][n];
        int count = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                chess[i][j] = (i+j) % 2;
            }
        }

//        for(int i = 0; i < n; i++) {
//            for(int j = 0; j < n; j++) {
//                System.out.print(chess[i][j] + " ");
//            }
//            System.out.println();
//        }



        black = 0;
        white = 0;

        // black 탐색
        dfs(0, 0, chess[0][0], 0);

        // white 탐색
        dfs(0, 1, chess[0][1], 0);

        answer = black + white;

        System.out.println(answer);

    }

    public static void dfs(int y, int x, int color ,int count) {



        if(y >= n) {
            if(color == 0) {
                black = Math.max(black, count);
            }
            else {
                white = Math.max(white, count);
            }
            return;
        }

        int nx = x + 2;
        int ny = y;

        if(nx >= n) {
            ny++;
            if(ny < n) {
                if(chess[ny][0] == color) {
                    nx = 0;
                }
                else {
                    nx = 1;
                }
            }
        }



        // 둘 수 없는 경우 넘어간다.
        if(board[y][x] == 0) {
            dfs(ny, nx, color, count);
            return;
        }

        // 현재 장소에 비숍을 둘 수 있을 때 비숍을 두는 경우
        if(bishop(y,x)) {
            visited[y][x] = true;
            dfs(ny, nx, color, count+1);
            visited[y][x] = false;
        }

        // 비숍을 두지 않고 그냥 넘어가는 경우
        dfs(ny, nx, color, count);

    }

    // y,x에 비숍을 두었을 때 경로에 다른 비숍이 있는지 확인
    public static boolean bishop(int y, int x) {

        // 대각선 4방향 표시
        for(int i = 0; i < 4; i++) {

            int ny = y + dy[i];
            int nx = x + dx[i];

            while(check(ny,nx)) {

                if(visited[ny][nx] == true) {
                    return false;
                }

                ny += dy[i];
                nx += dx[i];
            }

        }
        return true;
    }

    public static boolean check(int y, int x) {
        if(y >= 0 && y < n && x >= 0 && x < n) {
            return true;
        }
        else {
            return false;
        }
    }


}
  1. 문제 출저
  2. 문제 풀이
  3. 소스 코드
'Algorithm/백준 문제풀이' 카테고리의 다른 글
  • [백준] 16401 과자 나눠주기 - Java
  • [백준] 17141 연구소2 - Java
  • [백준] 1941 소문난 칠공주 - Java
  • [백준] 16987 계란으로 계란치기 - Java
너지살
너지살
너지살
너지살개발자
너지살
전체
오늘
어제
  • 분류 전체보기 (375)
    • 잡식 (2)
      • 티스토리 (2)
    • 개발 일지 (0)
      • OMS 프로젝트 (4)
      • 우테코 6기 프리코스 (1)
    • Git (2)
    • JAVA (15)
      • Java 공부 (6)
      • 자료구조 (4)
      • 도움되는 메모 (4)
    • DevOps (18)
      • AWS (6)
      • Docker (2)
      • Jenkins (1)
      • Nginx (1)
      • Kafka (6)
      • RabbitMQ (2)
    • Spring, Spring Boot (16)
      • Test Code (1)
      • AOP (2)
      • Batch (3)
      • Cache - Redis (5)
      • Cloud Config - 설정 파일 관리 (3)
      • 성능 측정 (1)
      • 예외 처리 (1)
    • BackEnd (1)
      • Spring 공부 (1)
      • Thymeleaft (0)
    • DB (17)
      • JPA (2)
      • DB 공부 (3)
      • DB 포스팅 (4)
      • DB 답장 (1)
      • MySQL (2)
      • Redis (5)
      • MongoDB (0)
    • CS (8)
      • Spring (4)
      • DataBase (3)
      • Java (1)
    • Algorithm (203)
      • 알고리즘 개념 (5)
      • 정렬 알고리즘 (11)
      • 프로그래머스 문제풀이 (18)
      • 백준 문제풀이 (165)
      • 소프티어 문제풀이 (3)
      • 알고리즘 시험 정리 (1)
    • SQL (0)
      • 문법 (1)
      • 프로그래머스 문제풀이 (52)
      • 리트코드 문제풀이 (19)
    • IT (1)
      • IT 공부 (1)
    • 정리 (10)
      • 질문 정리 (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • DFS
  • 그래프 이론
  • 백준
  • 자료구조
  • 비트마스킹
  • 설정
  • 알고리즘
  • Spring Batch
  • 투 포인터
  • 경로표현식
  • dynamic programing
  • 크루스칼 알고리즘
  • redis
  • Java 정리
  • 병렬 처리
  • 그래프 탐색
  • db
  • Java
  • 최소 스패닝 트리
  • 깊이/너비 우선탐색
  • 데이터베이스
  • git
  • Spring Boot
  • 유니온파인드
  • 외판원 순회 문제
  • docker
  • Spring Boot Redis 연결
  • 부분탐색
  • JPA
  • DP
  • 질문 정리
  • cache
  • 다이나믹프로그래밍
  • Sorting algorithm
  • 두 포인터
  • Union-Find
  • Algorithm
  • 다음 순열 찾기
  • 투포인트
  • 소프티어
  • 분리 집합
  • two pointer
  • dynamiceprogramming
  • Test code
  • 우선수위큐
  • Bitmast
  • 다이나믹 프로그래밍
  • Next permutation
  • MST
  • 최소 신장 트리

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
너지살
[백준] 1799 비숍 - Java
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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