문제
뒤집기 게임의 룰은 다음과 같다.
- 뒤집기 게임을 진행할 맵과 뒤집기 횟수 N이 주어진다. 이때 맵은 10×10정삼각형 모양의 2차원 배열 형태이면 모든 원소들이 0으로 되어있는 상태이다.
- 뒤집기 행위는 뒤집을 원소가 1이면 0으로 만들고, 0이면 1로 만든다는 뜻이다.
- 첫번째 뒤집을 때는 1행의 원소들과 1열의 원소들을 모두 뒤집는다. 두번째 뒤집을 때는 2행의 원소들과 2열의 원소들을 모두 뒤집는다. 마찬가지로 i번째 뒤집을 때는 i행의 원소들과 i열의 원소들을 모두 뒤집는다. 이렇게 총 N번의 뒤집기를 한다. (행과 열의 번호는 1번부터 시작한다.)
N이 주어졌을 때 뒤집기 게임을 모두 시행하고 난 뒤의 맵을 출력하는 프로그램을 작성해보자
입력
입력 첫째 줄에는 뒤집을 횟수 N이 주어진다. N은 10 이하의 자연수이다.
출력
뒤집기 게임을 하고난 뒤의 맵의 상태를 출력한다. ( 맵은 숫자 사이에 공백을 두고 출력한다.)
예제 입력
3
예제 출력
1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
아이디어
문제를 풀기 전에 숫자를 뒤집는건 둘째치고 중복이 되는 경우를 고민해봤다.
여기서 중복이란 무엇을 의미하는지?
예제 입력처럼 3을 입력 받았다고 가정해 보자.
1행 1열 뒤집고, 2행 2열 뒤집고, 3행 3열을 뒤집어야 되는데 위 사진처럼 빨간색 부분은 뒤집을 때 공통되는 부분이다.
1행 1열을 뒤집을 때 가로 : (0,0) ~ (0,9) / 세로 : (0,0) ~ (9,0)를 뒤집어야 되는데 이처럼 (0,0) 같은 공통 부분이 발생된다.
머리로만 생각했을 때 규칙이 떠오르지 않았지만 그림을 그려보니 바로 규칙을 발견했다.
그 규칙은 n번째 행을 뒤집을 때 (n,n)은 공통된다는 것이다.
따라서 가로 뒤집을 때는 (n,n)을 뒤집고 세로 뒤집을 때 if문을 활용해서 (n,n)일 땐 뒤집지 않기로 하면 문제가 해결된다.
그리고 뒤집는 건 if 문을 활용해서 0 이면 1로, 1이면 0으로 뒤집으면 된다. 위 공통되는 문제만 잘 해결하면 쉬운 문제이다.
코드
풀이보기(클릭)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
arr = [[0] * 10 for _ in range(10)]
n = int(input())
for i in range(n):
for j in range(10):
# 세로
if arr[i][j] == 0:
arr[i][j] = 1
else:
arr[i][j] = 0
#가로
if i != j and arr[j][i] == 1:
arr[j][i] = 0
else:
arr[j][i] = 1
for i in range(10):
for j in range(10):
print(arr[i][j], end=" ")
print()
문제 출처
ALGORITHM JOBS