
예제
부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...
"십(+)자 뒤집기를 해볼까?"하고 생각했다.
십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후,
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다.
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.
바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.
참고
리스트가 들어있는 리스트를 만들면?
가로번호, 세로번호를 사용해 2차원 형태의 데이터처럼 쉽게 기록하고 사용할 수 있다.
리스트이름[번호][번호] 형식으로 저장되어있는 값을 읽고 쓸 수 있다.
해설
- 19 * 19 바둑판 생성: 0부터 18까지 1차원 배열 생성 후 append()를 사용해 2차원 배열로 업그레이드
- 2차원 바둑판을 0으로 전부 초기화
- 입력받은 값으로 19 * 19 바둑판 수정
- 십자 뒤집기를 할 좌표를 입력받은 뒤 if문으로 0 -> 1, 1-> 0으로 십자 뒤집기 수행
- 바둑판 형식에 맞게 출력
소스 코드
location = [] #1차원 배열 생성
# 바둑판 모두 0으로 초기화
for i in range(0, 19): # 0부터 18까지 총 19
location.append([]) # [[], [], [], ... * 19] 2차원 배열 생성
for j in range(0, 20):
location[i].append(0)
# 바둑판 입력받은 대로 수정정for i in range(0, 19): # 0부터 18까지 총 19
temp = input().split() # i번째 줄 공백 기준으로 숫자 배열 저장 ex) [0, 0, 0, ... * 19]
for j in range(0, 19):
location[i][j] = int(temp[j])
# 십자 뒤집기 하기 위해 좌표 입력받기
repeat = int(input())
for i in range(repeat):
x, y = input().split() # 바둑판 상 x좌표와 y좌표
x = int(x) - 1 # (1, 1)을 십자 뒤집기 하고 싶다 -> 배열 상으론 (0, 0)을 뒤집어야 함
y = int(y) - 1
# 가로 뒤집기
for n in range(19):
if location[x][n] == 0:
location[x][n] = 1
else:
location[x][n] = 0
# 세로 뒤집기
for n in range(19):
if location[n][y] == 0:
location[n][y] = 1
else:
location[n][y] = 0
# 바둑판 출력
for i in range(19):
for j in range(19):
print(location[i][j], end=' ')
print()
'[Code Up] 기초 알고리즘 100제 With Python' 카테고리의 다른 글
6098 : [기초-리스트] 성실한 개미(py) (0) | 2023.03.24 |
---|---|
6097 : [기초-리스트] 설탕과자 뽑기(py) (0) | 2023.03.24 |
6082 : [기초-종합] 3 6 9 게임의 왕이 되자 (0) | 2023.03.21 |
6056 : [기초-논리연산] 참/거짓이 서로 다를 때에만 참 출력하기 (0) | 2023.03.14 |
6031 : [기초-값변환] 정수 입력받아 유니코드 문자로 변환하기 (0) | 2023.03.14 |