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

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morenow

morenow

Baekjoon Online Judge

[BOJ] 1941: 소문난 칠공주 (Java) with 조합

2023. 10. 19. 01:43

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

 

1941번: 소문난 칠공주

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

www.acmicpc.net


이전에 C++로 푼 문제이다. https://morenow.tistory.com/21

 

[BOJ] 1941: 소문난 칠공주 (C++) with 조합

https://www.acmicpc.net/problem/1941 1941번: 소문난 칠공주 총 25명의 여학생들로 이루어진 여학생반은 5×5의 정사각형 격자 형태로 자리가 배치되었고, 얼마 지나지 않아 이다솜과 임도연이라는 두 학생

morenow.tistory.com

Java로 조합을 경험해보기 위해 푼 문제이므로 시간은 의미가 없어서 적지 않았다.

나는 pseudo 코드로 거의 모든 코드를 작성한 후 문제를 푸는데, Java로 할 때는 pseudo 코드를 적는 속도가 너무 느리다... 기존에 알던 알고리즘도 메소드 이름 등이 헷갈리니까 생각에 제동이 걸리는 느낌..

알고리즘

알고리즘의 대부분은 위의 C++로 푼 게시글에 나와있다. 요약하자면 5 X 5 교실의 25명 중 7명을 조합해서, 붙어있는지 (adj 메소드) 그리고 이다솜파가 많은지 (moreDasom 메소드) 확인을 하고 카운트를 하면 된다.

이 때, 굳이 i와 j 두 개를 조합하지 않고, 하나만 뽑아 5로 나눈 몫과 나머지로 i와 j를 대체하면 된다. 예를 들어, (3, 2) 를 뽑는 경우 대신 17을 뽑으면 된다.

정답 코드

import java.io.*;
import java.util.*;

public class BOJ1941 {

    static String[] students = new String[5];
    static List<Integer> cands = new ArrayList<>();
    static int answer = 0;

    public static void main(String args[]) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; i < 5; i++) {
            students[i] = bf.readLine();
        }
        comb(0, 7);
        System.out.println(answer);
    }

    static void comb(int idx, int remain) {
        if (remain == 0) {
            if (adj() && moreDasom()) {
                answer++;
            }
            return;
        }
        if (idx == 25) {
            return;
        }

        //선택하는 경우
        cands.add(idx);
        comb(idx+1 ,remain-1);
        cands.remove(cands.size()-1);

        //선택하지 않는 경우
        comb(idx+1, remain);
    }

    static boolean adj() {
        boolean[] check = new boolean[7];
        Queue<Integer> q = new LinkedList<Integer>();
        q.offer(cands.get(0));
        check[0] = true;
        while (!q.isEmpty()) {
            int cur = q.poll();
            for (int i = 0; i < 7; i++) {
                if (check[i]) continue;
                int diff = cands.get(i) - cur;
                if (diff * diff == 1 || diff * diff == 25) {
                    if (cur % 5 == 4 && cands.get(i) % 5 == 0 || cur % 5 == 0 && cands.get(i) % 5 == 4)
                        continue;
                    q.offer(cands.get(i));
                    check[i] = true;
                }
            }
        }
        for (int i = 0; i < 7; i++)
            if (!check[i]) return false;
        return true;
    }

    static boolean moreDasom() {
        int cntDasom = 0;
        for (int cand : cands) {
            if (students[cand/5].charAt(cand%5) == 'S') {
                cntDasom++;
            }
        }
        return cntDasom > 3;
    }
}

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

[BOJ] 21608 : 상어 초등학교 (Java) with 정렬  (1) 2023.10.26
[BOJ] 1941: 영역 구하기 (Java)  (0) 2023.10.19
[BOJ] 1520 : 내리막 길 (C++) with Top Down DP  (1) 2023.10.05
[BOJ] 11404 : 플로이드 (C++) with 플로이드  (1) 2023.10.04
[BOJ] 14501 : 퇴사 (C++) with DP  (1) 2023.09.27
    'Baekjoon Online Judge' 카테고리의 다른 글
    • [BOJ] 21608 : 상어 초등학교 (Java) with 정렬
    • [BOJ] 1941: 영역 구하기 (Java)
    • [BOJ] 1520 : 내리막 길 (C++) with Top Down DP
    • [BOJ] 11404 : 플로이드 (C++) with 플로이드
    morenow
    morenow

    티스토리툴바