728x90
반응형
2024.11.20기준 - 브론즈1
728x90
백준, BEAKJOON, BOJ, JAVA, 자바
🟥 풀이
이 문제는 주어진 4줄에는 키보드의 배열이 입력되며 마지막 5번째 줄에서 메모장에 입력된 키의 배열이 입력됩니다.
메모장에 입력된 키의 배열을 보고 어디를 샷건을 쳤는지 출력하는 문제입니다.
문제 접근
- 우선 키보드의 배열을 저장합니다.
- 저장 후 메모장에 입력된 키를 boolean[][]을 이용하여 체크해줍니다.
- 상하좌우, 대각선의 값을 확인해야되기 때문에, 행, 열 모두 1번쨰와 마지막을 제외하고 체크해줍니다.
1. 계산에 필요한 값들을 선언하며 키보드 배열을 입력해줍니다.
static boolean[][] visit; // 메모장에 입력된 키 체크
static int[] dx = {-1, 0, 1, -1, 0, 1, -1, 0, 1}; // 대각선, 상하좌우 를 이동하는 x좌표
static int[] dy = {-1, -1, -1, 0, 0, 0, 1, 1, 1}; // 대각선, 상하좌우 를 이동하는 y좌표
char[][] key = new char[4][10];
visit = new boolean[4][10];
for (int i = 0; i < 4; i++) {
key[i] = br.readLine().toCharArray();
}
2. 메모장에 입력된 키를 입력받고, 키보드 배열의 체크 여부를 확인해줍니다.
char[] str = br.readLine().toCharArray();
boolean check; // visit 체크 여부
for (int i = 0; i < 9; i++) {
check = false;
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 10; k++) {
if (key[j][k] == str[i]) { // 메모장에 입력된 값이면 체크
visit[j][k] = true;
check = true;
break;
}
}
// 이미 체크가 되었다면 break
if (check) {
break;
}
}
}
3. 메소드를 선언하여 상하좌우, 대각선이 모두 메모장에 입력되어 있는지 체크를 해줍니다.
// 상하좌우, 대각선의 키들이 메모장에 입력되었는지 검증하는 메소드
private static boolean exploration (int y, int x) {
boolean check = true;
for (int i = 0; i < 9; i++) {
if (!visit[y + dy[i]][x + dx[i]]) {
check = false;
break;
}
}
return check;
}
char result = ' ';
for (int i = 1; i < 3; i++) {
for (int j = 1; j < 9; j++) {
if (exploration(i, j)) {
result = key[i][j];
break;
}
}
// 해당하는 키를 찾았다면 break
if (result != ' ') {
break;
}
}
샷건을 치면 샷건을 친 키의 위치에서 행과 열이 최소 -1에서 최대 +1까지 가능하기 때문에 반복문의 시작을 1부터 마지막보다 -1한 수를 반복문을 돌려줍니다.
🟪 코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static boolean[][] visit; // 메모장에 입력된 키 체크
static int[] dx = {-1, 0, 1, -1, 0, 1, -1, 0, 1}; // 대각선, 상하좌우 를 이동하는 x좌표
static int[] dy = {-1, -1, -1, 0, 0, 0, 1, 1, 1}; // 대각선, 상하좌우 를 이동하는 y좌표
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
char[][] key = new char[4][10];
visit = new boolean[4][10];
for (int i = 0; i < 4; i++) {
key[i] = br.readLine().toCharArray();
}
char[] str = br.readLine().toCharArray();
boolean check; // visit 체크 여부
for (int i = 0; i < 9; i++) {
check = false;
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 10; k++) {
if (key[j][k] == str[i]) { // 메모장에 입력된 값이면 체크
visit[j][k] = true;
check = true;
break;
}
}
// 이미 체크가 되었다면 break
if (check) {
break;
}
}
}
char result = ' ';
for (int i = 1; i < 3; i++) {
for (int j = 1; j < 9; j++) {
if (exploration(i, j)) {
result = key[i][j];
break;
}
}
// 해당하는 키를 찾았다면 break
if (result != ' ') {
break;
}
}
bw.write(result);
bw.flush();
bw.close();
br.close();
}
// 상하좌우, 대각선의 키들이 메모장에 입력되었는지 검증하는 메소드
private static boolean exploration (int y, int x) {
boolean check = true;
for (int i = 0; i < 9; i++) {
if (!visit[y + dy[i]][x + dx[i]]) {
check = false;
break;
}
}
return check;
}
}
BEAKJOON / 백준 - JAVA 32371번 샷건
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 2714번 문자를 받은 승환이 (0) | 2024.11.22 |
---|---|
BEAKJOON / 백준 - JAVA 32290번 MEX vs OR (0) | 2024.11.21 |
BEAKJOON / 백준 - JAVA 32215번 코드마스터 2024 (0) | 2024.11.19 |
BEAKJOON / 백준 - JAVA 32209번 다음 달에 봐요 (0) | 2024.11.18 |
BEAKJOON / 백준 - JAVA 32158번 SWAPC (0) | 2024.11.17 |