일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 데이터프로그래밍
- 토이프로젝트
- 스파크
- 코딩테스트
- 알고리즘
- 파이썬
- MySQL
- 데이터베이스
- 기초
- 스프링부트
- SQL 문법
- 모의해킹
- 빅데이터
- 이클립스
- 오라클
- 백준
- 프로그래밍
- 리눅스마스터 2급 2차
- SQL
- 문제풀이
- 엘라스틱서치
- SQL 정리
- 위클리챌린지
- 자바
- 프로그래머스
- 문법
- 필기
- 스프링
- 해킹실습
- c언어
- Today
- Total
개발일기
백준 4108번 JAVA 풀이 - 지뢰찾기 본문
문제 링크 : https://www.acmicpc.net/problem/4108
4108번: 지뢰찾기
C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다. 문자 사이에 공백이나 줄 사이에 공백 줄이 있어선
www.acmicpc.net
07년 개봉한 영화 '지뢰찾기'는 지뢰의 수를 조사해야하는 요원 예슬의 이야기를 다룬 영화다.
정보기관의 요원이었던 예슬은 심심해서 컴퓨터로 지뢰찾기를 켰다가 인사팀에 걸려 지뢰제거팀으로 좌천된다. 좌천된 예슬에게 처음 부여된 임무는 지뢰 제거도 아닌 지뢰 수 조사!
예슬의 첫 임무에서 교육요원으로 배정된 다민은 "처음 건 무조건 안 터져." 라고 말하며 거침없이 땅을 팠지만 지뢰가 터져 얄짤없이 사망하고 만다. 지뢰 밭에 혼자 남겨진 예슬! 과연 임무를 마치고 안전하게 돌아갈 수 있을 것인가!
지뢰밭은 R X C개의 칸으로 이루어져있다.
예슬이 발을 딛는 구역 중에서 일부 칸에는 지뢰가 들어있고 나머지는 모두 비어있다. 예슬은 모든 비어있는 칸마다 인접해 있는 지뢰의 개수를 세서 적어야 한다.
선이나 점을 공유하고 있는 두개의 칸을 인접해있다고 정의한다. 즉, 모든 칸은 최대 8개의 인접한 칸을 갖고 있다. (상, 하, 좌, 우, 4개의 대각선칸)
입력
여러 개의 테스트 케이스가 제공된다.
각 테스트 케이스의 첫 번째 줄에는 행과 열의 수를 표현하는 두 개의 정수 R,C가 입력된다. (1 ≤ R,C ≤ 100)
이후 입력되는 R개의 줄은 C개의 문자로 이루어져있다. 각 문자는 지뢰를 표현하는 '*'과 빈 공간을 표현하는 '.' 이다.
0 0이 입력되면 종료된다.
출력
C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다.
문자 사이에 공백이나 줄 사이에 공백 줄이 있어선 안 된다.

# 문제 풀이
'.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력하면 된다. 이때 두가지의 방법이 있다.
'.' 을 기준으로 인접한 칸에 지뢰가 있으면 1증가
또는 '*' 지뢰를 기준으로 인접한 칸의 모든 수를 1 증가가 있다.
어짜피 모든 공간을 탐색해야 하고 본인을 기준으로 인접한 칸을 둘러보기 때문에 첫 번째 방법을 택했다.
1. x의 길이와 y의 길이를 입력받는다. 만약 둘다 0이면 return을 통해 프로그램을 종료한다.
int y = sc.nextInt();
int x = sc.nextInt();
if(x == 0 && y == 0) return;
2. 입력받은 x, y를 2차원 배열로 만들고 '.' 또는 '*' 를 입력 받은대로 배열에 넣는다.
이때 y가 세로 x를 가로로 만들어 주기 위해 2차원 배열 선언시 [x][y] 가 아닌 [y][x]로 만들어준다.
char[][] arrs = new char[y][x];
for(int i = 0; i < y; i++){
arrs[i] = sc.next().toCharArray();
}
3. 2중 for문을 통해 모든 좌표를 탐색하면서 지뢰가 아닐 경우 checkQ함수를 실행 본인 주위에 지뢰가 몇개 있는지 파악하고 '.' 의 값을 인접한 지뢰의 갯수로 변경한다.
for(int i = 0; i < y; i++){
for(int j = 0; j < x; j++){
if(arrs[i][j] != '*'){
arrs[i][j] = (char)(checkQ(arrs, i, j) + '0');
}
}
//System.out.println();
}
이때 checkQ 함수의 return 값 형태는 int 형이기 때문에 '0' 를 더해준 후 char 형으로 형변환을 해주어야 문자 형태로 숫자가 찍히게 된다.
4. checkQ 함수는 각 좌표별로 x좌표의 시작과 끝, y좌표의 시작과 끝을 정한 후 반복문을 통해 지뢰가 있는지 없는지 판단한다.
int startx = (x - 1 < 0) ? 0 : x - 1;
int starty = (y - 1 < 0) ? 0 : y - 1;
int endx = (x + 1 == arrs[0].length) ? arrs[0].length - 1 : x + 1;
int endy = (y + 1 == arrs.length) ? arrs.length - 1 : y + 1;
int count = 0;
for(int i = starty; i <= endy; i++){
for(int j = startx; j <= endx; j++){
if(arrs[i][j] == '*') count++;
}
}
//System.out.println("count : " + count);
return count;
# 0, 0 기준으로는 [0, 0] [1, 0] [1, 1] [0, 1] 이렇게 4개의 좌표만 체크해야 한다.
# 전체 코드
import java.util.*;
public class Main_4108{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(true){
int y = sc.nextInt();
int x = sc.nextInt();
if(x == 0 && y == 0) return;
char[][] arrs = new char[y][x];
for(int i = 0; i < y; i++){
arrs[i] = sc.next().toCharArray();
}
for(int i = 0; i < y; i++){
for(int j = 0; j < x; j++){
if(arrs[i][j] != '*'){
arrs[i][j] = (char)(checkQ(arrs, i, j) + '0');
}
}
//System.out.println();
}
for(int i = 0; i < y; i++){
for(int j = 0; j < x; j++){
System.out.print(arrs[i][j]);
}
System.out.println();
}
//System.out.println("arrs length : " + arrs[0].length);
//System.out.println("arrs : " + arrs[2][1]);
}
}
static int checkQ(char[][] arrs, int y, int x){
int startx = (x - 1 < 0) ? 0 : x - 1;
int starty = (y - 1 < 0) ? 0 : y - 1;
int endx = (x + 1 == arrs[0].length) ? arrs[0].length - 1 : x + 1;
int endy = (y + 1 == arrs.length) ? arrs.length - 1 : y + 1;
int count = 0;
for(int i = starty; i <= endy; i++){
for(int j = startx; j <= endx; j++){
if(arrs[i][j] == '*') count++;
}
}
//System.out.println("count : " + count);
return count;
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 4673번 JAVA 풀이 - 셀프 넘버 (0) | 2022.06.10 |
---|---|
백준 8979번 JAVA 풀이 - 올림픽 (0) | 2022.06.08 |
백준 2822번 JAVA 풀이 - 점수 계산 (0) | 2022.06.06 |
백준 2246번 JAVA 풀이 - 콘도 선정 (2) | 2022.06.05 |
백준 1969번 JAVA 풀이 - DNA (0) | 2022.06.04 |