728x90
오답 노트 & 새로 알게 된 점
해당 문제는 백트래킹을 사용하지 않아도 TLE가 나지 않을 것 같아 완전 탐색으로 풀었다.
cannot이라는 배열을 사용하여 조합하면 안 되는 것들을 index로 하고 값을 true라고 저장해뒀다. 그래서
삼중 for문을 사용하여 가능한 경우의 수를 모두 탐색하는 중에 cannot 값이 false를 가지게 되면 ( = 조합해도 된다) result를 더해주었다.
여기서 가장 중요한 부분은 삼중 for문 안 주석문이다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import java.io.*;
import java.util.*;
public class BOJ2422 {
static int atoi(String srt){
return Integer.parseInt(srt);
}
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = atoi(st.nextToken());
int no = atoi(st.nextToken());
int result = 0;
boolean cannot[][] = new boolean[n+1][n+1];
for(int i = 0; i < no; i++){
st = new StringTokenizer(br.readLine());
int s1 = atoi(st.nextToken());
int s2 = atoi(st.nextToken());
cannot[s1][s2] = cannot[s2][s1] = true; //조합하면 안되는 것들은 true
}
for(int i = 1; i <= n; i++){
for(int j = i + 1; j <= n; j++){
//이 아래 부분이 포인트임
//여기서 미리 경우의 수를 좁혀서 아래 k와 비교할 떄 경우의 수를 줄여줌
//만약 해당 코드를 입력하지 않는다면 i, j, k 세 수 중에 두 수를 비교하여 [s1][s2]의 값이
//true인지 false인지 총 3번 비교할 걸 줄여줌.
if(cannot[i][j] == false) {
for (int k = j + 1; k <= n; k++) {
if(cannot[i][k] == false && cannot[j][k] == false) result++;
}
}
}
}
System.out.println(result);
}
}
|
cs |
728x90
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 11508 2+1 세일 (0) | 2021.06.25 |
---|---|
자바(백준) 1758 알바생 강호 (0) | 2021.06.25 |
자바(백준) 2217 로프 (0) | 2021.05.31 |
자바(백준) 1931 회의실 배정 (0) | 2021.05.31 |
자바(백준) 2583 영역 구하기 (0) | 2021.05.28 |