[Python] CodeUp 6096번 / 바둑알 십자가 뒤집기

Jerry·2022년 6월 22일
0

알고리즘

목록 보기
4/25

문제 설명

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

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

십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(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차원 형태의 데이터처럼 쉽게 기록하고 사용할 수 있다.
리스트이름[번호][번호] 형식으로 저장되어있는 값을 읽고 쓸 수 있다.

입력 예시

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

문제 접근 방식

  1. 바둑판 배열 입력받기
  2. 입력받은 바둑판 배열 2차원 리스트로 저장
  3. n : 좌표 갯수 입력받기
  4. 좌표 x, y 입력 받기
  5. 좌표 바꿔주기

문제 풀이

문제에서 3~5에 대한 예시 코드를 올려주어서 문제 해결 방식에 대한 이해는 어느 정도 가능했는데, 1번 바둑판 배열 입력받는 부분에서 많이 헤맸다.

d = []                              # 바둑판 껍데기 만들기
for i in range(19) :                # range(19) : 0~18, range(1, 20) : 1~19
    d.append([])					# 빈 가로줄 깔기
    a = input().split()             # 바둑판 좌표 입력 받기
    for j in range(19) : 
        d[i].append(int(a[j]))		# 줄 별로 바둑판 값 채워넣기
        

n = int(input())					# 좌표 개수 입력받기
for i in range(n) : # 0~1
    x, y = input().split()			# 좌표 개수에 해당하는 좌표값 입력받기
    x, y = int(x)-1, int(y)-1		# 바둑판이 0부터 시작하기때문에 각 좌표값에서 1씩 빼준다.
    
    for j in range(19) : 
        if d[j][int(y)] == 0 :      # 가로줄이 0이면 모두 1로 바꿈
            d[j][int(y)] = 1
        else : d[j][int(y)] = 0     # 가로줄이 1이면 모두 0으로 바꿈
        
        if d[int(x)][j] == 0 :      # 세로줄이 0이면 모두 1로 바꿈
            d[int(x)][j] = 1
        else : d[int(x)][j] = 0     # 세로줄이 1이면 모두 1로 바꿈
        
for i in range(19) :
    for j in range(19) :
        print(d[i][j], end = ' ')	# 변경된 바둑판 값 출력
    print()

트러블슈팅

  1. list out range 난 이유 -> 19줄의 좌표를 입력해야 하는데 19줄을 1줄로 이어서 붙여서 그럼. 그 다음에 입력받은 좌표가 2가 되기 때문에 나는 에러
profile
함께 일 하고 싶은 개발자가 되길 희망합니다.

0개의 댓글