아무튼 개발
article thumbnail
반응형

코드업 파이썬 기초 100제의 6096번 풀이입니다.

내가 헷갈려서 쓰는 글^.^..

 

https://codeup.kr/problem.php?id=6096 

 

[기초-리스트] 바둑알 십자 뒤집기(py)

python언어기초100제v1.0 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요. - 모든 내용

codeup.kr

 

문제

 

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

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

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

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

 

코드

 

d = []

for i in range(20):
    d.append([])
    for j in range(20):
        d[i].append(0)

for i in range(19):
    a = input().split()
    for j in range(19):
        d[i+1][j+1] = int(a[j])

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

for i in range(1, 20):
    for j in range(1, 20):
        print(d[i][j], end=' ')
    print()

 

 

코드 풀이

출처 :  코드업

1) 바둑판 리스트 변수 d 생성

d = []

 

 

2) 바둑판 0부터 19까지의 빈 리스트 [] 추가

 + 중첩문을 통해 그 안에 0부터 19까지 0값 추가
for i in range(20):
    d.append([])    # [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
    for j in range(20):
        d[i].append(0)  # [[0, 0, 0, 0, 0, 0, 0, ...], [0, 0, 0, 0, 0, 0, 0, ...], ...]

 

처음에 위의 부분이 이해가 잘 안 됐었는데 부가 설명을 하자면,

x축을 먼저 생성하고 (19개의 x자리 만듦) -- 첫 번째 for문

x값을 중심으로 짝인 y의 자리를 만든다고 생각하면 된다. -- 두 번째 for문

즉, (1,0), (1,1), (1,2) ... 있듯이 x=1을 기준으로 총 19개의 y값 생성!

 

 

3) 바둑판 기본 값 생성 - 입력값 받아서 넣기
for i in range(19):
    a = input().split()
    for j in range(19):
        d[i+1][j+1] = int(a[j])

 

i는 y값이고 j는 x값이다.

입력 예시에 따라서 y축을 기준으로 x값들을 넣어준다.

split()은 스페이스바, 엔터바 모두 동일하게 인식한다.

++ a = list(map(int, input().split())) 도 가능!

 

 

4) 십자 뒤집기 값 추가
n = int(input())      #십자 뒤집기 횟수(n)

 

뒤집기 할 횟수만큼의 x, y 값을 for문으로 받는다.

숫자로 사용하기 위해 x, y를 정수화해준다.

0은 1로, 1은 0으로 바꿀 것이다.


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

 

두 번째 중첩 for문을 통해 바둑판 크기인 19번을 반복시켜서 값을 바꿔준다.

예시 입력값인 (10, 10)의 경우

y=10인 값들을 if문에 따라 바꾼 다음, x=10인 값들을 바꿔주면 십자 모양으로 값들이 바뀌게 되는 것이다!

 

 

5) 출력

이제 모든 값들이 다 변경되었으니 출력할 차례이다.

중첩 for문을 사용한다.


for i in range(1, 20):
    for j in range(1, 20):
        print(d[i][j], end=' ')
    print()

 

end=' '를 줌으로써 값 사이에 공백(스페이스바)이 생성되게 한다.

y의 값이 변경될 때마다 다음 줄로 가기 위해

바깥 for문에 print()를 주면 된다.

즉, i가 y이고 j가 x인 것이다.

 

 


문제 자체를 이해하는 데에도 조금 까다롭지만

x와 y의 값을 중첩 for문안에서 사용할 때는 i와 j라는 변수로 활용하기 때문에 더욱 헷갈리는 문제이다.

앞의 6095번은 바둑판 기본 문제이므로 함께 풀면 좋을 듯하다.

 

 

역시 설명하며 문제를 풀이하다 보니 나도 헷갈렸던 게 이해가 되었다!

 

혹시 틀린 부분이 있다면 언제든지 댓글 환영입니다 :D

반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...