처음으로 시간초과가 났던 문제이다. 그리고 소위 말하는 '끌어온다'는 것이 뭔지 경험했다. 지금까지 기본기를 익힌다는 느낌으로 처음 생각한 것을 끝까지 구현한다는 자세로 임했다. 하지만 한편으로는 좋은 코드 짜왔다 할 수 없었다는 것을 깨달았다.
그리고 잘 짠 코드란 '필요한 것을 딱 필요한 만큼 사용한 가독성 좋은 코드' 임을 다시금 깨닫고 이 또한 중요한 기본기이며 앞으로 이를 잘 인지하고 코딩해야겠다 다짐했다.
public int solution(int number, int limit, int power) { // 리스트로 억지로 끌어온 답.
int answer = 0;
List<Integer> knightDmg = new ArrayList<>();
List<Integer> needIron = new ArrayList<>();
for (int i = 1; i <= number; i++) { // 1부터 int number 까지
for (int j = 1; j <= i; j++) { // 각 숫자의
if (i % j == 0) { // 약수를 구한다
knightDmg.add(j); // knightDmg에 저장한다
}
}
needIron.add(knightDmg.size()); // 각 숫자의 약수의 개수를 저장
knightDmg.clear();
}
for (int dmg : needIron) { // 각 숫자 약수의 개수를 출력
if (dmg > limit) { // int limit 보다 크면
dmg = power; // 해당 개수를 int power로 치환
}
answer += dmg; // 총 dmg를 구한다.
}
return answer;
}
public static int solution(int number, int limit, int power) {
int answer = 0; // 정석이지만 시간초과
int[] knightDmg = new int[number]; // int number 길이의 배열 생성
for (int i = 1; i <= number; i++) { // 1부터 int number 까지
int count = 0;
for (int j = 1; j <= i; j++) { // 각 숫자의
if (i % j == 0) { // 약수를 구하고
count++; // 카운트 한다
}
}
knightDmg[i - 1] = count; // 각 숫자의 배열에 카운트를 저장한다
}
for (int needIron : knightDmg) {
if (needIron > limit) {
needIron = power;
}
answer += needIron;
}
return answer;
}
public static int solution(int number, int limit, int power) {
int answer = 0;
int [] knightDmg = new int[number];
for (int i = 1; i <= number; i++) { // 1부터 number까지
Set<Integer> Dmg = new HashSet<>(); // 중복되는 약수를 제거하기 위한 Set 사용
for (int j = 1; j <= Math.sqrt(i); j++) { // 약수 구하는 공식 구현
if (i % j == 0) {
Dmg.add(i / j);
Dmg.add(j);
}
knightDmg[i-1] = Dmg.size(); // 구한 약수의 개수를 저장
}
}
for (int needIron : knightDmg) {
if (needIron > limit) {
needIron = power;
}
answer += needIron;
}
return answer;
}
}
[TIL#26] Study] 코딩 테스트 10 (1) | 2023.12.21 |
---|---|
[TIL#20] Study] 코딩 테스트 9 (0) | 2023.11.13 |
[TIL#18] Study] 코딩 테스트 7 (0) | 2023.11.10 |
[TIL#18] Study] 코딩 테스트 6 (0) | 2023.11.09 |
[TIL#17] Study] 코딩 테스트 5 (0) | 2023.11.08 |