본문 바로가기
Problem Solving/삼성 SW 역량테스트 기출

[모의 SW 역량테스트] 보물상자 비밀번호

by 파피 2021. 10. 14.

문제 출처 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo 

 

SW Expert Academy

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

swexpertacademy.com

 

#1. 설계 및 풀이

 

문제 : 보물상자에 적힌 숫자로 만들 수 있는 모든 수 중 k번째로 큰 수를 10진수로 출력
입력 : 4의 배수 N [8, 28]/ 숫자는 각각 [0, F]/ 크기 순서 k[, 28]
출력 : 문제와 동일
조건 :
1) 같은 수 중복제거해서 순서 정하기
2) n // 4번 회전

--> N의 범위가 작으므로 시뮬레이션대로 모두 연산가능

 

1. 주어진 숫자들을 4개씩 나누기

2. 변의 길이만큼 회전하면서 얻은 문자열을 set에 저장

3. 문자열을 16진수로 바꾸기

-> reverse후 (숫자 * 16**idx)을 더해주기

 

T = int(input())
for test_case in range(1, T + 1):
    n, k = map(int, input().split())
    nums = list(input())

    #1. 주어진 숫자들을 4개씩 나누기
    arr = []
    for i in range(4) :
        temp = []
        for j in range(i*n//4, i*n//4 + n//4) :
            temp.append(nums[j])
        arr.append(temp)

    #2. 변의 길이만큼 회전하면서 얻은 문자열을 set에 저장
    arr_set = set()
    for i in range(n//4) : # n//4만큼 회전
        new_arr = []
        new_arr.append([arr[-1][-1]] + arr[0][:-1])
        for idx in range(len(arr)-1) :
            new_arr.append([arr[idx][-1]] + arr[idx+1][:-1])

        for na in new_arr :
            arr_set.add(''.join(na))
        arr = new_arr

    #3. 문자열을 16진수로 바꾸기
    num_dic = {'A':10, 'B': 11, 'C':12, 'D':13, 'E' : 14, 'F' : 15}
    arr_set = list(arr_set)
    result = []
    for arr in arr_set :
        total = 0
        arr = arr[::-1]
        for idx in range(len(arr)) :
            if '0' <= arr[idx] <= '9' :
                total += int(arr[idx]) * (16 ** idx)
            else :
                total += num_dic[arr[idx]] * (16 ** idx)

        result.append(total)

    result.sort(reverse=True)
    answer = result[k-1]

    print("#" + str(test_case), answer)

 

#2. 배운 점

 

- 회전하는 것을 구현하는 것이 좀 복잡해서 막막했는데

직접 그려가면서 규칙찾아서 손코딩까지 한 뒤 구현하니까 편했다.

 

 

댓글