[백준 / 1422] 숫자의 신 - Python
https://www.acmicpc.net/problem/1422
1422번: 숫자의 신
첫째 줄에 K와 N이 공백을 사이에 두고 주어진다. K와 N은 각각 1,000보다 작거나 같은 자연수이고, N은 K보다 크거나 같다. 둘째 줄에는 K개의 수가 한 줄에 하나씩 주어진다. 각 수는 1,000,000,000보
www.acmicpc.net
<접근>
수를 입력받아서 list에 저장한다. 리스트에 있던 기존의 수와 비교해서 앞에 넣을지 뒤에 넣을지 큰 수로 비교한다. 무조건 N개의 수들은 한 번씩 들어가야 하고, K번을 뽑아야 한다. 따라서 K가 더 큰 경우 반복되어야 할 수가 존재한다. 제일 큰 수를 반복하면 된다.
- 모든 수를 비교하여 앞에 넣을지 뒤에넣을지 판단
- 숫자적으로 제일 큰 수를 반복한다.
<입력 및 선언>
K, N = map(int, input().split())
numList = []
maxNum = 0
for _ in range(K):
input_num = input()
if int(input_num) > int(maxNum):
maxNum = input_num
수의 개수 K와 뽑을 개수 N을 입력받는다.
숫자들을 담을 numList를 선언하고, 반복할 최대수인 maxNum을 0으로 설정한다.
K 만큼 수를 입력받을 거니 반복해준다. 만약 입력받은 수가 maxNum보다 크다면 더 큰 수이므로 maxNum을 갱신해준다.
<정렬>
insertNum = False
for i in range(len(numList)):
temp1 = ''.join(numList[:i])+input_num+''.join(numList[i:])
temp2 = ''.join(numList[:i+1])+input_num+''.join(numList[i+1:])
if int(temp1) >= int(temp2):
numList.insert(i, input_num)
insertNum = True
break
if not insertNum:
numList.append(input_num)
insertNum은 마지막까지 수가 삽입되지 않았을 때 끝에 넣어주기 위한 변수이다.
numList를 앞에서부터 차례대로 돌면서 더 큰 위치에 수를 삽입할 것이다.
temp1은 입력 받은 수를 차례대로 앞에 넣은 수이고, temp2는 입력받은 수를 하나 뒤에 넣은 수이다. 만약 temp1이 더 크다면 해당 넣은 위치에 해당 수를 삽입한다. 수가 삽입됐으므로 insertNum을 True로 바꿔주고 해당 for문의 반복을 멈춘다.
만약 마지막까지 삽입이 되지 않았다면 input_num은 작은 수이므로 맨 마지막에 수를 삽입해준다.
<출력>
answer = ''
for i in numList:
if i == str(maxNum):
answer += i*(N-K+1)
maxNum = -1
else:
answer += i
print(int(answer))
정답을 담을 answer을 선언한다.
numList가 순서대로 정렬되어 있으므로 순서대로 answer에 담는다.
최대수를 반복해야 하므로 maxNum을 찾으면 N-K의 차이만큼 반복해준다. (원래 한번 넣어야 하므로 +1). 만약 최대수가 두 번 입력되면 해당 조건문에 두 번 들어가게 되므로 한번 설정한 이후에 maxNum을 -1로 바꾸어 준다.
<전체 코드>
K, N = map(int, input().split())
numList = []
maxNum = 0
for _ in range(K):
input_num = input()
if int(input_num) > int(maxNum):
maxNum = input_num
insertNum = False
for i in range(len(numList)):
temp1 = ''.join(numList[:i])+input_num+''.join(numList[i:])
temp2 = ''.join(numList[:i+1])+input_num+''.join(numList[i+1:])
if int(temp1) >= int(temp2):
numList.insert(i, input_num)
insertNum = True
break
if not insertNum:
numList.append(input_num)
answer = ''
for i in numList:
if i == str(maxNum):
answer += i*(N-K+1)
maxNum = -1
else:
answer += i
print(int(answer))