문제 출처 : 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. 배운 점
- 회전하는 것을 구현하는 것이 좀 복잡해서 막막했는데
직접 그려가면서 규칙찾아서 손코딩까지 한 뒤 구현하니까 편했다.
'Problem Solving > 삼성 SW 역량테스트 기출' 카테고리의 다른 글
✅[모의 SW 역량테스트] 핀볼 게임 (0) | 2021.10.15 |
---|---|
✅[모의 SW 역량테스트] 요리사 (0) | 2021.10.15 |
✅[모의 SW 역량테스트] 등산로 조성 (0) | 2021.10.14 |
[모의 SW 역량테스트] 미생물 격리 (0) | 2021.10.13 |
✅[모의 SW 역량테스트] 점심 식사시간 (0) | 2021.10.13 |
댓글