오늘은 프로그래머스 1단계에서 특히 풀이가 간단한 문제 10개를 풀어봤다. 대부분 어렵지 않게 풀었지만 새로 알게된 부분도 있어서 정리해보려한다.
프로그래머스 코딩테스트 연습문제
https://programmers.co.kr/learn/courses/30/lessons/77884
코딩테스트 연습 - 약수의 개수와 덧셈
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주
programmers.co.kr
일정범위의 양수들에서 각각의 약수의 개수를 구해 짝수면 더하고 홀수는 빼는 문제였다. 약수를 구하는 가장 빠른 방법은 양수 n 을 제곱근만큼의 약수를 조사하고 이 약수들로 n을 나누면 모든 약수들을 구할 수 있다. 코드는 아래와 같다.
import java.util.ArrayList;
class Solution {
public int solution(int left, int right) {
int answer = 0;
for(int index = left;index<= right;index++){
if(getDivisors(index).size() % 2 == 0){ answer += index;}
else{answer -= index;}
}
return answer;
}
private ArrayList<Integer> getDivisors(int number){
ArrayList<Integer> divisors = new ArrayList<>();
double numberSqrt = Math.sqrt(number);
for(int index = 1;index <= numberSqrt;index++){
if(number % index == 0){
if(!divisors.contains(index)){divisors.add(index);}
if(!divisors.contains(number / index)){ divisors.add(number / index);}
}
}
return divisors;
}
}
그런데 다른사람의 풀이에서 신기한 것을 발견했다.
그냥 어떤 수가 제곱수면 약수의 개수가 홀수이고, 그 이외에는 약수의 개수가 짝수 인 것이다. 때문에 그저 number % Math.sqrt(number) == 0 만 판별해주면 약수의 개수의 짝수홀수 여부를 알 수 있었다.
이 풀이가 나중에 쓰이게 될줄은 모르겠지만 기억해 놔야겠다.
https://programmers.co.kr/learn/courses/30/lessons/12954
코딩테스트 연습 - x만큼 간격이 있는 n개의 숫자
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
programmers.co.kr
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
for(int i = 0;i < n;i++){
answer[i] = x + (long)x*i;
}
return answer;
}
}
정말 이 문제에서 해매게 될줄은 몰랐었다. 해맷던 부분은 반복문안에서 answer[i] 에 x+x*i 를 대입해주는 부분이다. answer는 long 배열이다. 때문에 우항이 int의 범위를 벗어나도 찰떡같이 저장될줄알았지만 아니었다. 변수 x와 i가 모두 int형 변수이기 때문에 우항에서의 정수는 모두 int형의 범위로 제한된다. 결국 우측의 연산이 int형 범위를 벗어나면 잘못된값을 배열에 저장하게 된 것이다. 이를 위해 (long)으로 형변환을 해주어서 문제를 해결할 수 있었다. 하지만 실제로 개발을 할 때는 int형 사용을 자제하고 더큰 정수를 사용할 수 있는 long 이나 BigInteger 등을 사용을 염두하는 것이 더 좋을 것 같다.
결론 및 느낀 점
오늘은 연속적으로 공부할 수 있는 환경이 아니었어서 많이 공부하지 못했다. 그래도 간단한 문제를 몇개 풀면서 내가 실수하는 부분들이 어딘지 알게 된 것도있어서 의미 있었다. 그래도 내일은 더 열심히 해야겠다.
'TIL' 카테고리의 다른 글
[2022-1-12] 스프링 핵심원리 - 기본편 : 싱글톤 컨테이너 (0) | 2022.01.12 |
---|---|
[2022-1-10]스프링 핵심원리 - 기본편 : 스프링 컨테이너와 스프링 빈 (2/2) / 프로그래머스 코딩테스트 연습문제 - 실패율 (0) | 2022.01.10 |
[2022-1-8] 스프링 핵심 원리 - 기본편 : 스프링 컨테이너와 스프링 빈 (1/2) / 프로그래머스 연습문제 - 폰켓몬(Set, HashSet) (0) | 2022.01.09 |
[2022-1-7] 프로그래머스 연습 문제 - 소수 만들기(조합, DFS 응용) (0) | 2022.01.08 |
[2022-1-6] 스프링 핵심 원리 - 기본편 : 프레임워크, IoC, DI (0) | 2022.01.07 |