일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- modern c++
- SECS
- Gem
- c
- SW Expert Academy
- 회귀
- linux
- Spotify Api
- MYSQL
- Baekjoon
- java
- 자바
- 파이썬
- SECS/GEM
- spring boot
- regression
- 스포티파이
- SWEA
- C++
- python
- spotify
- 백준
- programmers
- Spring
- 프로그래머스
- Spring JPA
- Computer Science
- 회원가입
- SECS-II
- CS
- Today
- Total
비버놀로지
[BAEKJOON 백준] 1613 역사 본문
역사, 그 중에서도 한국사에 해박한 세준이는 많은 역사적 사건들의 전후 관계를 잘 알고 있다. 즉, 임진왜란이 병자호란보다 먼저 일어났으며, 무오사화가 기묘사화보다 먼저 일어났다는 등의 지식을 알고 있는 것이다.
세준이가 알고 있는 일부 사건들의 전후 관계들이 주어질 때, 주어진 사건들의 전후 관계도 알 수 있을까? 이를 해결하는 프로그램을 작성해 보도록 하자.
첫째 줄에 첫 줄에 사건의 개수 n(400 이하의 자연수)과 알고 있는 사건의 전후 관계의 개수 k(50,000 이하의 자연수)가 주어진다. 다음 k줄에는 전후 관계를 알고 있는 두 사건의 번호가 주어진다. 이는 앞에 있는 번호의 사건이 뒤에 있는 번호의 사건보다 먼저 일어났음을 의미한다. 물론 사건의 전후 관계가 모순인 경우는 없다. 다음에는 사건의 전후 관계를 알고 싶은 사건 쌍의 수 s(50,000 이하의 자연수)이 주어진다. 다음 s줄에는 각각 서로 다른 두 사건의 번호가 주어진다. 사건의 번호는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.'
먼저 입력되는 값의 전후 사건이 입력이 된다.
그 입력되는 값을 boolean 배열을 통해서 전 후 사건의 경우 true 로 만들어 준다.
그렇게 만들어진 배열에서 solution 이라는 매서드를 통해서 이어지는 사건들도 true로 만들어 줘야 한다.
solution을 거치면서 새로운 true가 생기는 것을 알 수 있다.
새롭게 생긴 true는 1,2 와 2,4 가 true이기 때문에 1,4도 true 이라는것을 표시해 준것이다.
이렇게 완성된 배열을 이용해서 먼저 일어난 사건이 true로 되어있고, 먼저 일어난 사건인 경우 -1을 출력하게 된다. 따라서, 1, 5 의 경우 사건이 일어나지 않았기 때문에 0이 되고, 2,4 의 경우 사건이 일어났는데 2가 먼저 일어나서 -1이 출력이 된다.
3,1 의 경우 false이지만, 1,3이 true이기 때문에 뒤에 사건이 먼저 일어난 것을 알 수 있다. 따라서, 1을 출력하게 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, K;
static boolean dist[][];
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken());
dist = new boolean[N+1][N+1];
for(int i=0; i<K; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
dist[x][y] = true;
}
solution();
StringBuilder sb = new StringBuilder();
K = Integer.parseInt(br.readLine());
for(int i=0; i<K; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
if(dist[x][y]) sb.append("-1\n");
else if(dist[y][x]) sb.append("1\n");
else sb.append("0\n");
}
System.out.println(sb.toString());
}
private static void solution() {
for(int k=1; k<=N; k++) {
for(int i=1; i<=N; i++) {
if(!dist[i][k]) continue;
for(int j=1; j<=N; j++) {
if(dist[k][j]) dist[i][j]=true;
}
}
}
}
}
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 1715 카드 정렬하기 (0) | 2021.01.12 |
---|---|
[BAEKJOON 백준] 1697 숨바꼭질 (0) | 2021.01.12 |
[BAEKJOON 백준] 1550 16진수 (0) | 2021.01.11 |
[BAEKJOON 백준] 1463 1로 만들기 (0) | 2021.01.11 |
[BAEKJOON 백준] 1330 두 수 비교하기 (0) | 2021.01.10 |