๋ฌธ์
https://www.acmicpc.net/problem/21608
๋ฌธ์ ์ดํด
- N×N ๊ต์ค์ ๋น ์ข์์ ํ์๋ค์ ์์๋๋ก ์ํ๋ค.
- ๊ฐ ํ์์ ์ข์ํ๋ 4๋ช
์ ์น๊ตฌ๊ฐ ์๊ณ , ์ข์ ๋ฐฐ์น๋ ์๋ ์ฐ์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค:
- ์ธ์ 4์นธ์ ์ข์ํ๋ ํ์์ด ๊ฐ์ฅ ๋ง์ ์๋ฆฌ
- ์ ์กฐ๊ฑด์ด ๊ฐ๋ค๋ฉด ์ธ์ ๋น์นธ์ด ๋ง์ ์๋ฆฌ
- ๊ทธ๋๋ ๊ฐ๋ค๋ฉด ํ ๋ฒํธ๊ฐ ์์ ์๋ฆฌ
- ๊ทธ๋๋ ๊ฐ๋ค๋ฉด ์ด ๋ฒํธ๊ฐ ์์ ์๋ฆฌ
- ๋ชจ๋ ํ์์ ๋ฐฐ์นํ ํ ๋ง์กฑ๋๋ฅผ ๊ณ์ฐ:
- ์ธ์ 4์นธ์ ์ข์ํ๋ ํ์ ์์ ๋ฐ๋ฅธ ์ ์ = {0, 1, 10, 100, 1000}
๊ตฌํ ํ๋ฆ
- ์
๋ ฅ
- ํ์ ๋ฐฐ์น ์์
students[] preferences: ๊ฐ ํ์ → ์ข์ํ๋ ํ์ 4๋ช (Set<Integer>)seats: ๊ต์ค ์ข์ ์ํ (N×N)
- ํ์ ๋ฐฐ์น ์์
- ๋ฐฐ์น
findSeat(student)์์ ๋ชจ๋ ๋น์นธ์ ๊ฒ์ฌํด ์ฐ์ ์์์ ๊ฐ์ฅ ๋ง๋ ์ข์์ ์ ํ- ์ ํ๋ ์ข์์ ํ์์ ์ํ
- ์ถ๋ ฅ
calcSum()์ผ๋ก ์ต์ข ๋ง์กฑ๋ ํฉ์ ๊ณ์ฐํด ์ถ๋ ฅ
ํด๋์ค/ํจ์๋ณ ์ญํ
Seat
- ์ข์ ์์น:
r,c - ์ธ์ ์ข์ํ๋ ์น๊ตฌ ์:
prefer - ์ธ์ ๋น์นธ ์:
empty - ์ ๋ ฌ(์ฐ์ ์์)์ compareTo๋ก ํํ:
if (prefer != other.prefer) return Integer.compare(other.prefer, prefer); if (empty != other.empty) return Integer.compare(other.empty, empty); if (r != other.r) return Integer.compare(r, other.r); return Integer.compare(c, other.c);
findSeat(int student)
- ๋ชจ๋ ๋น์นธ์ ์ํํ๋ฉฐ
Seat(i,j, prefer, empty)๋ฅผ ๊ณ์ฐ Comparable๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ฐ์ ์์ ๋์ ์ข์์ ์ ํํด ์ฐฉ์
findPrefer(int student, int r, int c)
- (r,c) 4๋ฐฉํฅ์ ํ์ธํ์ฌ, ๊ทธ ์นธ์ ์์์๋ ํ์์ด
student๊ฐ ์ข์ํ๋ ํ์์ด๋ฉด ์นด์ดํธ
findEmpty(int r, int c)
- (r,c) 4๋ฐฉ์ ๋น์นธ(=0) ๊ฐ์ ์นด์ดํธ
calcSum()
- ๋ชจ๋ ์นธ์ ๋ํด
findPrefer(seats[i][j], i, j)๋ฅผ ๋ค์ ๊ตฌํด ์ ์๋ก ํ์ฐ ํ ๋์
๋ณต์ก๋
- ๊ฐ ํ์์ ๋ํด N²๊ฐ์ ๋น์นธ์ ๊ฒ์ฌ, ๋น์นธ๋น 4๋ฐฉ ํ์ธ(์์)
→ ์ ์ฒด ์ฝ O(Nโด) (N ≤ 20์ด๋ผ์ ํต๊ณผ)
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static class Seat implements Comparable<Seat> {
int r, c, prefer, empty;
public Seat(int r, int c, int prefer, int empty) {
this.r = r;
this.c = c;
this.prefer = prefer;
this.empty = empty;
}
public int compareTo(Seat other) {
if (prefer != other.prefer)
return Integer.compare(other.prefer, prefer);
if (empty != other.empty)
return Integer.compare(other.empty, empty);
if (r != other.r)
return Integer.compare(r, other.r);
return Integer.compare(c, other.c);
}
}
static int n;
static int[] students;
static int[][] seats;
static Map<Integer, Set<Integer>> preferences;
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
students = new int[n * n];
seats = new int[n][n];
preferences = new HashMap<>();
for (int i = 0; i < n * n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int student = Integer.parseInt(st.nextToken());
students[i] = student;
Set<Integer> set = new HashSet<>();
for (int j = 0; j < 4; j++) {
set.add(Integer.parseInt(st.nextToken()));
}
preferences.put(student, set);
} // ์
๋ ฅ ๋
for (int i = 0; i < n * n; i++) {
findSeat(students[i]);
}
System.out.println(calcSum());
}
static void findSeat(int student) {
Seat seat = null;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (seats[i][j] > 0) // ์ด๋ฏธ ์์ ์๋ฆฌ
continue;
Seat cur = new Seat(i, j, findPrefer(student, i, j), findEmpty(i, j)); // ๋น๊ตํ ์ข์
if (seat == null)
seat = cur;
if (seat.compareTo(cur) > 0) {
seat = cur;
}
}
}
seats[seat.r][seat.c] = student;
}
static int findPrefer(int student, int r, int c) {
int cnt = 0;
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= n)
continue;
if (preferences.get(student).contains(seats[nr][nc]))
cnt++;
}
return cnt;
}
static int findEmpty(int r, int c) {
int cnt = 0;
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= n)
continue;
if (seats[nr][nc] == 0)
cnt++;
}
return cnt;
}
static int calcSum() {
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ans += Math.pow(10, findPrefer(seats[i][j], i, j) - 1);
}
}
return ans;
}
}'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 18808. ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2025.11.08 |
|---|---|
| [BOJ][Java] 11437. LCA (0) | 2025.10.28 |
| [BOJ][Java] 20056. ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2025.10.15 |
| [BOJ][Java] 16236. ์๊ธฐ ์์ด (0) | 2025.10.01 |
| [BOJ][Java] 2533. ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2025.09.24 |