2차원 배열 변수 넣기 질문..(중복이 안되게끔 코드를 짜고싶어요!)

조회수 1167회

안녕하세요! 파이썬 초보자 입니다.

다름아니라 a와 같은 배열에 n,s,t,k값을 변수로 n : 20~28/ s,t,k : 20~27까지 모든 경우의 수를 다 따져서 sys 모듈을 이용하여 Noutput이라는 txt 파일로 출력을 했습니다.

여기서 n,s,t,k가 서로 중복되지 않게 (예를들어 n=20이면 s,t,k != 20이게끔) 코드를 짜고 싶은데 너무 어렵네요. 도와주시면 감사하겠습니다.

이미지

제 코드는 다음과 같습니다..

import sys

sys.stdout = open('Noutput.txt','w')

n=0
s=0
t=0
k=0   
a=[
  [0,   0,   0,   0,   0,   0,   0,  n],
  [0,   0,   0,   0,   0,   0,   0,  s],
  [0,   0,   0,   0,   0,   0,   0,  t],
  [0,   0,   0,   0,   0,   0,   0],
  [0,   0,   0,   0,   0,   0,   k],
  [0,   0,   0,   0,   0,  27],
  [0,   0,   0,   0, k+1],
  [n, s+1, t+1],
]

for n in range(20,28):
    a[0][7] = n
    a[7][0] = n
    for s in range(20,27):
        a[1][7] = s
        a[7][1] = s+1
        for t in range(20,27):
            a[2][7] = t
            a[7][2] = t+1
            for k in range(20,27):
                a[4][6] = k
                a[6][4] = k+1
                for i in a:
                    for j in i:
                        print(j,end=' ')
                    print()

sys.stdout.close()

1 답변

  • itertools의 permutations 을 사용하면 될 것 같습니다.

    간단한 예를 들어보면, 20, 21, 22 중에서 2개씩을 뽑아서 각각 n, s 라고 한다고 합시다. 이걸 itertools permutations 를 이용해서 하면 다음과 같습니다.

    from itertools import permutations
    for a, b in permutations([20, 21, 22], 2):
        print(a, b)
    

    결과

    20 21
    20 22
    21 20
    21 22
    22 20
    22 21
    

    이제 원하는 건, [20, ..., 28] 중에서 4개씩을 뽑아서, n, s, t, k 로 하면 됩니다. 단, s, t, k 가 28인 경우는 그냥 넘어가게 하면 됩니다.

    from itertools import permutations
    
    f = open('noutput.txt', 'w')
    
    for n, s, t, k in permutations(range(20, 29), 4):
        if 28 in (s, t, k): continue
        a = build_data(n, s, t, k)
        write_data(f, a)
    f.close()   
    

    OK?

    위 코드에서 사용된 build_datawrite_data는 다음과 같습니다.

    def build_data(n, s, t, k):
        return [
            [0,   0,   0,   0,   0,   0,   0,  n],
            [0,   0,   0,   0,   0,   0,   0,  s],
            [0,   0,   0,   0,   0,   0,   0,  t],
            [0,   0,   0,   0,   0,   0,   0],
            [0,   0,   0,   0,   0,   0,   k],
            [0,   0,   0,   0,   0,  27],
            [0,   0,   0,   0, k+1],
            [n, s+1, t+1],
        ]
    
    def write_data(f, a):
        for l in a:
            f.write(' '.join(str(n) for n in l) + '\n')
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)