알고리즘/알고리즘 풀이

프로그래머스_나머지가 1이 되는 수 찾기 JAVA

데부한 2025. 1. 15. 12:52
반응형

커리큘럼 중 1번

아니 원래 커리큘럼에 대한 문제가 5개씩 밖에 없어 적은 느낌이라

10개씩 추천해달라 했는데 어메나 기존 데이터를 싹 날려서;;

다시 추천해줬다. 

그래서 새로운 마음으로 다시 시작하는 1번! 

'나머지가 1이 되는 수 찾기'다.

 

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

이 문제도 역시 풀어봤던 문제다.

예전 코드를 보는데;;

정말 총체적 난국이라 생각했다.

 

과거 코드

class Solution {
    public int solution(int n) {

        boolean isEven = n % 2 == 0 ? true : false;

        if(isEven) {
            for(int i = 1; i < n; i+=2) {
                if(n % i == 1) return i;
            }
        } else {
            for(int i = 2; i < n; i+=2) {
                if(n % i == 1) return i;
            }
        }


        return -1;
    }
}

짝수인지 홀수인지를 찾아내서 어쩌구 저쩌구 한 것 같은데....;;;;;;;;;;;;;

사실 왜 저렇게 짰는지 도저히 이해할 수 없는 코드다.

뭐 그때의 머리와 경험으로는 저게 최선이었겠지 싶다.

 

지금의 머리로 다시 생각해봤다.

좀 많이 고민했다. 뭔가의 규칙이 있을 거 같아 입출력 예를 보면서 

다양한 방식으로 계산해봤다.

산수도 잘 못해서 종이 없으면 생각 불가~

제일 먼저 입출력의 n이 10일때를 가정해서 나온 결과 값을 봤다.

결과 값은  3인데.. 뭔가 10에 -1을하고 난 값..9...의 약수를 구하면 될 거 같은 느낌이 들었다.

그래서 12에도 적용해보기로 함.

12 -1 = 11......!! 11은 1을 제외하고 본인밖에 약수가 없,,다!

그래서 냅다 코드로 작성했다.

 

약수 구했었을 때 for문 조건에 Math.sqrt()을 사용했던 기억이 있어

이번에도 그렇게 사용했다.

현재 코드

class Solution {
    public int solution(int n) {

        n -= 1;
        for(int i = 2; i <= Math.sqrt(n); i++) {
            if(n % i == 0) {
                return i;
            }
        }
        return n;
    }
}

코드가 많이 줄었다.

그리고 간결해진 것 같다.

근데 뭐 좋은 코드인지는 여전히 모르겠다.

 

다른 사람의 풀이

다른 사람의 풀이에서 1등한 풀이다.

뭔가 반복을 많이해서 시간이 좀 걸릴 것 같지만

그래도 다른 사람이 보기에 간결하고 짧고 잘 파악할 수 있다.

저번 프로젝트에서 프리 수석님이 어떨땐 복잡한 것보다 간결해서 더 좋은 것들이 있다고 하셨다.

이번이 그 예가 아닌가 싶다.

사람에게 더 친숙한 코드를 작성하는 법을 연습하자.

화이팅.

반응형