본문 바로가기

파이썬13

0으로 초기화된 2-차원 리스트 생성하기. 프로그래밍 문제를 풀다 보면, 0으로 초기화된 2차원 리스트를 만들어야 할 때가 종종 있다. 여러가지 방법이 있겠지만, 안 좋은 예 2가지와 좋은 예 한가지를 소개한다. 예시1(좋음) #시간이 오래걸리는 경우 N = 10 ** 4 arr = [[0] * N for _ in range(N)] 예시2(시간이 느림) #시간이 오래걸리는 경우 N = 10 ** 4 arr = [[0 for _ in range(N)] for _ in range(N)] 예시3(예상하지 못한 결과가 발생함) #참조를 잘못한 예 N = 10 ** 4 arr = [[0] * N] * N 먼저 간단하게, time라이브러리를 이용하여 시간을 측정해보자. 예시1(좋음) #time 라이브러리 임포트 import time #생성 전 시간 변수저장.. 2022. 6. 28.
백준 1307:마방진 코드수정 마방진 에서 데코레이터 부분 및 타입 어노테이션, 독스트링등을 작성하였다. map에 들어가는 함수에 parameter가 두개가 필요한데, 하나만 쓰는 방법만 알고 여러개를 사용하는 방법을 몰라서 새로 공부해서 적용해 보았다. functools.partial에서 d를 고정으로 적용하였더니 작동했다. def iterize(function): def wrapper(x, d): if isinstance(x, list): return list(map(functools.partial(wrapper, d=d), x)) else: return function(x, d) return wrapper @iterize def magic_plus(x, d): return x + ((N // 2) ** 2) * d import .. 2022. 6. 19.
1307:마방진 풀기 3, 4일차 결론적으로 풀었다! 그런데 아직 해야할 문제가 많이 남아있다.. 일단 코드가 너무 길고, 성능이 엄청 딸리진 않는데, 개선의 부분이 있을 것 같다. 제대로 만드려면 모든 마방진을 구현할 수 있는 알고리즘이 필요한데 그게 의문이다. 현재로써는 단순히 n을 넣으면 n * n에 해당하는 마방진 단 하나가 나오는데, 4 * 4는 880개의 마방진이 존재하고, 5 * 5 는275,305,224개가 존재한다니 참으로 엄청날 수가 없다. 모든 경우의 수를 제공 할 순 없겠지만, 100개정도는 랜덤으로 제공해야 제대로 된 알고리즘이 될거라고 생각한다. 아니면 차원을 높여서 3d구조의 마방진을 만드는것도 나쁘지 않을 것 같다. 그리고 1일차에 소개한 논문의 strachey 알고리즘이 끝까지 소개되어 있지 않은 상태였다... 2022. 6. 16.
마방진:1307 2일차. 오늘도 마방진문제에 대하여서 풀고 있다. 그전에 무작정 논문에 나온 알고리즘을 분석하여 적용하려 했는데, 구현이 꽤나 까다로운 것 같아 방향을 틀었다. 일단 마방진을 구현하기 위해서 시간 분석도는 차차하고, n이 홀수일때, O(N^2)안에 수행되는 de la Loubère의 알고리즘을 이용하기로 했다. def make_odd_magicsquare(n): #n^2크기 배열 생성 arr = [[0 for _ in range(n)] for _ in range(n)] #초기 인덱스 첫번째 행의 가운데 위치 now를 설정 now = [n // 2, 0] #주어진 규칙으로 숫자를 n^2번 배정한다. for i in range(1, n**2 + 1): x, y = now arr[y][x] = i new_x = x +.. 2022. 6. 14.