728x90
반응형
2024.06.16기준 - 실버5
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 입력된 격자판에서 8방향(오른쪽, 왼쪽, 위, 아래, 위왼쪽, 위오른쪽, 아래왼쪽, 아래오른쪽)으로 나열되어 있는 MOBIS를 찾는 문제입니다.
저의 접근은
- 8방향이지만 MOBIS를 SIBOM와 같이 찾으면 8방향이 아니라 4방향만 찾아도 모든 방향을 다 찾을 수 있다고 생각했습니다.
- 위쪽, 오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선, 아래쪽 으로 총 4가지를 찾아주는 방식으로 접근했습니다.
- 함수를 2개를 만들어 MOBIS를 찾는 함수와 SIBOM를 찾는 함수를 생성했습니다.
- 입력 받은 격자판에 첫번째 글자가 M 또는 S가 들어온다면 해당하는 단어에 맞는 함수를 실행해 4방향을 검토하는 방식으로 총 개수를 새어주었습니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static int n, count = 0;
static int[] rx = {1, 2, 3, 4};
static int[] uy = {-1, -2, -3, -4};
static int[] dy = {1, 2, 3, 4};
static char[] mobis = {'O', 'B', 'I', 'S'};
static char[] sibom = {'I', 'B', 'O', 'M'};
static char[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine()); // 격자의 크기
String s;
map = new char[n][n];
for (int i = 0; i < n; i++) {
s = br.readLine();
for (int j = 0; j < n; j++) {
map[i][j] = s.charAt(j);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] == 'M') {
mobis(i, j);
} else if (map[i][j] == 'S') {
sibom(i, j);
}
}
}
bw.write(Integer.toString(count));
bw.flush();
bw.close();
br.close();
}
private static void mobis(int y, int x) {
int index = 0;
int nowy = y;
int nowx = x;
int nexty, nextx;
// 오른쪽 위
for (int i = 0; i < 4; i++) {
nexty = nowy + uy[i];
nextx = nowx + rx[i];
if (check(nexty, nextx) && map[nexty][nextx] == mobis[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
// 오른쪽
index = 0;
for (int i = 0; i < 4; i++) {
nextx = nowx + rx[i];
if (check(nowy, nextx) && map[nowy][nextx] == mobis[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
// 오른쪽 아래
index = 0;
for (int i = 0; i < 4; i++) {
nexty = nowy + dy[i];
nextx = nowx + rx[i];
if (check(nexty, nextx) && map[nexty][nextx] == mobis[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
// 아래
index = 0;
for (int i = 0; i < 4; i++) {
nexty = nowy + dy[i];
if (check(nexty, nowx) && map[nexty][nowx] == mobis[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
}
private static void sibom(int y, int x) {
int index = 0;
int nowy = y;
int nowx = x;
int nexty, nextx;
// 오른쪽 위
for (int i = 0; i < 4; i++) {
nexty = nowy + uy[i];
nextx = nowx + rx[i];
if (check(nexty, nextx) && map[nexty][nextx] == sibom[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
// 오른쪽
index = 0;
for (int i = 0; i < 4; i++) {
nextx = nowx + rx[i];
if (check(nowy, nextx) && map[nowy][nextx] == sibom[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
// 오른쪽 아래
index = 0;
for (int i = 0; i < 4; i++) {
nexty = nowy + dy[i];
nextx = nowx + rx[i];
if (check(nexty, nextx) && map[nexty][nextx] == sibom[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
// 아래
index = 0;
for (int i = 0; i < 4; i++) {
nexty = nowy + dy[i];
if (check(nexty, nowx) && map[nexty][nowx] == sibom[index]) {
index++;
if (index == 4) {
count++;
}
} else {
break;
}
}
}
// 격자판 안에 있는지 체크하는 함수
private static boolean check(int y, int x) {
return y >= 0 && x >= 0 && y < n && x < n;
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31908번 커플링 매치 (0) | 2024.06.18 |
---|---|
BAEKJOON / 백준 - JAVA 31925번 APC2shake! (0) | 2024.06.17 |
BAEKJOON / 백준 - JAVA 31883번 FA수의 진 (2) | 2024.06.14 |
BAEKJOON / 백준 - JAVA 31884번 Stacking Sticks (0) | 2024.06.12 |
BAEKJOON / 백준 - JAVA 31882번 근수 (2) | 2024.06.10 |