[Python] 6096: 바둑알 십자 뒤집기

문제

부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가… 

“십(+)자 뒤집기를 해볼까?”하고 생각했다. 

십자 뒤집기는 
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후,  
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다. 
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다. 

바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

예시 
… 
for i in range(n) : 
  x,y=input().split()
  for j in range(1, 20) :
    if d[j][int(y)]==0 : 
      d[j][int(y)]=1
    else :
      d[j][int(y)]=0

    if d[int(x)][j]==0 :
      d[int(x)][j]=1
    else :
      d[int(x)][j]=0 

참고
리스트가 들어있는 리스트를 만들면?
가로번호, 세로번호를 사용해 2차원 형태의 데이터처럼 쉽게 기록하고 사용할 수 있다.
리스트이름[번호][번호] 형식으로 저장되어있는 값을 읽고 쓸 수 있다. 

입력

바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다. 

출력

십자 뒤집기 결과를 출력한다. 

풀이

이미 문제 안에 예시가 있어 푸는데 어렵지 않지만,
문제 나와있는 그대로 코드로 옮긴다고 생각하면 쉽게 풀 수 있는 문제이다.

  1. 19 * 19 크기의 배열을 입력 받는다.
  2. n 을 입력 받는다.
  3. n 번 만큼 반복문을 이용하여 십자 뒤집기 좌표를 입력 받는다.
  4. 십자 뒤집기 좌표를 입력 받을 때마다 반복문을 이용하여 같은 행, 열의 값을 뒤집어준다(1->0, 0->1)
  5. 반복문을 이용하여 배열의 최종 결과를 출력 해준다.

이를 코드로 나타내면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
 
array = []
 
for i in range(19):
    numArr = list(map(int, sys.stdin.readline().rstrip().split()))
    array.append(numArr)
 
= int(sys.stdin.readline().rstrip())
 
for i in range(n):
    row, column = map(int, sys.stdin.readline().rstrip().split())
    for j in range(19):
        array[row  1][j] = 0 if array[row  1][j] == 1 else 1
        array[j][column  1= 0 if array[j][column  1== 1 else 1
 
for i in range(19):
    for j in range(19):
        print(array[i][j], end=‘ ‘)
    print()
 
 
cs

문제 출처 : https://codeup.kr/problem.php?id=6096

관련글

제목 작성자 작성일