728x90
코딩테스트 지뢰찾기 문제
내 코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int count=0;
while(true){
int m = scanner.nextInt();
int n = scanner.nextInt();
if(m==0 && n==0) break;
char mines[][]= new char[m][n];
for(int i=0 ;i<m;i++){
String st= scanner.next();
for(int j=0; j<n;j++){
mines[i][j]=st.charAt(j);
}
}
count++;
System.out.println("Field #"+count+ ":");
for(int i=0; i<m;i++){
for ( int j=0; j<n; j++){
if(mines[i][j]=='*')
System.out.print('*');
else{
int mine_num=0;
for(int ii=( (i>0) ? i-1:0 ) ; ii<i+2 && ii<m ;ii++)
for(int jj= ( (j>0)? j-1:0) ; jj< j+2 && jj<n ; jj++ )
if(mines[ii][jj]=='*') mine_num+=1;
System.out.print(mine_num);
}
}
System.out.println("");
}
System.out.println("");
}
}
Code Number 9-18번째 줄.
이부분은 어렵지 않다. 이차원 동적 배열을 생성한뒤 사용자로부터 문제 포멧에 맞게 입력을 받아 minesweeper(지뢰)판을 형성한다.
🔑 Key Point 🔑
for(int i=0; i<m;i++){
for ( int j=0; j<n; j++){
if(mines[i][j]=='*'){
System.out.print('*');
}
else{
int mine_num=0;
for(int ii=( (i>0) ? i-1:0 ) ; ii<i+2 && ii<m ;ii++)
for(int jj= ( (j>0)? j-1:0) ; jj< j+2 && jj<n ; jj++ )
if(mines[ii][jj]=='*') mine_num+=1;
System.out.print(mine_num);
}
}
System.out.println("");
}
주목할 부분은 이 부분이다.
생각의 발상은 지뢰가 아닌곳을 조회하게 될때 그 곳은 중심으로 동서남북 8개 칸에 지뢰가 몇개 있는지 세어 그것을 출력하는 것이다. 즉 3x3 작은 행렬을 중심만 빼고 조회하는 것과 같다. (중심을 조회해도 상관 x)
그래서 조회하는 도중에 3x3을 조회하는 2중 for문을 다시 넣어준다.
3x3의 인덱스는 i-1 또는 j-1로 시작하면 될 것 같지만 0보다 작은 경우도 생각해야한다.
난해한것은 8개 칸을 조회하는 경우 인덱스가 0보다 작거나 m이나 n(지뢰판의 마지막수)을 넘어 서면 안된다는 것이다.
따라서 삼항연산자를 이용하여 0보다 작으면 그냥 0부터 시작하게 해준다.
그리고 중간 조건문에서 m이나 n보다 커지면 종료되게 설정해준다.
이렇게 이 작은 행렬을 조회하다 지뢰가 있으면 mine_num (지뢰 개수 저장변수) 값을 올려준다.
📌 기억해야 할 부분
3x3 작은 행렬 만들기
시작점을 3항연산자를 이용하기
728x90
반응형
'💡 CodingTest > UVa' 카테고리의 다른 글
[Java] 포커 패 Poker Hands (0) | 2020.09.11 |
---|---|
[Java] 유쾌한 점퍼 Jolly Jumper (0) | 2020.09.09 |
[Java] 3n+1 문제 : The Collatz problem (0) | 2020.09.07 |
[Java] 10진수 대 16진수 (0) | 2020.09.07 |
[Java] 글자 단어 개수 세기 (0) | 2020.09.07 |