개발 이야기/알고리즘 및 코테 준비

python 2중 배열 문제&행,열 다루기

혁진 2023. 1. 11. 14:45

 #CodeUP 바둑알 십자 뒤집기 6096

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

 

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

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

codeup.kr

lst = [[0 for j in range(19)] for i in range(19)]
#j column, i row

#get input 
for i in range(len(lst)):
    lst[i] = list(map(bool, map(int, input().split())))

n = int(input())

for i in range(n):
    x, y = map(int, input().split())
    x, y = x-1, y-1
    for j in range(len(lst)):
        lst[x][j] = not lst[x][j]
        lst[j][y] = not lst[j][y]
    

for i in range(len(lst)):
    lst[i] = list(map(int, lst[i]))
    
for i in range(19):
    for j in range(19):
        print(lst[i][j], end=" ")
    print()

풀이에서 어려웠던 부분&생각해야할 부분:

1. input을 넣는 방법: 2중 list를 입력으로 받는데 이를 어떻게 넣어야할까 고민을 많이 했다. 

결국 #get input에서 보이는 바와 같이 각 행을 단위로 값을 집어넣었다. 

python에서 list를 2중으로 사용할 때 주의해야할 점은 바로 자료구조 형태(?)가 행이 차곡차곡 쌓인 형태이기에 특정 행을 접근한 다음, 원소에 접근한다는 것이다. 물론 numpy나 기타 import를 쓰면 더 쉽게 다룰 수 있다. 

 

2. 0,1로 바꾸기: 

모범풀이를 보면 0,1인 경우 각각의 case를 if-else처리하여 0->1, 1->0으로 바꾸어주었다. 이보다 쉽게 바꾸는 방법을 고민하다가 boolean을 이용하기로 했다. bool(0) = False, bool(1) =True 이기에 이를 이용했다.

이때 주의할 것은 바로 boolean으로 바꾸면 안된다는 것이다. 그러면 기본적으로 input은 string을 type으로 가짐으로 문자가 있으면 모두 true로 반환된다. 따라서 map을 두번 씌워 string -> int -> bool로 변환하였다. 

이후 not을 이용해 바꾸어주었다. 

 

3. 특정 행, 특정 열 바꾸기: 

특정 행에는 lst[index]로 접근이 가능했지만, 특정 열에는 접근이 힘들었다.  

특정 열에 접근하는 방법은 아래와 같다. 이 중 특정 행과 특정 열을 for문으로 도는 방법을 선택했다. 

a = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
# [0 2 4 6 8]을 출력해보자
#1 for loop 사용하기
b = []
for i in a:
    b.append(i[0])
print(b)

#2 python답게 for loop 쓰기
b = [i[0] for i in a]
print(b)

#3 zip 이용하기
b = list(zip(*a))[0]
print(b)

#pandas이용하기
import pandas as pd
df = pd.DataFrame(a)
df.iloc[,0] #index로 접근

#numpy로 접근
import numpy as np
b = np.array(a).T[0]