Day1 정답률 높은 문제 1
✒️ 2024-03-22 10:28 내용 수정
Day1 1단계 20240322
1. 평균 구하기
- 내 풀이 : 전체 배열 요소를 꺼내 합산한 후 배열의 길이로 나눈 결과를 반환한다.
class Solution {
public double solution(int[] arr) {
double answer = 0;
for(int i = 0; i < arr.length; i++) {
answer += arr[i];
}
return answer/arr.length;
}
}
- 다른 사람 풀이 중
Arrays.stream().average()를 사용한 풀이들이 존재했다.- 스트림의 연산#최종 연산의 메소드 참고.
import java.util.*;
import java.lang.*;
class Solution {
public double solution(int[] arr) {
return Arrays.stream(arr).average().getAsDouble();
}
}
- 두 풀이의 차이는 stream을 사용하는지 여부가 가장 크며, Stream 사용 시엔 스트림 API#유의 사항에 작성했던 내용을 참고하여 고려할 필요가 있다.
2. 짝수와 홀수
- 내 풀이 : 삼항 연산자를 사용하여 num을 2로 나눈 나머지가 0이면 Even을, 0이 아니라면 Odd를 반환하도록 했다.
class Solution {
public String solution(int num) {
return num%2==0 ? "Even" : "Odd";
}
}
3. 나머지가 1이 되는 수 찾기
- 내 풀이 : n을 나눈 나머지가 1이 되면 되므로 (n-1)의 1보다 큰 약수를 찾으면 된다.
- 만약 짝수라면 (n-1)의 약수 중 가장 작은 자연수는 2 이므로 2를 반환한다.
- 짝수가 아니라면 3부터 (n-1)까지 수 중에서 (n-1)을 나눈 나머지가 0이 되는 수를 찾는다.
- 사실 다른 사람들 풀이처럼 간단하게 n을 나눈 나머지가 1이 되는 조건만 넣으면 끝나지만 조금 다르게 꼬아서 생각해보느라 더 복잡해진 것 같다.
class Solution {
public int solution(int n) {
int answer = 0;
if ((n-1) % 2 == 0) return 2;
for(int i = 3; i <= n-1; i++) {
if((n-1) % i == 0) {
answer = i;
break;
}
}
return answer;
}
}
- 다른 사람 풀이 : 간단하게 n을 나눈 나머지가 1이 되는 answer를 구한다.
class Solution {
public int solution(int n) {
int answer = 1;
while(true) {
if(n % answer == 1) {
break;
}
answer++;
}
return answer;
}
}
4. 자릿수 더하기
- 내 풀이 : 이전에도 비슷한 문제가 많아 두 가지 방법을 시도해봤다.
- 1번 : int n을 (n+"")으로 String화 시킨 다음, split()을 사용하여 String 배열로 만들고, 각 배열 요소를 다시 Integer.parseInt()로 int 변환하여 합산했다.
import java.util.*;
public class Solution {
public int solution(int n) {
int answer = 0;
for(String str : (n+"").split("")) {
answer += Integer.parseInt(str);
}
return answer;
}
}
- 2번 : n을 10으로 나눈 나머지를 answer에 더하고, n=n/10으로 만들어 계속해서 각 자릿수별 나머지를 answer에 더한다.
- 1번 풀이와 테스트 결과를 비교해보면 압도적으로 빠른 것을 알 수 있다.
- int와 String 간의 타입 변환으로 처리하는 것보다 int 내에서 사칙연산 결과를 해결하는 것이 더 빠르다는 사실을 알 수 있다.
public class Solution {
public int solution(int n) {
int answer = 0;
while(n != 0) {
answer += n%10;
n /= 10;
}
return answer;
}
}
5. 문자열을 정수로 바꾸기
- 내 풀이 : Intger의 parseInt() 메소드로 String을 int로 변환한다.
class Solution {
public int solution(String s) {
return Integer.parseInt(s);
}
}
6. 약수의 합
- 내 풀이 : for문을 사용하여 1부터 n(자기 자신)까지 n으로 i를 나눈 결과가 0인 i를 모두 더했다.
class Solution {
public int solution(int n) {
int answer = 0;
for(int i = 1; i <=n; i++) {
if(n%i==0) {
answer += i;
}
}
return answer;
}
}
- 다른 사람 풀이 1 : 약수의 합을 구하는 문제이므로, 자기 자신의 절반을 넘는 수는 약수가 될 수 없다. 따라서 for문을 돌릴 때 1부터 n/2 까지의 숫자들 중 약수들을 합산하고, 해당 결과에서 자기 자신을 더하면(약수엔 자기 자신도 포함되므로) 위의 풀이의 절반도 안되는 for문 수행으로 답을 얻을 수 있다.
class Solution {
public int solution(int n) {
int answer = 0;
for(int i = 1; i <=n/2; i++) { // n/2까지만 loop를 돌리므로 더 효율적
if(n%i==0) {
answer += i;
}
}
return (answer + n); // 약수에는 자기 자신도 포함됨
}
}
- 다른 사람 풀이 2 : 다른 사람 풀이 1의 댓글들을 보던 중 n의 제곱근의 경우 제곱근을 기준으로 약수들이 짝을 이루기 때문에 n의 제곱근까지만 for문을 돌려도 된다는 내용을 봤다. 이 부분도 생각해보지 못해서 실제 구현하면 어떻게 될지 궁금했다.
- n의 제곱근이 정수라면 제곱근을 약수들의 합에 추가할 때 중복으로 들어갈 수 있기에 한 번만 넣도록 answer의 초기값으로 설정했다.
- 만약 제곱근이 정수가 아니라면 제곱근을 약수들의 합에 넣을 필요가 없으므로 answer의 초기값을 0으로 설정한다.
- for문을 i=1부터 n의 제곱근까지만 돌리고, i가 n의 약수인 경우 answer에 i와 n/i을 더해 loop 수를 줄일 수 있었다.
class Solution {
public int solution(int n) {
int answer = (Math.sqrt(n) == (int)Math.sqrt(n)) ? (int)Math.sqrt(n) : 0;
for(int i = 1; i < Math.sqrt(n); i++) {
if(n%i==0) {
answer += (i + n/i); // 약수와 그에 대응되는 약수쌍(몫)을 더함
}
}
return answer;
}
}