파이썬/코드업 100제

[코드업 100제]6096번 바둑알 십자가 뒤집기

개발_장 2024. 11. 10. 00:26

문제

부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...

"십(+)자 뒤집기를 해볼까?"하고 생각했다.

십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후, 
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다.
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.

바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

 

챗 지피티가 알려준 정답.

행과 열을 각각의 for문으로 반전시킴

 

내 정답

바둑판을 생성할 때 이전의 문제인 바둑판에 흰 돌 놓기 문제에서 쓴 바둑판 생성 코드를 재활용함

문제 풀이 과정

1. 19*19의 바둑판을 생성한다.   

 ->  19*19사이즈의 이중리스트 생성. 각 리스트는 0이 19개 들어가있음

이미지에 오류가 있습니다. 리스트여서 0들 사이에 ,가 있어야합니다. ex[0, 0, 0,....0]

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번 쓰는게 맞는 듯)