본문 바로가기

코딩테스트 \파이썬\자바/SWEA D4

[SWEA] 5120. [파이썬 S/W 문제해결 기본] 7일차 - 암호 D4 파이썬

문제출처

 

5120. [파이썬 S/W 문제해결 기본] 7일차 - 암호 - 파이썬

 

A사는 창립기념일 이벤트로 비밀번호 맞추기 대회를 열어, 최대 10개인 비밀번호를 맞추는 사람에게 기념품을 제공하기로 했다.

기념품을 받을 수 있도록 다음 조건에 맞는 비밀번호 찾기 프로그램을 작성하시오.
 

- 1000이하의 숫자 N개가 주어진다. 이때 시작 숫자가 정해지고, 첫 번째 지정 위치가 된다.

- 지정 위치부터 M번째 칸을 추가한다. 여기에 앞칸의 숫자와 뒤로 밀려난 칸의 숫자를 더해 넣는다. 추가된 칸이 새로운 지정 위치가 된다. 밀려난 칸이 없으면 시작 숫자와 더한다.

- 이 작업을 K회 반복하는데, M칸 전에 마지막 숫자에 이르면 남은 칸수는 시작 숫자부터 이어간다.

- 마지막 숫자부터 역순으로 숫자를 출력하면 비밀번호가 된다. 숫자가 10개 이상인 경우 10개까지만 출력한다.



다음은 N, M, K가 6, 3, 3이고, 주어진 숫자가 6, 2, 4, 9, 1, 5인 경우의 예이다. 6이 시작 숫자이자 첫번째 지정 위치가 된다.
 

6

2

4

9

1

5


(1) 3번째에 새로운 칸을 추가하고, 앞의 숫자 4와 뒤로 밀려난 9를 더해 칸을 채운다.
 

6

2

4

 

9

1

5

 

6

2

4

13

9

1

5



(2) 다시 3칸 뒤에 새로운 칸을 추가하고, 앞 뒤 숫자를 더해 넣는다.
 

6

2

4

13

9

1

 

5

 

6

2

4

13

9

1

6

5



(3) 다시 3칸 뒤에 칸을 추가하고 앞 뒤 숫자를 더해 넣는다.
 

6

 

2

4

13

9

1

6

5

 


 

6

8

2

4

13

9

1

6

5




암호는 역순인 5 6 1 9 13 4 2 8 6이 된다.


[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 첫 줄에 N, M, K가,

다음 줄에 1000이하의 자연수 N개가 주어진다. 3<=N, M, K<=1000

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

 


[풀이코드]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 120. [파이썬 S/W 문제해결 기본] 7일차 - 암호 D4 파이썬
 
class Node:
    def __init__(self, d=0, p=None, n=None):
        self.data = d
        self.prev = p
        self.next = n
 
class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0
 
def addList(lst, new):
    if lst.head is None: 
        lst.head = new 
        new.prev = new.next = new
    else:
        tail = lst.head.prev
        new.prev = tail
        new.next = lst.head
        tail.next = new
        lst.head.prev = new
    lst.size += 1
 
def printList(lst):  # 연결리스트 출력
    if lst.head is None:
        return
 
    cur = lst.head.prev
    cnt = lst.size
    if lst.size > 10: # 최대 10개이하로 출력
        cnt = 10
    for _ in range(cnt):
        print(cur.data, end=' ')
        cur = cur.prev
    print() 
    
 
#import sys
#sys.stdin = open('input.txt')    
 
for tc in range(1,int(input())+1):
    N, M, K = map(int,input().split())
    arr = list(map(int,input().split())) # 1차원 배열
    mylist = LinkedList()
    for val in arr:
        addList(mylist, Node(val))
 
    cur = mylist.head
    for _ in range(K): # 반복 K
        for _ in range(M): # 추가 M
            cur = cur.next
        prev = cur.prev
        new = Node(prev.data + cur.data, prev, cur)
        prev.next = new
        cur.prev = new
        cur = new # 새로 추가된 위치를 시작위치로 재설정
        mylist.size += 1
    print(f'#{tc}', end=' ')
    printList(mylist)