티스토리 뷰

문제 설명

자연수 n이 매개변수로 주어집니다. n x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

 

제한 사항

3 ≤ n ≤ 1,000,000

 

더보기

풀이 과정

 

떠오른 로직

1. n을 x로 나눈 나머지가 1인 자연수를 뽑아서 배열로 만들어야겠다
2. 배열을 내림차순으로 정렬해야겠다
3. 배열의 [0]인덱스 숫자를 뽑아야겠다

 

입출력 예시

  1) 10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.

  2) 12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.

 

function solution(n) {
    let remainderOne = [];
    let Arr = remainderOne.filter((n,x) => n%x === 1); 
    let ascendingArr = Arr.sort(function(a,b){
        return a-b;
    })
    return ascendingArr[0];
}

 - 생각나는대로 쭉 쓰기 시작했다. n을 x로 나눈 나머지가 1인 자연수를 filter로 걸러서 빈 배열에 추가해야겠다는 생각을 했고, sort로 배열을 정렬해야겠다는 생각을 했다. 인덱스를 이용해 나름 가장 첫번째 요소를 뽑아내기도 했다. 그런데 안 된다. 뭐가 문제일까?

function solution(n) {
    for remainder(let i = 1; i<=n; i++){
    let remainderOne = [];
    let Arr = remainderOne.filter((n,x) => n%x === 1); }
    let ascendingArr = Arr.sort(function(a,b){
        return a-b;
    })
    return ascendingArr[0];
}

- 생각해 보니 자연수 n만 매개변수로 주고 x를 준다는 말은 없다. 그렇다면 반복문을 통해 하나하나 비교해야 한다고 생각했다. 기억에 있는 반복문을 쓰긴 했는데 어째 요상하다. x는 어디서 올 것인가?(지금 보니 for 문 작성하는 방법도 틀렸다.)

function solution(n) {
    for(let i = 1; i<=n; i++){
    let remainderOne = [];
    var arr = remainderOne.filter((n,i) => n%i === 1);}
    let ascendingArr = arr.sort(function(a,b){
        return a-b;
    })
    return ascendingArr[0];
}

 -구글링 검색을 해서 올바르게 for문을 작성하고, x가 i가 된다는 것도 이해해서 i로 바꿔 넣었다. 이제 진짜 되겠지.

안된다! 더 이상 고칠 방법이 생각나지 않았기에 지피티에게 도움을 청했다. 

 - 다 해본 건데, 배열에 값을 추가하는 방법이 filter가 아니라 push가 될 수 있다는 것이 눈에 띄었다. push면 하나씩 집어넣는 것일 테니 직관적으로도 더 나은 것 같다. 

function solution(n) {
    let remainder = [];
    for(let i = 1; i<=n; i++){
        if (n%i === 1){
        var answerArr = remainder.push(i);
    }
    var resultArr = answerArr.sort(function(a,b){
        return a-b;
    })
    
    return resultArr[0];
}}

- sort를 사용했는데 되지 않았다. 지피티한테 물어보니 push 메서드는 배열의 끝에 하나 이상의 요소를 추가하는 게 맞지만, push 메서드는 새롭게 추가된 후의 배열의 길이를 반환하기 때문이라고 한다. 배열 자체가 아니라 배열에 추가된 후의 배열의 길이를 반환한다고. 따라서 반환값 'var answerArr = remainder.push(i)'를 사용하지 말고 '  remainder.push(i)'를 그대로 갖다 쓰면 된다고 한다. 

function solution(n) {
    let remainder = [];
    for(let i = 1; i<=n; i++){
        if (n%i === 1){
        remainder.push(i);
    }
    var resultArr = remainder.sort(function(a,b){
        return a-b;
    })
    
    return resultArr[0];
}}

- 추가로 sort 메서드는 원본 배열을 직접 변경하기 때문에 resultArr에 정렬된 배열을 할당할 필요가 없고 remainder 자체가 정렬된다는 점을 수정하고, 

function solution(n) {
    let remainder = [];
    for(let i = 1; i<=n; i++){
        if (n%i === 1){
        remainder.push(i);
    }
    remainder.sort(function(a,b){
        return a-b;
    })
    
    return remainder[0];
}}

-반복문의 위치도 수정했다.(바보같은 실수였다.)

정답 코드

function solution(n) {
    let remainder = [];
    for(let i = 1; i<=n; i++){
        if (n%i === 1){
        remainder.push(i);
    }}
    remainder.sort(function(a,b){
        return a-b;
    })
    
    return remainder[0];
}

 

이제야 잘 작동한다.

 

다른 사람의 풀이

더보기
const solution = function(n) {
    for (let i=0; i<n; i++){
        if (n%i == 1){
            return i
        }
    }
}

 -반복문을 사용하는 건데 당연히 1부터 시작하니까 작은 순서대로 나오겠지..! sort를 사용할 필요가 없었고, 배열을 사용할 필요도 없었다. ㅠㅠ 팀원한테 물어보니 while 문을 사용해도 된다고 하니 while 문도 숙지해 놔야 겠다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함