python 2중 배열 문제&행,열 다루기
#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]