Algorithm/BOJ

[BOJ 2422] S5 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 {C++, Java, Kotlin, Python}

surimi🍥 2022. 12. 18. 16:42
반응형

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

 

C++

#include <iostream>
using namespace std;

// 동적 할당 없이 하기.
// bool chk[201][201];
int main(void)
{
    cin.tie(0)->sync_with_stdio(0);
    cout.tie(0);

    int N, M, cnt = 0;
    cin >> N >> M;

    // 2차원 배열 동적 할당
    bool **chk = new bool*[N + 1];
    for (int i = 0; i <= N; i++)
        chk[i] = new bool[N + 1];
    
    for (int i = 0; i < M; i++)
    {
        int a, b;
        cin >> a >> b;
        // 뒤집힌 경우에도 체크가 가능하다 (1, 2) == (2, 1)
        chk[a][b] = chk[b][a] = 1;
    }
    for (int i = 1; i <= N; i++)
        for (int j = i + 1; j <= N; j++)
        {
            if (chk[i][j])
                continue;
            for (int k = j + 1; k <= N; k++)
            {
                if (chk[i][k] || chk[j][k])
                    continue;
                cnt++;
            }
        }
    // new[] 로 할당된 배열 할당 해제
    delete []chk;
    cout << cnt << '\\n';
}

Java

import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            String[] str = br.readLine().split(" ");
            int N = Integer.parseInt(str[0]);
            int M = Integer.parseInt(str[1]);
            int cnt = 0;
            boolean[][] chk = new boolean[N + 1][N + 1];
            for (int i = 0; i < M; i++) {
                String[] tmp = br.readLine().split(" ");
                int a = Integer.parseInt(tmp[0]);
                int b = Integer.parseInt(tmp[1]);
                chk[a][b] = chk[b][a] = true;
            }

            for (int i = 1; i <= N; i++)
                for (int j = i + 1; j <= N; j++) {
                    if (chk[i][j])
                        continue;
                    for (int k = j + 1; k <= N; k++) {
                        if (chk[i][k] || chk[j][k])
                            continue;
                        cnt++;
                    }
                }
            System.out.println(cnt);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Kotlin

// `in` is a keyword in Kotlin, so we need to use backticks to escape it
// `in` is an InputStream, so we need to wrap it in a BufferedReader
// `run`은 람다식을 실행시키는 함수 입니다.
// `in`은 InputStream이기 때문에 BufferedReader로 감싸줍니다.

// fun main() = 은 람다식을 실행시키는 함수 입니다.
fun main() =
        System.`in`.bufferedReader().run {

            // 한줄을 읽고 공백을 기준으로 나누고 Int로 변환합니다.
            val (n, m) = readLine()!!.split(' ').map { it.toInt() }

            // make 2d dimension array boolean
            // 2차원 배열을 만듭니다.
            // Array<BooleanArray>(n + 1) { BooleanArray(n + 1) } 는 n + 1개의 배열을 만들고 각 배열에 n + 1개의 false를 넣습니다.
            val arr = Array<BooleanArray>(n + 1) { BooleanArray(n + 1) }

            // n개의 줄을 읽고 공백을 기준으로 나누고 Int로 변환한 뒤 그 값을 arr에 넣습니다.
            repeat(m) {
                val line = readLine()!!.split(' ').map { it.toInt() }
                arr[line[0]][line[1]] = true
                arr[line[1]][line[0]] = true
            }
            // contentDeepToString()은 2차원 배열을 출력하는 함수 입니다.
            // println(arr.contentDeepToString())

            // 1..n은 1부터 n을 포함하는 범위를 만듭니다.
            // i + 1 에는 괄호를 안 씌워도 된다.
            var cnt = 0
            for (i in 1..n) {
                for (j in (i + 1)..n) {
                    if (arr[i][j]) continue
                    for (k in (j + 1)..n) {
                        if (arr[i][k] || arr[j][k]) continue
                        cnt++
                    }
                }
            }

            println(cnt)
        }

Python

from sys import stdin
input = stdin.readline

def main():
    N, M = list(map(int, input().split(" ")))

    # 배열을 *연산자로 선언하면, 배열의 주소값이 복사되어서 같은 배열을 가리키게 된다.
    chk = [[0 for _ in range(N+1)] for _ in range(N+1)]
    for _ in range(M):
        t = list(map(int, input().split(" ")))
        # 뒤집힌 경우에도 체크할 수 있다.
        chk[t[0]][t[1]] = chk[t[1]][t[0]] = 1
    cnt = 0
    # 3 for loop를 돌면서 모든 경우를 체크한다.
    for i in range(1, N+1):
        for j in range(i + 1, N+1):
            if chk[i][j]:
                continue
            for k in range(j + 1, N+1):
                if chk[i][k] or chk[j][k]:
                    continue
                cnt = cnt + 1
    print(cnt)

if __name__ == '__main__':
    main()

Python2

from itertools import combinations
from sys import stdin
input = stdin.readline

def main():
    N, M = list(map(int, input().split(" ")))

    # 배열을 *연산자로 선언하면, 배열의 주소값이 복사되어서 같은 배열을 가리키게 된다.
    # 따라서, 배열을 복사하고 싶다면, copy.deepcopy()를 사용해야 한다.
    # chk = [[0] * (N+1)] * (N+1)은 chk[1][2] = 1을 하면, chk[2][1]도 1이 된다.
    # chk = [[0 for _ in range(N+1)] for _ in range(N+1)]은 chk[1][2] = 1을 하면, chk[2][1]은 0이다.
    # chk = [[0] * (N+1)] * (N+1)과 chk = [[0 for _ in range(N+1)] for _ in range(N+1)]의 차이점을 이해하자.
    chk = [[0 for _ in range(N+1)] for _ in range(N+1)]
    for _ in range(M):
        t = list(map(int, input().split(" ")))
        # 뒤집힌 경우에도 체크할 수 있다.
        chk[t[0]][t[1]] = chk[t[1]][t[0]] = 1
    cnt = 0

    # combinations(range(1, N+1), 3)은 1부터 N+1까지의 수 중 3개를 뽑아 만들수 있는 모든 조합을 만들어준다.
    # 예를 들어, N=4이라면, combinations(range(1, N+1), 3)은 
    # [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]를 만들어준다.
    # 이때, i는 (1, 2, 3)과 같은 튜플이다.
    for i in combinations(range(1, N+1), 3):
        if chk[i[0]][i[1]] or chk[i[0]][i[2]] or chk[i[1]][i[2]]:
            continue
        cnt += 1
    print(cnt)

if __name__ == '__main__':
    main()
반응형