코딩 테스트 연습/프로그래머스 level 1

[프로그래머스] lv1. 나머지가 1이 되는 수 찾기 (JS)

카누가 좋아요 2023. 7. 1. 15:26

❓ 문제

코딩테스트 연습 - 나머지가 1이 되는 수 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡 해결하기

n을 x로 나눈 나머지가 1이 되게 하는 가장 작은 자연수를 찾으라고 하였으므로 1부터 수를 1씩 증가시키면서 그 수로 n을 나누었을 때 나머지가 1이 나오면 그 수를 return하도록 코드를 작성하면 된다.

문제 해결법은 매우 간단하지만 코드를 작성하는 방법은 여러가지이다. 위 풀이법이 여러 코드를 관통한다.

 

 

 

💻 JS로 코드 작성해보기 

1️⃣ 정석적인 방법

n을 나눌 수는 1부터 시작, 무한 반복을 기본으로 하여 n을 i를 나누었을 때 나머지가 1이면 그때의 i를 반환하고 함수 종료, 나머지가 1이 아니면 i를 1 증가시켜 나머지가 1인지 확인하는 과정 반복

 

function solution(n) {
  let i = 1;
  while (true) {
    if (n % i === 1) return i;
    else i += 1;
  }
}

 

여기서부터는 다른 사람의 코드이다.

 

2️⃣ 정석적인 방법에서 일부 변형

함수 실행문에서 n을 나눌 수를 정의하지 않음. solution 함수의 인자에서 미리 정의하고 들어감.

(solution 함수에 n에 대한 수밖에 인자로 들어오지 않는다면 x의 값은 적어 놓은 대로 1이 적용됨. 이 문제에서는 무조건 인자가 1개만 들어가기 때문에 x는 항상 1부터 시작됨.)

while문에서 후위 연산자 사용 가능

 

// x의 초깃값은 1로 설정
function solution(n, x = 1) {
  // while에서 증감이 가능
  // 후위 연산자이므로 다음번에 x에 1이 증가된 상태가 됨.
  while (x++) {
    // 여기에서 x가 1이 증가된 상태가 됨. 어차피 x = 1일 때는 모든 경우에서 나머지가 1이 나오는 것이 불가하므로 2부터 시작
    if (n % x === 1) {
      return x;
    }
  }
}

 

3️⃣ 삼항 연산자와 재귀 사용하기

이 경우에도 solution 함수의 파라미터가 2개가 됨. 만약 n을 x로 나눈 나머지가 1이면 x를 반환하고 끝내고, 1이 아니라면 solution 함수에 n과 x에 1이 증가된 값을 넣어 재귀 호출을 한다. n % x === 1이 true가 될 때까지x를 1씩 증가시키면서 재귀 호출이 일어나는 것이다.

x의 초깃값은 1로 설정하든 0으로 설정하든 2로 설정하든 상관 없다. 어차피 0과 1은 모든 수를 나누어 떨어지게 하기 때문에 나머지가 1이 나올 수 있는 경우가 없고, 따라서 2부터 확인하기 시작해도 되는 것이다.

 

function solution(n, x = 0) {
  return n % x === 1 ? x : solution(n, x + 1);
}

 

❗ 그런데 위처럼 재귀를 사용하는 경우 StackOverflowError를 마주할 수 있기 때문에 오류를 피하려면 1, 2번 코드들처럼 반복문으로 작성하는 것이 좋다. (실제로 3번 코드는 테케 1번에서 런타임 에러가 난다.)

 

 

 

🙂 돌아보기

아주 간단한 문제이지만 여러가지 코드가 나올 수 있다는 것이 흥미로워 블로그에 기록해 보았다.