Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- mst
- java
- 구현
- 수학
- JUnit 5
- 유니온 파인드
- dfs
- Effective Java
- 후니의 쉽게 쓴 시스코 네트워킹
- 그리디
- 백트래킹
- 위상정렬
- swea
- 프로그래머스
- Kotlin
- 세그먼트 트리
- Network
- 에라토스테네스의 체
- 시뮬레이션
- 알고리즘
- 이분탐색
- 플로이드-와샬
- CS
- 투 포인터
- 문자열
- 스택
- 동적계획법
- 완전탐색
- BFS
- 백준
Archives
반갑습니다!
[프로그래머스] 최고의 집합 본문
풀이
이 문제는 그리디하게 해결했다. 이 문제의 핵심 아이디어는 곱하는 수들 간의 차이가 가장 적게 하는 것이다.
만약 s가 9이고, n이 3이라고 가정해보자. 이 때는 3, 3, 3을 곱해야 가장 크다는 것을 직관적으로 알 수 있을 것이다. 이번엔 s가 24이고 n이 6을 생각해보자. 이 역시 4, 4, 4, 4, 4, 4를 곱해야 최대값이 된다는 것을 알 수 있다. 지금까지의 예시는 모두 s를 n으로 나눈 나머지가 0인 경우였다.
이번엔 s가 n으로 나누어떨어지지 않는 경우를 생각해보자. s가 11이고 n이 3인 경우이다. 이 경우 역시 위의 핵심 아이디어에서 말한거처럼 가장 근접한 수들 3개의 곱으로 만들고 싶다. 이는 3, 4, 4가 된다는 것을 알 수 있다. 이것을 어떻게 구현해야할까? 11을 3으로 나누면 나머지가 2가 된다. 이 말은 9는 3으로 나누어 떨어진다는 말이 된다. 그렇기 때문에 3, 3, 3을 배열에 저장한 뒤, 나머지 2를 하나씩 더해주는 방식을 사용하면 된다. 이러한 방법으로 3, 4, 4를 구할 수 있다.
아래의 코드에서는 나머지가 0인 경우와 0이 아닌 경우의 분기를 나누지 않고 구현했다는 것을 참고하기 바란다.
코드
C++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
vector<int> solution(int n, int s) { | |
vector<int> answer; | |
// 집합을 만들 수 없는 경우 | |
if(s < n) return {-1}; | |
int rest = s % n; | |
// n개의 수를 벡터에 저장 | |
for(int i=0; i<n; i++) answer.push_back((s - rest) / n); | |
// 나머지만큼 1 증가시켜준다 | |
for(int i=0; i<rest ;i++) answer[i]++; | |
// 오름차순으로 정렬 | |
sort(answer.begin(), answer.end()); | |
return answer; | |
} |
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 1644 소수의 연속합 (0) | 2020.10.23 |
---|---|
[백준] 2631줄 세우기 (0) | 2020.10.22 |
[프로그래머스] 섬 연결하기 (0) | 2020.10.21 |
[백준] 1915 가장 큰 정사각형 (0) | 2020.10.20 |
[백준] 17472 다리 만들기 2 (0) | 2020.10.19 |