TIL ~ 24.04.05

나머지가 1이 되는 수 찾기

wlsds00_ 2023. 12. 10. 00:06

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

// 1번
class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0
        
        for (x in 2 until n-1) {
            if (n % x == 1) 
            return x
        }
        return n - 1
    }
}

// 2번
class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0
        
        for (x in 2 .. n) {
            if (n % x == 1) 
            return x
        }
        return n
    }
}

 

갑자기 깃허브에 빈자리 만들기 싫어서 호텔 만들다가 하나 얼른 풀어봤다.

사실 중간까지는 잘 하고 있다고 생각했는데 내가 문제를 또 잘못 이해해서 엄청 막혔다. 고민하다가 결국 검색해서 다른 분 코드를 하나 찾아왔다. 이번엔 모르는 기능이 아니고 최대한 내가 아는 선에서 재현 가능한 코드로.

 

1번은 다른분의 풀이다. for 문 가운데에 있는 until이 뭘까 싶어서 찾아봤는데 

.. 로 표시하는건 뒤에 표시되는 숫자까지 포함하는거고, until은 뒤에 표시되는 숫자 미만까지만 포함한다.

즉 1 .. 3 은 1, 2, 3이고 1 until 3 은 1, 2 이다.

 

풀이를 공부하다보니 문제가 하나 생겼다. 내가 대체 왜 n - 1 이 들어가야 하는지를 이해를 못했다...

그래서 우선 until 대신 .. 를 넣었다. 어라? 돌아간다. until 로 다시 바꾸고 마지막 리턴값의 -1 만 지워봤다. 이건 밑에거가 오류가 난다. until로 쓰고 위에서 -1을 해줬다면 밑에서도 -1을 해줘야 한다는걸 깨달았다. 

그러면 ..는? 위쪽만 -1을 해줘도 정답이 나온다. 그런데 밑에 -1 을 추가해도 정답이 나온다...

심지어 위의 -1을 지우고 밑만 남겨도... 머리가 아파졌다.

사이트에서는 정해진 값의 정답여부만 가려줄뿐 다른 값까지 테스트 해보질 못해서 더 그런 것 같다. 

 

어쨌든 식이 돌아가는 구조는 이해했다. 내 식인 2번으로 설명하자면  x 에 2부터 n까지 값을 담고 밑에서 n을 x로 나눈값의 나머지가 1과 일치하면 x를 리턴하고 밑에서 n을 리턴한다. 

 

그러니까 예제 1에 담긴 x값은 2고 예제 2는 x가 10이 나온다. 3과 11보다 작은 자연수중엔 정답이 없으니까.

이거 한문제 이해하는데 한시간은 다 쓴것같다...

 

아래는 다른분들 풀이중에 짧은것을 골라와봤다. 

class Solution {
    fun solution(n: Int) = (1..n).first { n % it == 1 }
}

 

first는 찾은 값들 중에서 가장 앞의 값을 보여주는 함수라고 한다. 특정 조건을 만족하면서 첫번째 값을 리턴하게도 쓸 수 있다. 그리고 찾는 값이 없으면 오류가 난다. (이때 오류가 나지 않게 하려면 firstOrNull() 을 쓰면 된다.)

그러니까 1에서 n까지를 구한다음 n을 it (어디서 메모해둔게 생각나서 찾아보니 array의 인덱스 기능이라고 써놨던걸 찾았다.) 으로 나눠서 1과 같으면 정답... 이라고 이해했다.

 

그런데 복습해보려고 컴에서 다시 시도해보면 꼭 오류가 난다... 사이트에선 설정된 정보가 있는데 내 컴으로 옮기면 그게 없어지기 때문이겠지... 고쳐보려고 하는데 잘 안될때가 종종 있어서 고민이다.

 

+)아니 블로그에 매일 업로드하고싶어서 9일 맞춰서 올렸는데 풀이 틀린거 깨닫고 수정하다 날짜가...바뀌었다.