코드업 6096 : [기초-리스트] 바둑알 십자 뒤집기(py)

분명히 쉬운 문제인데...

아니.... 입력에 누가 저걸 다 써놓을 줄 알았겠습니까. 못 본 내 눈을 탓하자

 

 

문제 내용

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

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

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

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

입력

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

코드 업의 파이썬 기초 100 문제들은 파이썬 문법을 어느 정도 알고 있다고 가정 하에 시작한다. 

필자는 백준을 풀다가 잠시 코딩 테스트 준비를 쉬고 다시 파이썬을 공부할 겸해서 코드 업으로 다시 실력을 쌓아 올리고 있었는데..

 

물론 그동안 많은 문제들을 풀어오지는 못했지만.. 저런 괴랄한 것은 처음 본 것 같다.

 

첫 번째 시도

 

 [기초-리스트] 바둑판에 흰 돌 놓기(설명)(py) (codeup.kr)

 

[기초-리스트] 바둑판에 흰 돌 놓기(설명)(py)

python언어기초100제v1.0 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요. - 모든 내용

codeup.kr

바로 전 문제였던 바둑판에 흰돌 놓기에서 앞서 작성한 코드를 참고하였다.

 

pos = []
for j in range(20):
    pos.append([])
    for k in range(20):
        pos[j].append(0)

for i in range(19):
    a = input().split()
    for j in range(19):
        d[i+1][j+1] = int(a[j])
   
n = int(input())
for i in range(n):
    a, b = map(int, input().split())
    for j in range(20):
        if pos[a][j] == 0:
            pos[a][j] = 1
        else :
            pos[a][j] = 0
    for j in range(20) :
        if pos[j][b] == 0:
            pos[j][b] = 1
        else :
            pos[j][b] = 0

for i in range(20):
    for j in range(20):
        print(pos[i][j], end = " ")
    print()

입력값은 입력값대로 빠져있고 바둑판 사이즈도 20 X 20으로 설정해놓고 1시간을 머리를 싸매고 고민했다.

그래서 다시 입력값과 바둑판 사이즈를 조절하였다.

 

두 번째 시도 

d = []
for i in range(20):
    d.append([])
    for j in range(20):
        d[i].append(0)
    
for i in range(19):
    a = input().split()
    for j in range(19):
        d[i+1][j+1] = int(a[j])
        
n = int(input())
for i in range(n):
    a, b = map(int, input().split())
    for j in range(1, 20):
        if d[j][b] == 1:
            d[j][b] = 0
        else:
            d[j][b] = 1
        
        if d[a][j] == 1:
            d[a][j] = 0
        else:
            d[a][j] = 1

for i in range(1, 20):
    for j in range(1, 20):
        print(d[i][j], end = ' ')
    print()

처음에는 저 많은 양의 숫자 입력값을 어떻게 받아야 하나 고민하다가 그냥 하나의 string으로 받아서 split 하는 방향으로 설정하였고 마지막 줄의 바둑판 출력 사이즈도 조정하였다.

 

문제를 풀면 풀수록 이러한 벽들을 더 많이 마주해야 성장하고 이런 일이 있을때마다 블로그에 남겨 나중에 돌이켜봐야겠다.