티스토리 뷰
문제
문제를 간략히 설명하면 다음과 같다.
선생님이 정한 학생의 순서와 각 학생이 좋아하는 학생에 대한 정보가 주어진다.
한 칸에는 학생 한 명의 자리만 있을 수 있고, | r1 - c1 | + | c1 - c2 | = 1을 만족하는 두 칸 (r1, c1)과 (r2, c2)를 인접하다고 한다.
즉, 상하좌우칸을 인접하다고 말하는 것이다.
학생의 자리를 정할 때는 지켜야 하는 규칙이 있다.
- 비어있는 칸 중에서 좋아하는 학생이 인접한 칸에 가장 많은 칸으로 자리를 정한다.
- 1을 만족하는 칸이 여러 개이면, 인접한 칸 중에서 비어있는 칸이 가장 많은 칸으로 자리를 정한다.
- 2를 만족하는 칸도 여러 개인 경우에는 행의 번호가 가장 작은 칸으로, 그러한 칸도 여러 개이면 열의 번호가 가장 작은 칸으로 자리를 정한다.
위 규칙을 만족하는 자리에 학생들을 배치한 후 학생의 만족도를 구하기 위해 학생과 인접한 칸에 앉은 좋아하는 학생의 수를 알아야 한다.
그 값이 0이면 학생의 만족도는 0, 1이면 1, 2이면 10, 3이면 100, 4이면 1000이다.
문제풀이
1. 비어있는 칸 구하기
먼저 main 함수를 살펴보자.
- num : 학생의 순서를 저장하는 배열
- info : 각 학생이 좋아하는 학생 정보를 저장하는 배열
- student : 학생들의 자리 배치 정보
- empty : 비어있는 칸을 저장하는 배열
배열 세팅이 끝났으면 제일 먼저 비어있는 칸의 수를 구한다. (init 함수)
그런 다음 정해진 순서에 따라 조건에 맞는 자리를 찾은 후 학생을 배치하고 student 배열과 empty 배열에 학생을 배치했다는 표시를 해준다.
그리고 그 자리와 인접한 자리의 비어있는 칸 수를 감소시킨다.
init 함수를 통해 비어있는 칸을 구한다.
처음에는 4로 초기화하고 상하좌우 중에 벽이 있다면 비어있는 칸 수를 감소시킨다.
2. 자리 배치
(0, 0)부터 (n - 1, n -1)까지 학생이 배치되지 않은 자리, 즉 student[i][j]가 0인 자리를 확인한다.
현재 자리를 배치하려는 학생이 좋아하는 학생이 인접한 칸에 몇 명 있는지를 구하고 최댓값을 찾는다.
현재 칸에서 구한 좋아하는 학생 수가 최댓값과 같으면 후보 자리를 저장하는 list에 추가를 해주고 최댓값보다 크면 list를 비우고 최댓값을 갱신시킨다.
후보가 되는 자리를 모두 찾았다면 규칙을 만족하는 자리를 찾아야 한다.
1번 규칙을 만족하는 자리가 여러 개라면 인접한 칸 중에서 비어있는 칸의 수가 가장 많은 칸을 찾아야 하므로 empty 배열 값에 대해 내림차순으로 정렬해준다.
sortWith는 stable sort이고 자리를 찾을 때 행이 작은 순, 열이 작은 순으로 찾았기 때문에 3번 조건은 이미 만족되었다.
정렬 후 첫번째 자리가 바로 해당 학생이 앉을 자리가 된다.
3. 만족도 구하기
자리 배치가 모두 끝난 후에 각 칸의 학생과 인접한 칸에 앉은 좋아하는 학생의 수를 구하고 만족도를 계산해준다.
Kotlin 전체 코드
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ 20922] 겹치는 건 싫어 C++/Kotlin (0) | 2021.08.30 |
---|---|
[BOJ 2589] 보물섬 C++/Kotlin (0) | 2021.08.12 |
[BOJ 1012] 유기농 배추 C++/Kotlin (0) | 2021.08.12 |
[BOJ 7576] 토마토 C++/Kotlin (0) | 2021.08.12 |
[BOJ 17298] 오큰수 C++/Kotlin (0) | 2021.07.30 |
- Total
- Today
- Yesterday
- 프로그래머스
- 그래프
- dfs
- 분할 정복
- 투 포인터
- Two Pointer
- Java
- 두 포인터
- 알고리즘
- C++
- 위상 정렬
- 트리
- 배열
- 스택
- BFS
- 구현
- 이분 탐색
- 문자열
- Kotlin
- algorithm
- SWEA
- 자바
- programmers
- 재귀
- BOJ
- SW Expert Academy
- 브루트포스
- 백준
- 큐
- 정렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |