일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SOCKET
- 카카오코드페스티벌
- 파핑파핑지뢰찾기
- 달팽이는올라가고싶다
- 백준
- boj
- GitHub
- web
- 타겟넘버
- npm
- Git
- 17822
- JavaScript
- SWEA
- 알고리즘
- Ajax
- HTTP
- JSP
- staged
- node.js
- commited
- 2869
- 소형기관차
- graph
- 1868
- 응답코드
- Java
- 비동기
- react
- 17471
- Today
- Total
devlog
[BOJ] 백준 2252 줄세우기-java 본문
풀이
이 문제는 학생들의 키 순서를 전체적으로는 알 수 없고 부분적인 정보만을 제공합니다.
그렇기 때문에 답은 여러 가지가 나올 수도 있습니다.
일단 확실한 것은 두명의 학생의 키를 비교한 정보들만 알 수 있으므로 만약 어떤 학생은 다른 학생보다 작다는 정보를 받지 않았으면 그 학생은 제일 앞에 서도 된다는 뜻입니다.
두 번째 줄부터 m+1번째 줄까지 받은 정보 중에 예 씨로 나온 1 3이라는 입력이 들어오면 1이라는 학생은 3이라는 학생보다 앞에서야 한다는 뜻인데 반대로 3이라는 학생은 1이라는 학생의 뒤에 서야 하기 때문에 (바로 뒤가 아니어도 뒤에 서면 됩니다.) 1이라는 학생이 먼저 앞에 서야 줄을 설 수 있습니다.
그러한 점을 이용하여 a라는 학생의 뒤에 서야 하는 학생을 인접리스트로 나타냈습니다.
graph라는 리스트의 a번째에는 인접리스트가 연결되어 있는데 그 인접 리스트엔 a번째 학생의 뒤에 서야 하는 학생들의 정보를 넣어놓습니다.
그리고 degree라는 배열은 a라는 학생의 앞에 몇명의 학생이 있어야 하는지를 나타내는데 a라는 학생이 b,c라는 학생 뒤에 서야 한다는 입력을 받았다면 b와 c라는 학생이 줄을 서면 그때 degree를 하나씩 감소하여 2였던 degree[a]가 두 번 1씩 감소하여 0이 됩니다.
그렇게 되면 a라는 학생은 줄을 서도 되는것이기때문에 그런 식으로 degree배열의 값으로 앞에부터 줄을 세워도 되는지 확인합니다.
degree가 0인 학생부터 차례대로 queue에 추가한 뒤 그 학생의 degree는 -1로 바꿔주어 이미 줄을 섰다고 표시해줍니다.
또한 a라는 학생이 큐에 들어간 순간(줄을 서면) a라는 학생보다 뒤에 서야 하는 학생들은 자신의 앞에 서야 하는 학생 한 명이 줄을 섰기 때문에 degree의 값을 1씩 줄여줘야 하고 줄인 값이 0이면 그 학생의 번호도 큐에 추가하면서 큐가 빌 때까지 반복합니다.
큐가 비었다는 것은 모든 학생의 degree가 0이되어 큐에 들어가고 출력했다는 뜻으로 프로그램이 종료됩니다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 백준 5567 결혼식-java (0) | 2019.06.21 |
---|---|
[BOJ] 백준 9933 민균이의비밀번호-java (0) | 2019.04.30 |
[BOJ] 백준 2583 영역구하기-java (0) | 2019.03.18 |
[BOJ] 백준 11403 경로찾기-java (1) | 2019.03.12 |
[BOJ] 백준 15954 인형들(카카오코드페스티벌)-java (1) | 2019.03.10 |