hoon's bLog

Java 프로그래머스 3진법 뒤집기 자바 본문

코딩테스트/프로그래머스

Java 프로그래머스 3진법 뒤집기 자바

개발한기발자 2022. 6. 11. 22:23
반응형

문제출처 : https://programmers.co.kr/learn/courses/30/lessons/77884

 

코딩테스트 연습 - 약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주

programmers.co.kr


[나의 풀이]

- 입력받은 좌우 값의 범위를 가지는 배열 rangeNum 선언

- 안 쪽 for문에서 rangeNum 인덱스의 약수를 ArrayList를 선언하여 약수값만 저장

- 약수의 개수를 홀짝 여부를 판단하여 연산

import java.util.ArrayList;
class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        int[] rangeNum = new int[right - left + 1];		//좌우측 숫자 범위만큼 배열 선언
        for(int i=0; i < rangeNum.length; i++){
            rangeNum[i] = left + i;
            ArrayList<Integer> arrList = new ArrayList<>();
            for(int j=1; j <= rangeNum[i]; j++){
            //약수들만 list에 담아 저장
                if(rangeNum[i]%j == 0){
                    arrList.add(j);
                }
            }
            //return 변수에 삼항연산자를 통해 홀짝여부를 판단 후 더해주기
            answer = (arrList.size()%2 == 0 ? answer+rangeNum[i] : answer-rangeNum[i]);
        }

        return answer;
    }
}

이 문제에선 각 범위별 나름 약수를 판별하고,

판별한 약수에 대한 값을 어떻게 처리할 것인지가 관건이였던 것 같다.

과연 고수분들은 어떻게 했을까? 두구두구두구두구두구~~~~~~~~~

 

[다른사람의 풀이-1]

class Solution{
	public int solution(int left, int right) {
    	int answer = 0;

        for (int i=left;i<=right;i++) {
            //제곱수인 경우 약수의 개수가 홀수
            if (i % Math.sqrt(i) == 0) answer -= i;
            //제곱수가 아닌 경우 약수의 개수가 짝수
            else answer += i;
        }
        return answer;
    }
}

 

[다른사람의 풀이-2]

class Solution{
	public int solution(int left, int right) {
        int answer = 0;
        //애초에 입력받은 left, right로 반복문의 범위 설정
        for(int i = left; i <= right; ++i){
            int count = 0;		//약수의 개수를 담는 변수
            for(int j=1; j<=i; ++j)
                if(i%j == 0) count++;
            
            //약수 개수의 홀짝을 판별하여 연산..
            if(count%2 == 0) answer += i;
            else answer -= i;
        }
        return answer;
    }
}

 

[정리]

- 역시 ArrayList까지 쓸 일이 아니였음... 조금만 더 생각해봤다면 불필요한 변수가 생기지 않았던 것
- 최대한 입력받은 값을 가지고 활용하는 사고가 코드를 더욱 간결하게 한다....

- 수학적 사고는 정말 멋지다........

 

개인피셜 난이도 : ★☆☆☆☆(난이도가 낮을 때를 행복해하자ㅠㅠ)

내 방식대로 했다면 1정도 겠지만, 단순히 반복문만을 이용해서 하라고 했다면

별 2개 이상인 것 같았다...

다른 분들의 코드 자체는 그렇게 복잡하지 않다.

하지만 늘 그렇듯, 복잡해 보이는 듯한 조건들을 간소화 하고,

간결하게 코딩을 한다는 것 자체가 기발하고 실력인것 같다.

다른 사람들 코드의 기발한 아이디어에 오늘도 무릎을 탁친다.

 

끝!

728x90
반응형