인프런 커뮤니티 질문&답변

날다람쥐님의 프로필 이미지

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

섹션 3 탐색&시뮬레이션- 10 스도쿠 문제 질문입니다.

해결된 질문

20.05.11 18:00 작성

·

319

0

4중 for문을 하기 싫어서  체크리스트를 3중 리스트로 만들어서 풀었습니다.

3중 리스트 요소를 모두 더하고 싶습니다,

넘파이나 itertools를 사용하면 되긴 하는데 코딩 시험이라 사용을 못할수 있을꺼 같아서

기본적으로 2중~ 다중리스트 sum을 하는 방법이 sum(2중 리스트, []) 이런 방법으로 1차원 리스트로 풀어서 합하는 방법말고는 없나요? 검색해도 잘 안나오네요 

답변 3

1

김태원님의 프로필 이미지
김태원
지식공유자

2020. 05. 11. 22:57

다중리스트의 모든 합을 한번에 구해주는 함수가 존재하는지 저도 모르겠습니다. 죄송합니다.

저 같았으면 이렇게 sum([sum(ch3[i][j]) for i in range(3) for j in range(3)]) 리스트 컴프리헨션을 썼을 것 같습니다.

sum 함수를 이용해 다중리스트를 1차원 리스트화 하는 법은 이정민님을 통해 처음 알았습니다. 둘의 수행시간을 아래 코드로 측정해보니 sum으로 1차원화 해서 더하는게 조금 더 좋습니다. 

import time

def Test():
    ans=0
    for i in range(100000):  
        ch3[2][2][0]=i
        #ans+=sum(sum(sum(ch3, []), []))
        ans+=sum([sum(ch3[i][j]) for i in range(3) for j in range(3)])
    return ans

if __name__=="__main__":
    ch3=[[[1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1]],
         [[1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1]],
         [[1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1]]]
    start = time.time()
    print(Test())
    end = time.time()
    print("Time: {} sec".format(end-start))

 

참고로 3차원 리스트를 ch_m=[[[0]*9]*3]*3 처럼 하면 [0]*9라는 동일 객체가 9번 복사되는 것입니다. 이렇게 생성하면 ch_m[0][0][0]=1을 하면 9개의 모든 0번 인덱스에 1이 기록됩니다.

3차원 리스트 생성은 ch_m=[[[0]*9 for _ in range(3)] for _ in range(3)] 처럼 해야 합니다.

0

김태원님의 프로필 이미지
김태원
지식공유자

2020. 05. 13. 00:19

채점데이터 수정해 놓았습니다. 1번 데이터에서 위에 코드가 통과되지 않을 겁니다.

0

날다람쥐님의 프로필 이미지
날다람쥐
질문자

2020. 05. 12. 21:22

3차원 리스트 만드는거 정말 나중에 시험 볼때 실수를 할뻔 했습니다. 감사합니다.

혹시 테스트 케이스 추가가 나중에 가능하시다면 하나 더 추가하면 좋을꺼 같습니다.

잘못된 방법으로 만든 3차원 리스트로  테스트 케이스가 모두 통과가 되었네요.