표준 입력으로 2차원 리스트의 가로(col)와 세로(row)가 입력되고 그 다음 줄부터 리스트의 요소로 들어갈 문자가 입력됩니다. 이때 2차원 리스트 안에서 *는 지뢰이고 .은 지뢰가 아닙니다. 지뢰가 아닌 요소에는 인접한 지뢰의 개수를 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다).
여러 줄을 입력 받으려면 다음과 같이 for 반복문에서 input을 호출한 뒤 append로 각 줄을 추가하면 됩니다(list 안에 문자열을 넣으면 문자열이 문자 리스트로 변환됩니다).
matrix = []
for i in range(row):
matrix.append(list(input()))
#입력
3 3
.**
*..
.*.
#결과
2**
*43
2*1
#입력
5 5
..*..
...*.
.*...
.***.
*.*..
#결과
01*21
123*1
2*532
3***1
*4*31
정답 :
col,row = map(int,input().split())
matrix = []
for i in range(row):
matrix.append(list(input()))
for i in range(row):
for j in range(col):
if matrix[i][j] == '*':
continue
else:
matrix[i][j] = 0
for y in range(i-1,i+2):
for x in range(j-1,j+2):
if y < 0 or x < 0 or col <= x or row <= y:
continue
elif matrix[y][x] == '*':
matrix[i][j] += 1
for i in range(row):
for j in range(col):
print(matrix[i][j],end='')
print()
첫번째 코드
col,row = map(int,input().split()) # 첫 입력값으로 가로와 세로의 값을 구한다
matrix = [] # matrix라는 빈 리스트를 생성
for i in range(row): # 입력값 row 세로의 수 만큼 리스트를 반복
matrix.append(list(input()))
#input()을 통해 새 입력값을 받는다 이때 list()때문에 입력값들은 list로 변환된다.
#초기 입력값
5 5 # col,row = map(int,input().split()) 의 입력값이다.
..*.. # matrix.append(list(input())) 의 입력값이다
...*. # 이때 상위에 for i in range(row)가 있기때문에 입력횟수는 row만큼 으로 정해진다.
.*...
.***.
*.*..
먼저 가장 첫 코드이다.
이코드는 지뢰찾기에 지뢰가 어디있는지를 정하는 값이다.
'.'은 지뢰가 없는곳 '*'은 지뢰이다.
가장 첫 입력값을 제외한 나머지 입력값의 갯수는 (세로줄수) row에 의해 결정된다
위에 코드를 완성 시킨다면 이런 리스트가 만들어진다.
[['.','.','*','.','.'],['.','.','.','*','.'],
['.','*','.','.','.'],['.','*','*','*','.'],['*','.','*','.','.']]
#가독성을 위해 세로로 배열한다면
[['.','.','*','.','.'],
['.','.','.','*','.'],
['.','*','.','.','.'],
['.','*','*','*','.'],
['*','.','*','.','.']]
..*..이 ['.','.','*','.','.'] 리스트로 만들어 진것을 볼 수 있다. list() 함수때문이다.
두번째코드
아래 코드는 이전에 입력되었던 값을 정수 0 과 '*'로 변환하는 코드이다.
for i in range(row):
for j in range(col):
if matrix[i][j] == '*': # 2차원 리스트이기에 변수[i][j]로 접근
continue #'*'일시 아무일도 일어나지 않고 반복문 진행
else:
matrix[i][j] = 0 #'*' 이 아닐시 즉,'.' 일때 0으로 변환
결과
[[0,0,'*',0,0],
[0,0,0,'*',0],
[0,'*',0,0,0],
[0,0,'*','*',0],
['*',0,'*',0,0]]
세번째 코드
#이제 지뢰찾기에서 한칸 눌렀을때 주변에 지뢰가 몇개있는지를 확인하는것을 만들어야 한다.
for y in range(i-1,i+2): #range()는 목표값 이전까지만 반복되기에 +2를 해준다.
for x in range(j-1,j+2):
if y < 0 or x < 0 or col <= x or row <= y:
continue
#y값과 x값이 음수가 된다면 뒤에서 부터 계산하기에 음수가 되지않게 설정
#col row 보다 커진다면 index범위를 벗어나기에 col,row보다 작게 설정
elif matrix[y][x] == '*':
matrix[i][j] += 1
#y값과 x값은 (i or j -1, i or j +2)만큼 계속반복된다.
#matrix[1][1]의 값은
#matrix[0][0],matrix[0][1],matrix[0][2]
#matrix[1][0],matrix[1][1],matrix[1][2]
#matirx[2][0],matrix[2][1],matrix[2][2]
#를 반복하면서 '*' 존재 할때마다 0에서 +1이 된다.
위 코드의 상위코드에는
if matrix[i][j] == '*':
continue
라는 코드가 이미 존재하기에 '*' 코드는 아무런 변화 없이 0인 코드에만 적용된다.
결과:
[[0, 1, '*', 2, 1],
[1, 2, 3, '*', 1],
[2, '*', 5, 3, 2],
[3, '*', '*', '*', 1],
['*', 4, '*', 3, 1]]
마지막 코드
먼저 아래의 코드는 위에의 코드와 별개의 코드이다
상위 반복문이 존재 하지 않는다.
단순히 matrix[][]를 이용해 matrix의 값을 가져올 뿐이다.
for i in range(row):
for j in range(col):
print(matrix[i][j],end='')
print()
위 코드의 결과는 가로와 세로가 이미 row 와 col 만큼 정해져있다.그렇기에 i 와 j 값은 row,col로 반복해서 구할 수 있다.
위코드는 이미 완성된 지뢰찾기 변수 matrix 를 리스트형식이 아닌 str과 int로 출력하는 코드이다.
결과:
01*21
123*1
2*532
3***1
*4*31
오류
col,row = map(int,input().split())
matrix = []
for i in range(row):
matrix.append(list(input()))
for i in range(row):
for j in range(col):
if matrix[i][j] == '*':
continue
else:
matrix[i][j] = 0
for y in range(i-1,i+2):
for x in range(j-1,j+2):
if y < 0 or x < 0 or col <= x or row <= y:
continue
elif matrix[y][x] == '*':
matrix[i][j] += 1
#오류코드 출력값
[[0, 0, '*', 0, 0],
[0, 0, 0, '*', 0],
[0, '*', 0, 0, 0],
[0, '*', '*', '*', 0],
['*', 0, '*', 0, 1]]
#정답코드 출력값
[[0, 1, '*', 2, 1],
[1, 2, 3, '*', 1],
[2, '*', 5, 3, 2],
[3, '*', '*', '*', 1],
['*', 4, '*', 3, 1]]
위코드에서 for y in range(i-1,i+2): (이하생략)코드는 윗쪽 코드와 분리 되어있다.
코드의 흐름을 보면 윗쪽 코드로 인해 matrix라는 리스트는 이미 만들어 졌고 '.'을 0으로 이 미 만들어 졌다.
근데 오류코드의 마지막 matrix[4][4]의 값은 1이 되었다 왜 그런지 알아보자
col,row = map(int,input().split())
matrix = []
for i in range(row):
matrix.append(list(input()))
for i in range(row):
for j in range(col):
if matrix[i][j] == '*':
continue
else:
matrix[i][j] = 0
i
4
j
4
첫 반복문이 끝나고 i와 j의 값을 구하면 각각 4이다.
결국 첫 반복문이 끝나고 i 와 j의 값은 반복문의 마지막값 4,4로 정해지고 더이상 반복하지 않고 코드가 종료되었다.
for y in range(i-1,i+2):
for x in range(j-1,j+2):
if y < 0 or x < 0 or col <= x or row <= y:
continue
elif matrix[y][x] == '*':
matrix[i][j] += 1
#위 코드는 결국
for y in range(4-1,4+2):
for x in range(4-1,4+2):
if y < 0 or x < 0 or col <= x or row <= y:
continue
elif matrix[y][x] == '*':
matrix[4][4] += 1
#이런 코드가 되는것이다.
col,row = map(int,input().split())
matrix = []
for i in range(row):
matrix.append(list(input()))
for i in range(row):
for j in range(col):
if matrix[i][j] == '*':
continue
else:
matrix[i][j] = 0
for y in range(i-1,i+2):
for x in range(j-1,j+2):
if y < 0 or x < 0 or col <= x or row <= y:
continue
else: #수정된 코드
matrix[i][j] = matrix[y][x].count('*')
위 코드의 결과는
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
matrix[y][x].count('*')
AttributeError: 'int' object has no attribute 'count'
이런 오류 문구가 나온다. 이유는 간단하다.
.count 메소드는 리스트나 튜플같은 시퀸스 객체의 메소드다.
하지만 matrix[y][x]는 리스트 내부의 특정 요소를 선택한것이다.
matrix[y]를 한다면 내부에 리스트가 더 존재하기에 사용이 가능하지만.
matrix[y][x]는 요소를 특정하기에 리스트가 아니게된다. 결국 사용할 수 없다고 나오는것이고
위의 코드의 경우에 첫요소가 '*'이 아닌 정수 0 이기에 int오브젝트는 사용할 수 없다고 나오는 것 이다.
'Python > Python 문제' 카테고리의 다른 글
(3)별로 사각형 간단하게 그리기 (0) | 2022.05.06 |
---|---|
(2)포켓몬 종류 찾기 (리스트 & 세트) (0) | 2022.05.06 |
생애 첫 코딩테스트 문제 (0) | 2022.04.28 |
(3)클래스 메서드와 속성으로 시계 만들기 (0) | 2022.04.14 |
(2)2차원리스트를 활용하여 순서대로 숫자 작성하기 (0) | 2022.04.01 |