코딩테스트/SWExpertAcademy

암호 Python(SW Expert Academy, SWEA)

멍토 2020. 5. 19.

난이도 : D3

문제번호 : 5120

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVJ1r6qfkDFAWg#

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

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

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

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

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

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

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

입력

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 첫 줄에 N, M, K가, 다음 줄에 1000이하의 자연수 N개가 주어진다. 3<=N, M, K<=1000

출력

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

예시

입력 출력
3
6 3 3
6 2 4 9 1 5
5 3 5
958 386 329 169 778
10 4 10
158 606 636 941 686 774 302 375 954 668
#1 5 6 1 9 13 4 2 8 6
#2 1736 2514 778 169 667 498 329 715 386 958
#3 826 1494 668 954 375 1052 677 302 774 2234

2. 문제풀이

처음에는 간단하게 모듈러 연산으로 구하려고 했는데 위치가 0일때 문제가 생겼다.

그래서 일정 길이를 넘어가면 리스트의 길이만큼 빼주는 작업을 하여 문제를 해결했다.


3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#D3 5120 암호
 
for t in range(1int(input()) + 1):
    #숫자 N개, M번째칸 추가, K회 반복
    N, M, K = map(int, input().split())
    linked_lisd = list(map(int, input().split()))
    index = 0
    for i in range(K):
        index += M
        #크기가 길이를 넘어가면 길이만큼 빼준다.
        if index > len(linked_lisd):
            index -= len(linked_lisd)
        # 위치가 0일경우
        if not index :
            linked_lisd.insert(0, linked_lisd[-1+ linked_lisd[0])
        #길이 위치에 있다면 제일마지막에 추가한다.
        elif index == len(linked_lisd):
            linked_lisd.append(linked_lisd[-1+ linked_lisd[0]) 
        #평범한 경우
        else : linked_lisd.insert(index, linked_lisd[index-1+ linked_lisd[index])
    #10개가 최대이므로 끊어서 뒤집어준다.
    result = reversed(linked_lisd[-10:])
    print('#{} '.format(t), end='')
    print(*result)

댓글

💲 광고입니다.