Tany
백문이불어일Tany
Tany
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • JAVA TPC (1)
    • JAVA (10)
    • CS (3)
    • SPRING (5)
    • DFS BFS (12)
    • SQL (7)
    • 알고리즘 정리 (76)
    • Git, Github (3)
    • 학습 계획 (36)
    • 코드스쿼드 학습일지 (19)
    • Servlet (5)
    • VPC (2)
    • AWS (4)
    • JPA (5)
    • 취미생활 (2)
    • 프로젝트 기록 (7)
      • Issue Tracker 삽질 기록 (5)
      • 당근마켓 API 서버 기록 (2)
      • 나만의 블로그 제작 기록 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • 정렬
  • MVC
  • java
  • AWS
  • 알고리즘
  • 주간 학습 계획
  • github
  • 이분탐색
  • 백준
  • 이코테
  • Stack
  • EC2
  • sql
  • 파이썬
  • 면접을 위한 CS 전공지식 노트
  • MySQL
  • 완전탐색
  • BFS
  • 재귀
  • 인프런
  • 프로그래머스
  • 자바
  • dfs
  • JSP
  • JPA
  • 문자열
  • GIT
  • hash
  • 해시

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Tany

백문이불어일Tany

자바(Java) 알고리즘 문제풀이 전쟁 - 전투 [백준 / DFS]
DFS BFS

자바(Java) 알고리즘 문제풀이 전쟁 - 전투 [백준 / DFS]

2022. 9. 2. 22:42

출처 - 구글 이미지

 

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

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

 

 

풀이 코드

DFS 완전 탐색으로 풀이했다. 주의할 점은 가로의 크기가 N, 세로의 크기가 M 이라고 명시되어있는 점을 주의하자.

나는 원래 세로 길이를 N, 가로 길이를 M 으로 했었기 때문에 입력 순서를 뒤바꿔줘서 [N][M] 으로 이차원 배열을 만들 수 있게 했다.

그리고 띄워쓰기 없이 board 가 입력되기 때문에 split() 을 활용해서 board 를 셋팅해줬다.

 

DFS 메서드 호출을 이중 반복문 내부에서 호출해본적이 처음이라 시간이 굉장히 오래 걸린 문제 .. ㅎㅎ

방문하지 않았을 때, 팀 컬러가 같은 경우를 분기문으로 잘 처리해줘야 한다 !!

count 세는 부분 또한 DFS 호출 시 최소 W 또는 B 병사가 한 명은 있기 때문에 바로 count 를 1 증가시켜줘야지 엄한데서 count 증가 시켜버리면 이상한 답이 나오니 주의하자. 이렇게 바로 count 증가시킬거 아니면 다음 경로에 방문 표시한 부분 아래에서 count 를 증가시키고 String teamColor = map[i][j]; 아래 count 는 0 이 아니라 1로 초기화 시켜줘야 한다.

package backjoonsliver.dfs;

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

public class 전쟁_전투_Review {
    static int N;
    static int M;
    static int wCount;
    static int bCount;
    static int count = 0;
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, -1, 0, 1};
    static String[][] map;
    static boolean[][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        map = new String[N][M];
        visited = new boolean[N][M];

        // 1. 초기 격자판 생성
        for (int i = 0; i < N; i++) {
            String[] line = br.readLine().split("");
            for (int j = 0; j < M; j++) {
                map[i][j] = line[j];
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {

                if (!visited[i][j]) {
                    String teamColor = map[i][j];
                    count = 0; // 아군인 경우에서 적군인 경우로 넘어가서 세줄 때 count 를 초기화 시켜줘야함
                    DFS(i, j, teamColor);

                    // 아군인 경우
                    if (teamColor.equals("W")) {
                        wCount += count * count;

                        // 적군인 경우
                    } else {
                        bCount += count * count;
                    }
                }
            }
        }
        System.out.println(wCount);
        System.out.println(bCount);
    }

    private static void DFS(int x, int y, String color) {
        visited[x][y] = true; // 방문 check
        count++; // 맨 처음 W 또는 B 일 때 병사 수가 최소 1이므로
        
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx >= 0 && ny >= 0 && nx < N && ny < M && !visited[nx][ny] && map[nx][ny].equals(color)) {
                visited[nx][ny] = true; // 다음 경로에 방문 표시 check
                DFS(nx, ny, color);
            }
        }
    }
}

'DFS BFS' 카테고리의 다른 글

자바(Java) 알고리즘 문제풀이 섬의 갯수 [백준 / DFS]  (0) 2022.09.06
자바(Java) 알고리즘 문제풀이 토마토 [인프런 / BFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 A->B [백준 / DFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 음식물 피하기 [백준 / DFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 인접행렬 경로탐색 [인프런 / 모든 조합 유형]  (0) 2022.08.30
    'DFS BFS' 카테고리의 다른 글
    • 자바(Java) 알고리즘 문제풀이 토마토 [인프런 / BFS]
    • 자바(Java) 알고리즘 문제풀이 A->B [백준 / DFS]
    • 자바(Java) 알고리즘 문제풀이 음식물 피하기 [백준 / DFS]
    • 자바(Java) 알고리즘 문제풀이 인접행렬 경로탐색 [인프런 / 모든 조합 유형]
    Tany
    Tany
    내가 보려고 만드는 백엔드 기록장 Github https://github.com/juni8453

    티스토리툴바