코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍
알고리즘/백준

1941번 : 소문난 칠공주

알고리즘/백준

1941번 : 소문난 칠공주

2023. 10. 4. 19:23

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

 

1941번: 소문난 칠공주

총 25명의 여학생들로 이루어진 여학생반은 5×5의 정사각형 격자 형태로 자리가 배치되었고, 얼마 지나지 않아 이다솜과 임도연이라는 두 학생이 두각을 나타내며 다른 학생들을 휘어잡기 시작

www.acmicpc.net

 

문제

총 25명의 여학생들로 이루어진 여학생반은 5×5의 정사각형 격자 형태로 자리가 배치되었고, 얼마 지나지 않아 이다솜과 임도연이라는 두 학생이 두각을 나타내며 다른 학생들을 휘어잡기 시작했다. 곧 모든 여학생이 ‘이다솜파’와 ‘임도연파’의 두 파로 갈라지게 되었으며, 얼마 지나지 않아 ‘임도연파’가 세력을 확장시키며 ‘이다솜파’를 위협하기 시작했다.

위기의식을 느낀 ‘이다솜파’의 학생들은 과감히 현재의 체제를 포기하고, ‘소문난 칠공주’를 결성하는 것이 유일한 생존 수단임을 깨달았다. ‘소문난 칠공주’는 다음과 같은 규칙을 만족해야 한다.

  1. 이름이 이름인 만큼, 7명의 여학생들로 구성되어야 한다.
  2. 강한 결속력을 위해, 7명의 자리는 서로 가로나 세로로 반드시 인접해 있어야 한다.
  3. 화합과 번영을 위해, 반드시 ‘이다솜파’의 학생들로만 구성될 필요는 없다.
  4. 그러나 생존을 위해, ‘이다솜파’가 반드시 우위를 점해야 한다. 따라서 7명의 학생 중 ‘이다솜파’의 학생이 적어도 4명 이상은 반드시 포함되어 있어야 한다.

여학생반의 자리 배치도가 주어졌을 때, ‘소문난 칠공주’를 결성할 수 있는 모든 경우의 수를 구하는 프로그램을 작성하시오.

 

입력

'S'(이다‘솜’파의 학생을 나타냄) 또는 'Y'(임도‘연’파의 학생을 나타냄)을 값으로 갖는 5*5 행렬이 공백 없이 첫째 줄부터 다섯 줄에 걸쳐 주어진다.

 

출력

첫째 줄에 ‘소문난 칠공주’를 결성할 수 있는 모든 경우의 수를 출력한다.

 


소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int N = 5, result = 0, selected[];
    static char map[][];
    static boolean visited[], adjVisited[];
    static int dx[] = { -1, 0, 1, 0 };
    static int dy[] = { 0, 1, 0, -1 };
    static ArrayDeque<Integer> q;

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

        map = new char[N][N];
        for (int i = 0; i < N; i++)
            map[i] = br.readLine().toCharArray();

        // 이차원 배열을 일차원 배열로 표현
        visited = new boolean[N*N];
        // 선택된 칠공주
        selected = new int[7];

        // 칠공주 조합을 찾으러
        find(0, 0, 0);

        System.out.println(result);
    }

    public static void find(int idx, int cnt, int cntS) {
        // 7명의 여학생으로 구성,
        if (cnt == 7) {
            // '솜'파 학생이 4명 이상이라면
            if (cntS >= 4) {
                // 인접 확인
                if(checkAdj())
                    result++;
                return;
            }
            // '솜'파가 4명 이상이 아니면 그냥 return..
            return;
        }

        for (int i = idx; i < N*N; i++) {
            visited[i] = true;

            selected[cnt] = i;
            // '솜'파일 경우,
            if(map[i/N][i%N] == 'S') find(i + 1, cnt + 1, cntS + 1);
            else find(i + 1, cnt + 1, cntS);

            visited[i] = false;
        }
    }

    public static boolean checkAdj() {
        int cnt = 1;
        adjVisited = new boolean[N*N];
        q = new ArrayDeque<>();
        // 임의 한 명 위치를 Queue에 넣고
        q.add(selected[0]);
        // 7명이 모두 인접해있는지 확인
        while(!q.isEmpty()) {
            int now = q.poll();
            adjVisited[now] = true;

            for (int d = 0; d < 4; d++) {
                int xx = (now/N) + dx[d];
                int yy = (now%N) + dy[d];
                // 범위를 벗어나면 pass
                if(xx < 0 || yy < 0 || xx >= N || yy >= N) continue;
                // 이미 확인한 애면 pass
                if(adjVisited[xx*N+yy]) continue;
                // 인접한 앤데 공주가 아니면 pass
                if(!visited[xx*N+yy]) continue;
                // 인접한 애가 같은 공주네?
                cnt++;
                adjVisited[xx*N+yy] = true;
                q.add(xx*N+yy);
            }
        }
        // 임의 한 명 이랑 인접한 공주가 모두 7명이 되면 true
        if(cnt == 7) return true;
        else return false;
    }
}

 

해결 방법

  1. 소문난 칠공주는 '솜'파, '연'파로 구성될 수 있기에 7명의 학생을 선택한다. (백트래킹)
  2. 7명의 학생 중 '솜'파가 4명이상이라면 서로 인접해있는 지 확인한다. (BFS)
  3. 인접해있다면 결과값을 증가시킨다.
  4. 7명의 학생을 선택하는 모든 경우를 판단했다면 종료한다.

 

참고 자료

https://data-make.tistory.com/476

'알고리즘 > 백준' 카테고리의 다른 글

14725번 : 개미굴  (1) 2023.10.17
14716번 : 현수막  (1) 2023.10.09
8979번 : 올림픽 2  (0) 2023.10.03
2792번 : 보석 상자  (0) 2023.10.01
14562번 : 태권왕  (0) 2023.09.28
  • 문제
  • 입력
  • 출력
  • 소스코드
  • 해결 방법
'알고리즘/백준' 카테고리의 다른 글
  • 14725번 : 개미굴
  • 14716번 : 현수막
  • 8979번 : 올림픽 2
  • 2792번 : 보석 상자
코딍코딍
코딍코딍
ㅎ2

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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