프로그래밍 문제 풀이/코드업(파이썬)

코드업[CodeUp] Python 기초 100제 [6096번]

태은코딩 2024. 2. 2. 09:40

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()