반응형
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()
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ 1012] 유기농 배추 C++ (0) | 2023.02.08 |
---|---|
[BOJ 2606] S3 바이러스 C++ (0) | 2023.02.07 |
[BOJ 11536] S5 줄세우기 { C++, Java, Python, Kotlin } (0) | 2022.12.17 |
[ BaekJoon ] 단계별로 풀기 4. while (Python & Java & JS) (0) | 2021.12.09 |
[ BaekJoon - Python & Java ] 단계별로 풀기 3. For (0) | 2021.12.09 |