알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][2422] 한윤정이 이탈리아에 가서 아이스크림을 사먹는데

kim.svadoz 2021. 4. 22. 23:56
728x90
반응형

www.acmicpc.net/problem/2422

 

2422번: 한윤정이 이탈리아에 가서 아이스크림을 사먹는데

첫째 줄에 정수 N과 M이 주어진다. N은 아이스크림 종류의 수이고, M은 섞어먹으면 안 되는 조합의 개수이다. 아래 M개의 줄에는 섞어먹으면 안 되는 조합의 번호가 주어진다. 같은 조합은 두 번

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 4244 1803 1366 42.044%

문제

한윤정과 친구들은 이탈리아로 방학 여행을 갔다. 이탈리아는 덥다. 윤정이와 친구들은 아이스크림을 사먹기로 했다. 아이스크림 가게에는 N종류의 아이스크림이 있다. 모든 아이스크림은 1부터 N까지 번호가 매겨져있다. 어떤 종류의 아이스크림을 함께먹으면, 맛이 아주 형편없어진다. 따라서 윤정이는 이러한 경우를 피하면서 아이스크림을 3가지 선택하려고 한다. 이때, 선택하는 방법이 몇 가지인지 구하려고 한다.

입력

첫째 줄에 정수 N과 M이 주어진다. N은 아이스크림 종류의 수이고, M은 섞어먹으면 안 되는 조합의 개수이다. 아래 M개의 줄에는 섞어먹으면 안 되는 조합의 번호가 주어진다. 같은 조합은 두 번 이상 나오지 않는다. (1 ≤ N ≤ 200, 0 ≤ M ≤ 10,000)

출력

첫째 줄에, 가능한 방법이 총 몇 개 있는지 출력한다.

예제 입력 1

5 3
1 2
3 4
1 3

예제 출력 1

3

코드

// 아이스크림 
import java.io.*;
import java.util.*;
public class p2422 {
    static int n, m, answer;
    static int[] arr;
    static boolean[] visit;
    static boolean[][] graph;
    static int[] result;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        graph = new boolean[n][n];
        visit = new boolean[n];
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;
            graph[a][b] = true;
            graph[b][a] = true;
        }

        result = new int[3];

        answer = 0;
        comb(0, 0);
        System.out.println(answer);
    }

    static void comb(int start, int depth) {
        if (depth == 3) {
            if (check()) {
                answer++;
            }
            return;
        }

        for (int i = start; i < n; i++) {
            if (visit[i]) continue;
            visit[i] = true;
            result[depth] = i;
            comb(i, depth + 1); // i로 하로 하는게 i + 1로 하는거보다 시간을 덜먹는다
            visit[i] = false;
        }
    }

    static boolean check() {
        for (int i = 0; i < 2; i++) {
            for (int j = i + 1; j < 3; j++) {
                if (graph[result[i]][result[j]]) return false;
            }
        }
        return true;
    }

}

더 좋은 풀이

import java.io.*;
import java.util.StringTokenizer;
public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        try {
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            boolean[][] check = new boolean[200][200];

            for(int i = 0; i < M; i++) {
                st = new StringTokenizer(br.readLine());
                int ice1 = Integer.parseInt(st.nextToken());
                int ice2 = Integer.parseInt(st.nextToken());
                check[ice1 - 1][ice2 - 1] = true;
                check[ice2 - 1][ice1 - 1] = true;
            }

            int ans = 0;
            for(int i = 0; i < N; i++) {
                for(int j = i + 1; j < N; j++) {
                    for(int k = j + 1; k < N; k++) {
                        if(check[i][j] || check[i][k] || check[j][k])
                            continue;
                        ans++;
                    }
                }
            }

            System.out.println(ans);


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
728x90
반응형

'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글

[ BOJ ][JAVA][2448] 별 찍기 - 11  (0) 2021.04.22
[ BOJ ][JAVA][2447] 별 찍기 - 10  (0) 2021.04.22
[ BOJ ][JAVA][2352] 반도체 설계  (0) 2021.04.22
[ BOJ ][JAVA][2331] 반복수열  (0) 2021.04.22
[ BOJ ][JAVA][2294] 동전 2  (0) 2021.04.22