728x90
문제
https://www.acmicpc.net/problem/21608
풀이 코드
구현 문제
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int n;
static int[][] board, friends;
/**
* student 번 학생의 자리를 찾는 메서드
*/
public static void solution(int student) {
int maxEmpty = 0;
int maxLike = 0;
int x = 0;
int y = 0;
/*
3. 2를 만족하는 칸도 여러 개인 경우에는 행의 번호가 가장 작은 칸으로, 그러한 칸도 여러 개이면 열의 번호가 가장 작은 칸으로 자리를 정한다.
- 3번 조건을 만족 시키기위해 i,j가 0부터 탐색하는 것이 아닌 역순으로 탐색을 진행하여 앉을 자리 위치를 찾는다.
*/
for (int i = n - 1; i >= 0; i--) {
for (int j = n - 1; j >= 0; j--) {
if (board[i][j] != 0) { //이미 누군가 앉은 자리면 넘어간다.
continue;
}
//student를 (i,j)에 배치했을 때 빈칸 개수, 좋아하는 학생 수
int empty = 0;
int like = 0;
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
if (board[nx][ny] == 0) {
empty++;
} else {
for (int l = 0; l < 4; l++) {
if (board[nx][ny] == friends[student][l]) {
like++;
}
}
}
}
}
/*
1. 비어있는 칸 중에서 좋아하는 학생이 인접한 칸에 가장 많은 칸으로 자리를 정한다.
2. 1을 만족하는 칸이 여러 개이면, 인접한 칸 중에서 비어있는 칸이 가장 많은 칸으로 자리를 정한다.
*/
if (maxLike < like || (maxLike == like && maxEmpty <= empty)) {
maxLike = like;
maxEmpty = empty;
x = i; y = j;
}
}
}
//student 번 학생의 자리는 (x,y)
board[x][y] = student;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
board = new int[n][n];
//행: 학생번호, 열: 행번호 학생이 좋아하는 학생 번호
friends = new int[n*n+1][4];
for (int i = 0; i < n * n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int student = Integer.parseInt(st.nextToken());
for (int j = 0; j < 4; j++) {
friends[student][j] = Integer.parseInt(st.nextToken());
}
solution(student);
}
//만족도 계산
int answer = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int student = board[i][j];
int count = 0;
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= n) {
continue;
}
for (int l = 0; l < 4; l++) {
if (board[nx][ny] == friends[student][l]) {
count++;
}
}
}
if (count == 1) {
answer++;
} else if (count == 2) {
answer += 10;
} else if (count == 3) {
answer += 100;
} else if (count == 4) {
answer += 1000;
}
}
}
System.out.println(answer);
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[알고리즘/백준] 14891 톱니바퀴 - 자바(Java), 삼성 SW 역량테스트, 구현 (0) | 2021.10.27 |
---|---|
[알고리즘/백준] 20055 컨베이어 벨트 위의 로봇 - 자바(Java), 삼성 SW 역량테스트, 구현 (0) | 2021.10.25 |
[알고리즘/백준] 14503 로봇 청소기 - 자바(Java), 삼성 SW 역량테스트 기출 (0) | 2021.10.20 |
[알고리즘/백준] 14500 테트로미노 - 삼성 SW 역량테스트, 자바(Java) (0) | 2021.10.18 |
[알고리즘/백준] 14502 연구소 - 자바(Java), DFS, BFS, 삼성 SW 역량테스트 기출 (0) | 2021.10.17 |
댓글