본문 바로가기
공부 일지/개인 공부 기록용

자바공부 43일차

by Joshbla 2022. 6. 19.

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로 나눈 값도 더한다.

 

'공부 일지 > 개인 공부 기록용' 카테고리의 다른 글

자바공부 45일차  (0) 2022.06.22
자바공부 44일차  (0) 2022.06.20
자바공부 42일차  (0) 2022.06.19
자바공부 41일차  (0) 2022.06.17
자바공부 40일차  (0) 2022.06.16