Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Mine Sweeper
지뢰 청소 지뢰 찾기
유명한 지뢰찾기 게임은 어떠한 판에 지뢰가 있고, 그 지뢰를 피해서 지뢰의 위치를 추측해가며 해결해나가는 게임이다.
보통 그림과 같이 숫자들의 의미는 주변에 지뢰가 있는지 없는지 판단해주는 숫자들이다.
지뢰를 포함하고 있으면 false를 안가지고 있다면 true를 표현을 해준다.
저번 문제 Box blur와 어찌보면 비슷하다고 할수 있다.
일단 답안을 볼까요.
int[][] minesweeper(boolean[][] matrix) {
int [] [] check = new int [matrix.length][] ;
for(int a =0; a < matrix.length; a++){
check[a] = new int[matrix[0].length];
for(int b =0; b < matrix[0].length; b++){
for(int x = a-1; x <= a+1; x++){
for(int y = b-1; y <= b+1; y++){
if(x == a && y == b)
continue;
else{
try{
if(matrix[x][y]) check[a][b] += 1;
}catch(Exception ex){
}
}
}
}
}
}
return check;
}
무한의 For반복문이 보이는데요,,,
일단은 볼께요.
일단 지뢰밭을 다시 숫자로 확인해줄 check 다중배열을 선언해줍니다.
int [] [] check = new int [matrix.length][matrix[0].length] ;
일단 행과 열의 크기를 설정해주고 시작합니다. (반복문안에 넣어도 되긴합니다. 위에 최초 답같이...)
그리고 반복문을 통해서 주변 값들을 분석해줄 로직을 설정해줍니다.
for(int x = a-1; x <= a+1; x++){
for(int y = b-1; y <= b+1; y++){
...........
}
}
이렇게 해주면, test1을 가정했을때,
a = 0 , 1, 2 까지가 가능합니다. 그리고 b = 0, 1, 2 가 됩니다.
그리고 위의 반복문을 봤을때, x = -1, 0, 1, 2, 3까지가 범위가 됩니다. 물론 -1은 생략되겠죠.
이런식으로 b 와 y 도 같은 범위가 설정됩니다.
그리고 나서 조건문을 통해서 값들의 수를 체크해줍니다.
if(x == a && y == b)
continue;
else{
try{
if(matrix[x][y]) check[a][b] += 1;
.....
}catch(Exception ex){
.....
}
x 와 a 그리고 y 와 b 가 둘다 같다면 계속 진행하여 a++ 하여 다시 진행하고,, 또 다시 진행되고 .. 이런식으로 쫘악 다
분석해주는 겁니다.
역시나 설명하는게 더 힘들군용
그림으로 ...
test 3을 가정해서 볼께요
matrix는 위와 같습니다.
그렇다면 아래의 output으로 나와야 하는데 어떻게 계산이 되는걸까요?
이렇게 표로 배열을 나타내 볼께요.
이 표를 봤을때,
처음에 나온 true의 위치는 matrix[0][0] 입니다. 그렇죠?
이 위치의 output 위치는
check[0][0] 이고요.
답안에서 check[0][0] = 0 입니다.
확인되시나요? 어떻게 0이 놔았느냐.
이런식으로 계산이 된것입니다. 상하좌우대각선 다 보았을때,
true가 있으면 1로 측정되어 Check[0][0] 자리에 축적되고 그외에 false 의 경우는 0으로 측정되어 쌓이게 됩니다.
그렇다면,
matrix[1][2] = true 가 보이시나요?
이부분은 어떻게 check 값이 3 입니다.
이 부분은 이런식으로 계산이 된다는 것이죠..
조금 이해가 되시나요?
true는 1 ,
false는 0 으로 계산되어
해당 위치에 더하여 축적해주면 되는 겁니다.
check[1][2] 의 경우에는 사방으로 봤을때, true가 총 3개가 있는 것이죠.
바로 이런식으로 지뢰찾기의 게임이 원리가 돌아가는 것이라고 보면 됩니다.
또한 그 과정을 표현해주는 코드가 바로 이것이죠.. 심오하지만 간단합니다.
for(int a =0; a < matrix.length; a++){
for(int b =0; b < matrix[0].length; b++){
for(int x = a-1; x <= a+1; x++){
for(int y = b-1; y <= b+1; y++){
if(x == a && y == b)
continue;
else{
try{
if(matrix[x][y]) check[a][b] += 1;
}catch(Exception ex){
}
}
}
}
}
}
a b x y 이렇게 네가지의 변수들을 통해서 이러한 계산이 되는 겁니다. 물론 0과 1로 하는 것이기때문에 간단하게 적힌거라고 생각합니다. ㅎㅎ
아무튼 이렇게 하면 해결이 되었는데요.
앨리트 분들의 코드를 한번 참고해볼까요?
먼저 JAVA
int[][] minesweeper(boolean[][] matrix) {
int[][] m = new int[matrix.length][];
for(int i=0; i<matrix.length; i++)
m[i] = new int [matrix[i].length];
for(int i=0; i<matrix.length; i++)
for(int j=0; j<matrix[0].length; j++){
for(int k=i-1; k<i+2; k++)
for(int l=j-1; l<j+2; l++)
if(k>=0 && k<matrix.length && l>=0 && l<matrix[i].length &&
!(k==i && j==l) && matrix[k][l])
m[i][j]++;
}
return m;
}
별 다를게 없는 자바의 수듄.. 극혐입니다.
조건문 빼고는 거의 방식이 같은거 같군요. 뭐 아무튼 패스...
다음은 Java script 입니다.
const directions = [
[ 1,-1], [ 1, 0], [ 1, 1],
[ 0,-1], [ 0, 1],
[-1,-1], [-1, 0], [-1, 1]
];
minesweeper = matrix => matrix.map((row, y) =>
row.map((col, x) => directions.reduce((count, i) =>
count += !!(matrix[y + i[0]] && matrix[y + i[0]][x + i[1]]), 0)));
충격의 도가니... 언젠간 이런 코드도 손쉽게 볼날이 오길...
다음은 파이썬! Python3
def minesweeper(matrix):
r = []
for i in range(len(matrix)):
r.append([])
for j in range(len(matrix[0])):
l = -matrix[i][j]
for x in [-1,0,1]:
for y in [-1,0,1]:
if 0<=i+x<len(matrix) and 0<=j+y<len(matrix[0]):
l += matrix[i+x][j+y]
r[i].append(l)
return r
역시 파이썬... 깔끔하네요..
하지만 전체적인 내용과 풀어가는 과정은 비슷하군요. 다행입니다.. 나만이렇게 생각한게 아니였어...
그렇지만 더 깔끔하고 가독성이 뛰어난건 인정합니다. 파이썬.. 흐엉 빨리 공부해야하는데.. 걱정이에요..
'Algorithm > Java' 카테고리의 다른 글
#25_Code Signal Arcade >> Array Replace (0) | 2019.11.28 |
---|---|
#23_Code Signal Arcade >> Box Blur (0) | 2019.11.26 |
#22_Code Signal Arcade >> Avoid Obstacles (0) | 2019.11.25 |