6096 : [기초-리스트] 바둑알 십자 뒤집기(py)
문제설명 |
부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가... "십(+)자 뒤집기를 해볼까?"하고 생각했다. 십자 뒤집기는 그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후, 다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다. 어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다. 바둑판(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 |
정답 및 가능한 정답
badook=[]
for i in range(19):
a=list(map(int,input().split()))
badook.append(a)
n=int(input())
for i in range(n):
a,b=map(int,input().split())
a=a-1
b=b-1
for j in range(19):
if badook[a][j]==1:
badook[a][j]=0
else:
badook[a][j]=1
if badook[j][b]==1:
badook[j][b]=0
else:
badook[j][b]=1
for i in range(19):
for j in range(19):
print(badook[i][j],end=" ")
print()
해설
먼저 바둑판을 입력받는걸 생각해 보자
바깥 리스트를 먼저 만들고,
for문과 list(map(int,input().split()))을 통해 리스트를 한줄씩 입력받는다.
그 후 badook.append(a)로 한줄씩 바깥 리스트에 append한다.
badook=[]
for i in range(19):
a=list(map(int,input().split()))
badook.append(a)
이제 십자뒤집기 횟수 n을 입력받고,
십자뒤집기 좌표가 n만큼 입력된다. 좌표는 입력과 동시에 좌표뒤집기를 실행해야 하므로
인덱스는 0부터 18인것을 감안하여 입력된 좌표 (a,b)를 (a-1,b-1)로 조정해준다.
if문으로 좌표가 1이면 0으로 바꾸고 0이면 1으로 바꾸게 하며
badook[a][j]로 가로줄을 변경해주고
badook[j][b]로 세로줄을 변경해준다.
코드를 작성하면 아래와 같다.
n=int(input())
for i in range(n):
a,b=map(int,input().split())
a=a-1
b=b-1
for j in range(19):
if badook[a][j]==1:
badook[a][j]=0
else:
badook[a][j]=1
if badook[j][b]==1:
badook[j][b]=0
else:
badook[j][b]=1
이제 바둑판의 상황을 출력해야 한다.
2차원 리스트를 출력하는 방법은 여러가지가 있는데 range()를 사용하는 방법을 써보자
1행씩 일렬로 작성하기 위해 end=" "옵션을 사용하고 줄바꿈 하기 위해 print()를 한다.
for i in range(19):
for j in range(19):
print(badook[i][j],end=" ")
print()