문제
부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...
"십(+)자 뒤집기를 해볼까?"하고 생각했다.
십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후,
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다.
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.
바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.
챗 지피티가 알려준 정답.
행과 열을 각각의 for문으로 반전시킴
내 정답
바둑판을 생성할 때 이전의 문제인 바둑판에 흰 돌 놓기 문제에서 쓴 바둑판 생성 코드를 재활용함
문제 풀이 과정
1. 19*19의 바둑판을 생성한다.
-> 19*19사이즈의 이중리스트 생성. 각 리스트는 0이 19개 들어가있음
2.문제에서 제공한 바둑판을 구현한다.
- 한 줄씩 입력하므로 19번 반복
3. 좌표에 따른 행의 열값, 열의 행값을 뒤집음(if문과 인덱싱을 사용하여 1이면 0으로, 0이면 1로 바꿈)
구체적인 과정
1. 10행의 모든 열의 값이 바뀜(검은 색 부분, 전부1에서 0으로 바뀜)
2. 10열의 모든 값이 바뀜(검은색 세로 줄, 전부 1에서 0으로 바뀜)
이 과정에서 (10,10)의 0이 다시 1로 바뀜
3. 위와 같은 과정을 12행,12열에서 반복
3-1. 12행의 모든 값이 반대로 바뀜. 이 과정에서 (12,10)지점의 0이 1로 바뀜
3-2. 12열의 모든 값이 반대로 바뀜. 이 과정에서 (10,12)와 (12,12)의 값이 1이
최종 결과
(10,10) , (10,12), (12,10), (12,12)의 값만 1이 됨
4. 위의 바둑판 리스트를 한 줄씩 출력
- 이중 for문 -> 행의 따른 열의 값 출력(리스트의 요소 출력)
- end = " '을 통해 빈칸을 두고 출력됨
-print()을 통해 한 줄이 출력될 때 마다 줄바꿈을 실행
출력 결과
번외. 바둑판 생성 방법
의문점이 생겼다. 바둑판을 생성하는 여러 방법이 있는데 전부 같은 결과를 낼까?
1번은 이 문제의 모범정답의 코드(인터넷 다른 블로그에서 봄)
2번은 내가 짠 코드(다른 문제의 코드 재활용). 개인적으로 직관적이라고 생각해서 이 코드를 선택했다.
3번은 챗지피티가 짜준 코드이다.
결론은 전부 같은 결과를 낸다는 것이었다.
아래 사진은 각 방법마다의 특징과 차이점이다.
챗지피티는 3번을 추천했다. (지가 짠 코드임)
각 리스트들의 각 행 리스트는 독립적이어서 특정 행의 값을 바꿔도 모든 행의 값이 바뀌지 않는다.
진짜 결론은 어떤 방법을 쓰던 결과는 같다는 것.(메모리나 처리시간 생각하면 3번 쓰는게 맞는 듯)
'파이썬 > 코드업 100제' 카테고리의 다른 글
[코드업100제] 6095 바둑판에 흰돌 놓기 (1) | 2024.11.07 |
---|---|
[코드업 100제] 파이썬으로 3 6 9 게임 만들기 (2) | 2024.11.05 |