2022/06/19
- 프로그래머스 코딩테스트 연습 lv.1 [ 실패율, 약수의 개수와 덧셈, 3진법 뒤집기, 두개 뽑아서 더하기, 약수의 합, 예산]
- [3진법 뒤집기] : Integer.parseInt(A , B) A문자열을 B진법을 통해 숫자로 변환
- [두개 뽑아서 더하기] : TreeSet을 사용하면 배열에 담을 때 정렬이 되기때문에 따로 정렬을 하지 않아도 된다.
(HashSet + Arrays.sort 가 시간은 더 빠르다)
- [약수의 개수와 덧셈] : 제곱수인경우 약수의 갯수가 홀수, 아닌경우 짝수
- [실패율] 틀렸던 원인 분석 : 테스트케이스 5, [3, 3, 3, 3, 3] 을 넣어보면 rate에서 3층까지밖에 계산을 안하고 4층 5층값이 입력이 안됐다.
따로 4층, 5층까지 간 사람이 없는경우 0을 넣어주는 구문을 추가해서 해결했다.
import java.util.Arrays;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = {};
int S = stages.length;
int[] people = new int[N + 2];
for (int i = 0; i < S; i++) {
people[stages[i]]++;
}
double[] rate = new double[N];
for (int i = 1; i < people.length - 1; i++) {
if (people[i] == 0) {
rate[i - 1] = 0;
continue;
}
rate[i - 1] = (double) people[i] / S;
S -= people[i];
}
double[] temp = Arrays.copyOf(rate, rate.length);
Arrays.sort(rate);
boolean[] used = new boolean[N + 1];
answer = new int[N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < temp.length; j++) {
if (rate[rate.length - i - 1] == temp[j]) {
if (used[j] == false) {
answer[i] = j + 1;
used[j] = true;
break;
}
}
}
}
return answer;
}
}
- [약수의 합] : 다양한 방식을 생각해보자
N의 약수의 합을 구한다.
1번 방식) i = 1부터 N까지 나누면서 나머지가 0인 i를 더한다.
2번 방식) 1부터N/2까지 나누면서 나머지가 0인 i를 더하고 마지막에 N도 더해준다.
3번 방식) 1부터 √N까지 나누면서 나머지가 0인 i를 더하고 N을i로 나눈 값도 더한다.