Problem : 숫자의 신
유형 : 그리디
문제 해석
- 입력으로 들어오는 K개의 수를, 각자 최소 한번씩 이용하여 총 N번을 사용하라.
- 이때
K <= N <= 1000
이다. {2,3,7}
(K = 3), 일때 N이 4인경우 전부 한번씩 사용하고(3) 732 + 7은 한번더 사용하여(1) 답은 7732가 된다.- 숫자는 자연수만 들어오고 10억 이하이다.
해결전략
- 바로 이전 풀었던 16496 큰수만들기와 굉장히 유사한 문제이다.
- 정렬을 시키는데 정렬기준을 두개의 수를 연결했을때, 가장 큰수가 되는 방법으로 정렬한다.
- N이 K보다 큰경우, 값으로 가장 큰 숫자가 해당 숫자가 나오는 위치에서 반복되어야 한다.
- {7, 88 9} 이 있고 4번사용되어야 한다면 88이 제일크므로
- 결과는 9/88/88/7 이 되어야한다.
구현
- 정렬기준을 문자열 기준
num1 + num2 > num2 + num1
으로 잡는다. - N이 K보다 큰 경우, 가장 큰숫자를 찾고
N-K
횟수만큼 반복해 출력한다. - 가장 큰숫자를 찾는 과정은 어차피 N이 1000이하이므로
O(N)
으로 그냥 한번 돌며 찾으면된다.
주의할점
- 이 문제에서는 0을 자연수로 삼지 않는다.
- 0을 자연수로 생각하느냐는 그떄 그떄 다르다…
- 정규 교과 과목에서는 자연수로 삼지않고, 이산수학과 같은 고등 과정에서는 자연수로 삼는다.
- https://www.acmicpc.net/board/view/52247
- 개인적으로 양의 정수, 혹은 0을 포함한 양의 정수로 표현해주었으면 좋겠다..
코드
1 |
|
참고, 피드백
인풋
1 |
|
Mac
1 |
|
- Mac 컴파일 정렬 결과
ideone c++14, mingw
https://ideone.com/xmtavm
-
온라인 IDE ideone 정렬 결과
- 아직도 이해할 수 없지만 MAC의 g++ 에서 정렬이 자꾸 이상하게 수행 되었다.
- 처음에는 clion 문제인가 싶어서, 콘솔에서도 직접 g++ 명령을 통해 컴파일을 시도해보았지만 여전히 결과가 이상하게 나왔다..
- 사진은 없지만 데스크탑의 mingw로도 ideone 와 같은 결과를 내놓았따.
- 계속 내 로직상의 문제인가 싶어서 삽질했는데…. 원인은 아직 찾지 못했고, 앞으로도 비슷한 일이 생기면 온라인 IDE로 한번 컴파일을 해보아야곘다.
- 어차피 cpp는 ps 용으로만 사용할꺼기 떄문에, 개발에는 영향없으니!
왜 이런 문제가 발생하는지 아시는분은 댓글 꼭 달아주세요!!