코드업 6096:바둑알 십자 뒤집기
문제
부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가…
“십(+)자 뒤집기를 해볼까?”하고 생각했다.
십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후,
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다.
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.
바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.
입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.
출력
십자 뒤집기 결과를 출력한다.
입력 예시, 출력 예시 생략!
잘못된 풀이(1차)
d = []
n = int(input())
for k in range(n):
x,y = input().split()
for i in range(1,20):
if d[i][int(y)] == 0:
d[i][int(y)] = 1
else:
d[i][int(y)] = 0
if d[int(x)][j] == 0:
d[int(x)][j] = 1
else:
d[int(x)][j] = 0
for i in range(0,20):
for j in range(0,20):
print(d[i][j], end='')
왜 틀렸는가?(1차)
- map(int, input().split())을 쓰지 않아서일까?
- 출력문의 오류인 것 같다.
반성일지(1차)
- 함수를 쓸 생각을 하지 못했다. 코드가 더 간단한 방법인데
- 리스트에 값을 넣은 다음에 ‘ ‘.join()을 통해서 띄어쓸 수 있다는 점을 몰랐다.
- if문의 다양한 구현 방법을 몰랐었다.
정답 풀이
def flip(l, x, y):
for i in range(19):
l[x][i] = '1' if l[x][i] == '0' else '0'
l[i][y] = '1' if l[i][y] == '0' else '0'
l = []
for i in range(19):
l.append(input().split())
for i in range(int(input())):
x,y = map(int, input().split())
flip(l, x-1, y-1)
for i in range(19):
print(' '.join(l[i]))
핵심 알고리즘 및 스킬
- append의 쓰임
- ’ ‘.join()을 이용한 띄어쓰기
댓글남기기