1월 11, 2022

23.7 지뢰찾기 문 (코딩도장)

 




이 문제를 두고 이틀 정도 고민을 했습니다.

저는 재래식 문과라 무식하게 모든 경우의 수를 나눠서 모든 경우의 수의 경우의 수에 if문의 if문을 다는 식으로 접근을 했습니다

이렇게요. 
이렇게 일일이 접근하다 보니, 매번 코드를 작성하다가 내가 어디까지 왔는지 까먹어 버렸고, 매번 쓰다 지우다를 반복했습니다. 한 네번 시도해봤는데.. 사진만큼 적고나면 정신이 복잡해져서 저기서 나아갈 수가 없었습니다.

그래서 답을 봤습니다! (...?)
답을 보니 역시, 무식하게 접근하지 않는 방법이 있더군요. 


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
col,row = map(int,input().split()) #col이 가로 row가 세로

matrix = []
for i in range(row):  #세로 범위의 i에서
     matrix.append(list(input())) #matrix리스트에 입력받은 리스트를 넣어라
     #input으로 입력받은 것을 리스트로 변환하고, 그것을 matrix에 append하면 2차원 리스트가 됨


for i in range(row):
  for j in range(col):
    cnt = 0
    if matrix[i][j] == ".":       # .일 때
      for y in range(i-1,i+2):    # matrix[i][j]의 위 아래 한칸씩 범위안의
        for x in range(j-1,j+2):    #matrix[i][j]의 오른쪽,왼쪽 한칸씩 범위에서 (한마디로 둘러싼 주변에서)
          if not(y<0 or y>=row or x<0 or x>= col): #만약 이 둘러싼 x,y들이 본래 있어야 할 범위를 벗어나지 않을때
            if matrix[y][x] == "*": # 그것들이 *이라면
              cnt += 1              # cnt에 1더해줘라
      matrix[i][j] = cnt          # matrix[i][j]는 cnt할당
      print(matrix[i][j], end ="")  # 바뀐 값을 출력하는데, 줄 바뀌지 않도록 end="" 지정
    else:
      print(matrix[i][j], end ="")   # 바뀌지 않은 원래 값을 줄 바뀌지 않도록 출력
  print()                           #i안의 j 한바퀴 돌린 후마다 print()로 한줄 띄어줌

저 정신 없는 주석들은 제가 단 것입니다.. 나름 알기 쉽게 설명한다고 써봤습니다만..

제가 이해한 것을 간단하게 요약하자면

1. 2차원 리스트를 만들고

2. for range로 col, row만큼 반복하면서

3. 요소가 *인 경우 주변을 검사합니다

4. 주변 검사는 range(i-1,i+2), range(j-1,j+2)을 통해 주변 요소 8개를 탐색하면서,

5. 만약 주변요소가 (y<0 or y>=row or x<0 or x>= col) 로 리스트의 범위를 벗어난다면 그 경우를 빼고,

6. 주변요소가 *이라면 cnt에 1씩 더해주는 것입니다

7. 그리고 더해진 cnt를 값으로 바꿔준 이후 형식에 맞게 출력하면 됩니다.


코드를 보니 간단하더군요.. 주변 범위를 지정해서 예외를 제외하고 검사하는 깔끔한 방식이어서 보기도 좋습니다.

제 스스로 만들지 못해서 아쉽습니다. 다음번엔 꼭 스스로 해보죠..