📋 문제 설명
바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때, n개의 좌표를 입력받아 십자(+) 뒤집기 한 결과를 출력하는 프로그램을 작성해보자.
⌨️ 입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10 이하의 자연수이다.
🖥️ 출력
십자 뒤집기 결과를 출력한다.
📸 입력 예시
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
2
10 10
12 12
🖼️ 출력 예시
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
✏️ 풀이과정
d = [[0 for j in range(19)] for i in range(19)] #바둑알이 들어갈 배열 생성
for i in range(19) :
d[i] = input().split()
for j in range(19) :
d[i][j] = int(d[i][j]) #바둑알 입력 받기
n = int(input()) #십자 뒤집기 횟수 입력
xy = [[0 for j in range(2)] for i in range(n)] #십자 뒤집기 좌표가 들어갈 배열 생성
for i in range(n) :
xy[i]= input().split() #좌표 입력
for j in range(2) :
xy[i][j]= int(xy[i][j])-1 #좌표를 정수로 바꿔주고, 인덱스값에 맞게 -1을 해줌
for i in xy :
for j in range(19) :
d[i[0]][j] = int(not d[i[0]][j])
d[j][i[1]] = int(not d[j][i[1]]) #바둑알은 0과 1로만 이루어져 있으므로 not을 통해 바꿔줌
for i in range(19):
for j in range(19):
print(d[i][j], end = " ")
print() #출력
문제를 처음 읽었을 때,
"입력받은 좌표를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다."
라는 말 때문에 어렵게 생각할 뻔 했지만 잘 생각해보면
그 좌표에 있는 바둑알을 가로로 1번, 세로로 1번 뒤집게 된다.
만약 좌표의 바둑알이 0이었다면
0 (초기 상태) ➡ 1 ➡ 0
이렇게 다시 원상복귀가 된다. 따라서 가로, 세로를 뒤집어주는 방식을 택한다면, 생각하지 않아도 되는 조건이다.
내가 이 문제를 풀면서 생각을 했던 점들은
- 0과 1을 어떻게 바꿔줄 것인가?
- 바둑알과 좌표들을 어떻게 입력 받아줄 것인가?
정도가 될 것 같다.
1번의 경우에는 if문으로 바둑알이 0인지 1인지 검사를 하는 방법과, bool값이나 아니면 나처럼 not을 쓰는 방법도 있다.
하지만 if문을 쓰게 되면 코드가 더 길어지고, 복잡해지기 때문에 이전 문제에서 풀면서 알 수 있었던 not을 사용했다.
(bool 보다도 not 이 먼저 생각이 났다. 그래서 not을 택했다.)
이 문제의 알고리즘에 할애한 시간보다 실수들에 시간을 많이 쏟아부은 것 같다.
특히 좌표가 [10, 10]이 주어졌다고 이 값을 바로 인덱싱에 사용하면 안 되는 점을 마지막에 깨달았다.
인덱싱을 많이 할 수 있는 문제였기도 한 것 같다. 괄호 때문에 눈이 아팠다. ㅋㅋㅋ
문제를 다 풀고, 묻고 답하기에 "파이썬 입력 팁"이라는 게시글이 있어 들어가 확인해 보았다.
항상 공백을 두고 주어지는 입력값은 input().split()을 해준 뒤, 따로 int형으로 변경해주어야 해서 번거로웠다. (불편ㅋ)
그래서 int(input().split())도 시도를 해보았는데, 오류가 발생하였다.
이 게시글에서는 공백이 들어간 입력을 받을 때 한 번에 정수형으로 형 변환을 해주는 방법을 담고 있었다.
🔽 공백이 포함된 입력 받는 방법
n = list(map(int, input().split()))
위와 같이 맵핑을 이용하면 가능하였다. 맵핑의 기능에 대해 찾아 공부해보는 것도 좋을 것 같다.
'Programming Language > PYTHON' 카테고리의 다른 글
[빡공팟 5기] 6098 : [기초-리스트] 성실한 개미(py) (0) | 2022.09.28 |
---|---|
[빡공팟 5기] 6097 : [기초-리스트] 설탕과자 뽑기(py) (0) | 2022.09.28 |
[빡공팟 5기] | 코드업 | 6095 : [기초-리스트] 바둑판에 흰 돌 놓기(설명)(py) (1) | 2022.09.23 |
[빡공팟 5기] | 코드업 | 6088 : [기초-종합] 수 나열하기1(py) (1) | 2022.09.22 |
[자료구조] - Python으로 스택 간단 구현하기 (0) | 2022.08.27 |