본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python 기초 100제] 6096번 : [기초-리스트] 바둑알 십자 뒤집기

by 빛밤하늘 2021. 8. 8.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

 

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

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

codeup.kr

 

 

 

 

 

 

 

 

주의해야 할 점

리스트의 실제 인덱스는 0부터 시작합니다.

그런데 문제에서 십자 뒤집기 좌표는 자연수로 표현합니다. 즉, 1부터 시작합니다.

이것에 주의해서 십자 뒤집기의 좌표를 바둑판에서 찾아야 합니다.

 

 

 

생각한 풀이 과정

  1. 19 x 19 바둑판에 처음 바둑알이 깔려 있는 상황인 2차원 리스트의 값을 입력합니다. 변수 go_board에 넣어줍니다.
  2. 십자 뒤집기 횟수 n을 입력합니다. 정수형으로 변환하고 변수 n에 넣어줍니다.
  3. 십자 뒤집기 횟수 n만큼 반복하는 반복문을 만들어줍니다.
  4. 십자 뒤집기를 하는 좌표 x, y를 입력합니다. 각각 정수형으로 변환하고 변수 x, y에 넣어줍니다.
  5. x는 가로줄을 의미하므로 go_board에서 가로줄을 의미하는 go_board[x-1]의 모든 바둑돌을 뒤집어줍니다.
  6. y는 세로줄을 의미하므로 go_board에서 가로줄을 하나씩 반복하면서 해당 가로줄에서 y 위치의 바둑돌을 하나씩 뒤집어줍니다.
  7. 모든 십자 뒤집기가 끝나고 나면, 십자 뒤집기가 끝난 후 바둑판의 상황을 출력합니다.



 

 

 

 

 

 

제출한 파이썬 코드

# readline을 사용하기 위해 import합니다.
from sys import stdin


# 바둑알이 깔려 있는 상황을 만들기 위해 바둑판 변수를 만들어줍니다.
# 각 가로줄을 의미하는 길이 19의 None으로 초기화된 바둑판으로 만듭니다.
go_board = [None] * 19

# 처음에 바둑알이 깔려 있는 상황을 만들어줍니다.
# 19 x 19 크기이므로 가로줄 19번 반복해봅니다.
for idx in range(19):
    # 한 가로줄에 각 바둑알이 깔려 있는 상황을 공백으로 구분해 입력합니다.
    # 각각 정수형으로 변환하고 리스트 변수로 만들어줍니다.
    go_board[idx] = list(map(int, stdin.readline().split()))

# 십자 뒤집기 횟수 n을 입력합니다.
# 정수형으로 변환합니다.
n = int(stdin.readline())

# 십자 뒤집기 횟수 n만큼 반복합니다.
for _ in range(n):
    # 십자 뒤집기 좌표 x, y를 입력합니다.
    # 각각 정수형으로 변환합니다.
    x, y = map(int, stdin.readline().split())

    # 입력한 x에 해당하는 가로줄의 모든 바둑돌들을 1을 0으로, 0을 1로 뒤집습니다.
    # 리스트의 실제 인덱스는 0부터 시작하고, 좌표는 1부터 시작하므로 x에 1을 빼야합니다.
    go_board[x-1] = list(map(lambda rock: int(not rock), go_board[x-1]))

    # 입력한 y에 해당하는 세로줄의 모든 바둑돌들을 1을 0으로, 0을 1로 뒤집습니다.
    # 리스트의 실제 인덱스는 0부터 시작하고, 좌표는 1부터 시작하므로 y에 1을 빼야합니다.
    for idx in range(19):
        go_board[idx][y-1] = int(not go_board[idx][y-1])

# 바둑판의 상황을 출력하는 반복문을 만듭니다.
for i in range(19):
    for j in range(19):
        # 바둑판에서 한 가로줄의 상황을 공백으로 구분해 출력합니다.
        print(go_board[i][j], end=' ')
    # 한 가로줄의 상황이 모두 출력되면 다음 가로줄의 상황을 출력하기 위해 다음 줄로 넘어갑니다.
    print()

 

 

 

제출 결과

결과

 

 

 

 

 

 

 

 

느낀 점

처음에 코드를 짰을 때는 제대로 짠 것 같은데 왜 결과가 제대로 안 나오지 생각했는데

십자 뒤집기 좌표들이 0부터 시작하지 않고, 1부터 시작한다는 것을 깨달았습니다.

그래서 단순히 1만 빼서 인덱스를 찾아보니 결과가 잘 나왔습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글