실패
🔗 6096 : [기초-리스트] 바둑알 십자 뒤집기(py)
문제 설명
부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...
"십(+)자 뒤집기를 해볼까?"하고 생각했다.
십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(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차원 형태의 데이터처럼 쉽게 기록하고 사용할 수 있다.
리스트이름[번호][번호] 형식으로 저장되어있는 값을 읽고 쓸 수 있다.
문제 분석
- 어떤 위치를 골라 십자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.
→ 결론 : 신경 쓸 필요 없음. 예를 들어, (10,10) 자리가 1일 때 십자 뒤집기를 하면 가로줄 먼저 뒤집기로 0이 되었다가 세로줄 뒤집기에서 1이 된다. 결국, 해당 자리만 원 상태로 돌아간다.
- x, y에 해당하는 줄만 잘 1 → 0, 0 → 1로 바꿔주면 된다.
입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.
입력 예시
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
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
출력
십자 뒤집기 결과를 출력한다.
출력 예시
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 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
모범 소스
소스 분석
d=[]
for i in range(20) :
d.append([])
for j in range(20) :
d[i].append(0)
[1 - 5] : 모든 원소가 0인 20 * 20 2차원 리스트 생성
for i in range(19) :
a = input().split()
for j in range(19) :
d[i+1][j+1] = int(a[j])
[7 - 10] : 입력받은 값을 int형으로 변환
d[i+1][j+1] = int(a[j])
[10] : x = 0인 줄과 y=0인 줄은 사용할 필요가 없기 때문에 각 리스트 인덱스에 1을 더함 (x = 0인 줄과 y=0인 줄은 단순히 인덱스 값을 맞춰주기 위함)
n = int(input())
for i in range(n) :
x,y=input().split()
x=int(x)
y=int(y)
for j in range(1, 20) :
if d[j][y]==0 :
d[j][y]=1
else :
d[j][y]=0
if d[x][j]==0 :
d[x][j]=1
else :
d[x][j]=0
[12 - 26] : 좌표 개수를 입력받고 개수 만큼 십자 뒤집기를 함
for j in range(1, 20) :
[17] : [10]과 같은 이유로 x=0인 줄과 y=0인 줄은 필요없기 때문에 범위를 1 ~ 20으로 설정
for i in range(1, 20) :
for j in range(1, 20) :
print(d[i][j], end=' ')
print()
[28 - 31] : 십자 뒤집기 결과를 출력
Q. 바둑판은 19 * 19 인데 코드에서는 왜 20 * 20으로 만들까?
A. 입력받은 x, y 좌표값과 실제 리스트 인덱스에는 1 정도 차이나는데 그 차이를 줄이기 위해 20 * 20으로 맞춘 것 같다. 예를 들어, 바둑판이 19 * 19이고 x, y 좌표값이 10, 10이라면 리스트 인덱스는 0부터 시작하기 때문에 x-1, y-1 인덱스로 찾아야 한다. 그런데 바둑판이 20*20이고 x = 0인 줄과 y = 0인 줄을 사용하지 않는다면 입력받은 그대로 x, y 값을 리스트 인덱스로 사용할 수 있다. (해당 부분은 코딩 스타일 차이인 것 같다.)
변경 소스
소스 설명
d = []
for i in range(19):
d.append(list(map(int, input().split())))
[1 - 3] : 입력 받은 값을 쪼개서 int형으로 변환하고 리스트로 저장해서 리스트에 추가
n = int(input())
for i in range(n):
x, y = map(int, input().split())
for j in range(19):
if d[j][y-1] == 0:
d[j][y-1] = 1
else:
d[j][y-1] = 0
if d[x-1][j] == 0:
d[x-1][j] = 1
else:
d[x-1][j] = 0
[5 - 18] : 입력 받은 x, y 좌표값과 리스트 인덱스 간의 차이가 존재하므로 x 좌표와 y 좌표에서 1을 빼준 인덱스를 사용
for i in range(19):
for j in range(19):
print(d[i][j], end=' ')
print()
[20 - 23] : 2차원 리스트 출력
회고
해당 문제에서 오랫동안 막혀서 결국 답을 찾아볼 수 밖에 없었다.
리스트 관련 공부가 더 필요할 것 같다.
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'코딩테스트' 카테고리의 다른 글
[코테/백준] Python 30 - 10610번 (0) | 2023.01.24 |
---|---|
[코테/백준] Python ATM - 11399번 (0) | 2023.01.12 |
[코테/백준] Python 설탕 배달 - 2839번 (0) | 2023.01.12 |
[코테/CodeUp] Python 기초 100제 - 6098번 (0) | 2023.01.10 |
[코딩테스트] 계획 (0) | 2023.01.08 |
실패
🔗 6096 : [기초-리스트] 바둑알 십자 뒤집기(py)
문제 설명
부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...
"십(+)자 뒤집기를 해볼까?"하고 생각했다.
십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(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차원 형태의 데이터처럼 쉽게 기록하고 사용할 수 있다.
리스트이름[번호][번호] 형식으로 저장되어있는 값을 읽고 쓸 수 있다.
문제 분석
- 어떤 위치를 골라 십자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.
→ 결론 : 신경 쓸 필요 없음. 예를 들어, (10,10) 자리가 1일 때 십자 뒤집기를 하면 가로줄 먼저 뒤집기로 0이 되었다가 세로줄 뒤집기에서 1이 된다. 결국, 해당 자리만 원 상태로 돌아간다.
- x, y에 해당하는 줄만 잘 1 → 0, 0 → 1로 바꿔주면 된다.
입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.
입력 예시
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
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
출력
십자 뒤집기 결과를 출력한다.
출력 예시
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 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
모범 소스
소스 분석
d=[]
for i in range(20) :
d.append([])
for j in range(20) :
d[i].append(0)
[1 - 5] : 모든 원소가 0인 20 * 20 2차원 리스트 생성
for i in range(19) :
a = input().split()
for j in range(19) :
d[i+1][j+1] = int(a[j])
[7 - 10] : 입력받은 값을 int형으로 변환
d[i+1][j+1] = int(a[j])
[10] : x = 0인 줄과 y=0인 줄은 사용할 필요가 없기 때문에 각 리스트 인덱스에 1을 더함 (x = 0인 줄과 y=0인 줄은 단순히 인덱스 값을 맞춰주기 위함)
n = int(input())
for i in range(n) :
x,y=input().split()
x=int(x)
y=int(y)
for j in range(1, 20) :
if d[j][y]==0 :
d[j][y]=1
else :
d[j][y]=0
if d[x][j]==0 :
d[x][j]=1
else :
d[x][j]=0
[12 - 26] : 좌표 개수를 입력받고 개수 만큼 십자 뒤집기를 함
for j in range(1, 20) :
[17] : [10]과 같은 이유로 x=0인 줄과 y=0인 줄은 필요없기 때문에 범위를 1 ~ 20으로 설정
for i in range(1, 20) :
for j in range(1, 20) :
print(d[i][j], end=' ')
print()
[28 - 31] : 십자 뒤집기 결과를 출력
Q. 바둑판은 19 * 19 인데 코드에서는 왜 20 * 20으로 만들까?
A. 입력받은 x, y 좌표값과 실제 리스트 인덱스에는 1 정도 차이나는데 그 차이를 줄이기 위해 20 * 20으로 맞춘 것 같다. 예를 들어, 바둑판이 19 * 19이고 x, y 좌표값이 10, 10이라면 리스트 인덱스는 0부터 시작하기 때문에 x-1, y-1 인덱스로 찾아야 한다. 그런데 바둑판이 20*20이고 x = 0인 줄과 y = 0인 줄을 사용하지 않는다면 입력받은 그대로 x, y 값을 리스트 인덱스로 사용할 수 있다. (해당 부분은 코딩 스타일 차이인 것 같다.)
변경 소스
소스 설명
d = []
for i in range(19):
d.append(list(map(int, input().split())))
[1 - 3] : 입력 받은 값을 쪼개서 int형으로 변환하고 리스트로 저장해서 리스트에 추가
n = int(input())
for i in range(n):
x, y = map(int, input().split())
for j in range(19):
if d[j][y-1] == 0:
d[j][y-1] = 1
else:
d[j][y-1] = 0
if d[x-1][j] == 0:
d[x-1][j] = 1
else:
d[x-1][j] = 0
[5 - 18] : 입력 받은 x, y 좌표값과 리스트 인덱스 간의 차이가 존재하므로 x 좌표와 y 좌표에서 1을 빼준 인덱스를 사용
for i in range(19):
for j in range(19):
print(d[i][j], end=' ')
print()
[20 - 23] : 2차원 리스트 출력
회고
해당 문제에서 오랫동안 막혀서 결국 답을 찾아볼 수 밖에 없었다.
리스트 관련 공부가 더 필요할 것 같다.
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'코딩테스트' 카테고리의 다른 글
[코테/백준] Python 30 - 10610번 (0) | 2023.01.24 |
---|---|
[코테/백준] Python ATM - 11399번 (0) | 2023.01.12 |
[코테/백준] Python 설탕 배달 - 2839번 (0) | 2023.01.12 |
[코테/CodeUp] Python 기초 100제 - 6098번 (0) | 2023.01.10 |
[코딩테스트] 계획 (0) | 2023.01.08 |