프로그래머스

프로그래머스 #2 재활 치료

링규 2022. 4. 29. 13:56

 

 

 

4. 하샤드 수

https://programmers.co.kr/learn/courses/30/lessons/12947

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

programmers.co.kr

 

class Solution {
    public boolean solution(int x) {
        boolean answer = true;
        char[] arr = Integer.toString(x).toCharArray();
        int sum = 0;
        
        for(int i=0; i<arr.length; i++){
            sum += arr[i]-48;
        } // 모든 자릿수의 합을 구하기
        
        if(x%sum!=0) answer=false; 
        
        return answer;
    }
}

 

1) int인 x를 String으로 변환(Integer.toString( )) -> char array에 넣음(toCharArray())

2) for문으로 각자리 수의 값을 더함 (char형을 int형으로 형변환 시 아스키 코드 값이 저장되므로 -48을 빼주거나(1의 아스키코드값은 49, 2는 50 ... 이므로) Character.getNumericValue() 함수를 통해 연산될 수 있도록 함 

3) x와 sum의 나누기 연산의 결과가 0이 아니라면( 나머지가 있다면 ) answer = false

 

 

 

5. 평균 구하기

https://programmers.co.kr/learn/courses/30/lessons/12944

 

코딩테스트 연습 - 평균 구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. 제한사항 arr은 길이 1 이상, 100 이하인 배열입니다. arr의 원소는 -10,000 이상 10,000 이하인 정수입니다. 입출력 예 arr

programmers.co.kr

 

class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        int sum = 0;
        
        for(int i=0; i<arr.length; i++) {
            sum += arr[i];
        }
        
        answer = (double)sum/arr.length;
        return answer;
    }
}

 

int와 int 연산의 결과는 int가 나오기 때문에 (소수점 이하 자리는 절삭됨) 두 변수 중 하나라도 doublue로 형변환 해줘야 결과가 제대로 나온다고 배웠었는데 다른 사람의 풀이를 봤을 때 형변환 하신분이 없는 것 같음... 흐으음... 

근데 저 형변환을 안하면 통과가 안되던데 뭐지 내가 눈치 못채고 있는 다른게 있는건가 

 

아래는 for each 문을 써보라는 조언을 보고 고쳐본 코드

 

class Solution {
    public double solution(int[] array) {
        int sum=0;
          for(int i: array){
           sum += i;
          }

        return (double)sum/array.length;
    }
}

 

foreach 문이 정말 편하긴한데 왜 이렇게 머리에 안들어오는지 모르겠다 ㅠㅠ 

 

 

6. 콜라츠 추측

https://programmers.co.kr/learn/courses/30/lessons/12943

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 

class Solution {
    public int solution(int num) {
        long target = num;
        int count = 0;
        
        while(target != 1) {
            if(target%2==0) target /= 2;
            else target = target*3+1;

            count ++;

            if(count>=500) {
                count = -1; break;
            }    
        }
        
        return count;
    }
}

 

1) num은 1이상 8,000,000 이하의 수 이므로 홀수일 경우 *3 연산에서 int 범위를 넘어간다 (int형의 범위 -2,147,483,648 ~ 2,147,483,647) -> long 변수로 num을 옮겼다 

2) while문으로 제시된 명령을 target이 1이 될 때 까지 반복 + 할때마다 count++ -> count 가 500이 넘을 경우 break로 while문을 빠져나간다 

 

 

 

7. 최대공약수와 최소공배수

https://programmers.co.kr/learn/courses/30/lessons/12940

 

코딩테스트 연습 - 최대공약수와 최소공배수

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의

programmers.co.kr

 

class Solution {
    public int[] solution(int n, int m) {
        int divisor = 0;
        int a = n<=m ? n : m;
            
        //최대 공약수 
        for(int i=1; i<=a; i++) {
            if(n%i==0 && m%i==0) divisor = i;
        }
            
        //최소 공배수
        int multiple = (n/divisor) * (m/divisor) * divisor;
        
        int[] answer = {divisor, multiple};
        return answer;
    }
}

 

1) 최대 공약수는 두 수 중 작은 수보다 클 수 없으므로 n과 m 중 작은 수를 찾는다 ( int a ) 

2) a보다 크지 않은 수 중 둘 다 나누어 떨어지게 할 수 있는 가장 큰 값을 찾는다 

3) 최대 공약수를 알기 때문에 최소 공배수는 단순 계산으로 구할 수 있다 ( 주어진 두 수를 각각 최대 공약수로 나눈 몫 끼리 곱하고 거기에 최대 공약수를 곱하면 최소 공배수가 나온다 )

4) 배열에 넣고 return