오늘의 코딩 한 줄; 프로그래머스 level.1

Edwin·2023년 2월 20일
0

1) 약수의 합

문제 설명

  • 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한사항

  • n은 0 이상 3000이하인 정수입니다.

예를 들어 12가 들어오면, [1,12,2,6,3,4] 를 일단 배열로 만들 수 있어야 한다. for문으로 만들 수 있지 않을까?

일단은 쉽게 접근해서 풀었다. 0.15ms~0.03ms 내에서 문제가 풀렸다.

function solution(n) {
  	let acc=0;
    for(let i=1;i<n+1;i++) {
        if(n%i==0) {
            acc+=i
        }
    }
    return acc
}

다른 사람의 풀이를 보니, 변수 acc를 매개변수 자리에서 초기값을 주고 설정했다. 그런데 통과된 문제를 보니 0.01ms 정도 증가한 것 같다.

function solution(n, acc=0) {
    for(let i=1;i<n+1;i++) {
        if(n%i==0) {
            acc+=i
        }
    }
    return acc
}

다른 방법들도 많이 있으나, 이 정도가 적당한 수준인 것 같다.


2) 나머지가 1이 되는 수 찾기

문제 설명

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

제한사항

  • 3 ≤ n ≤ 1,000,000

위의 1번의 변형이다. 위를 배열로 만들고, 최소값을 구하면 되지 않을까? 정답률은 81.8%

function solution(n) {
  	let acc=[];
    for(let i=3;i<n+1;i++) {
        if(n%i==1) {
            acc.push(i)
        }
    }
    return Math.min(...acc)
}

for(let i=3;i<n+1;i++) 에서 i의 값을 1로 변경해주었더니 통과되었다. 문제를 잘못 읽은 것이었다. n이 3보다 크다고 했지, 결과가 3보다 크다고는 하지 않았다. 그런데 최소값을 준다고 하는 부분이면 실행되었을 때 가장 작은 수니 아래와 같이 기록해도 되지 않을까? 이렇게 되면 배열을 만들어줄 필요도 없다. 최소값에서 해결되면 함수의 실행 컨텍스트가 종료되는 것이다.

function solution(n) {
   for(let i=1;i<n+1;i++) {
       if(n%i==1) {
           return i
       }
   }
}

--

3) 콜라츠 추측

문제 설명
1. 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

  • 1-1. 입력된 수가 짝수라면 2로 나눕니다.
  • 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
  1. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
    예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한사항

  • 3 ≤ n ≤ 1,000,000
function solution(num, answer =0) {
    for(let i=0;i<500;i++) {
        if(num !==1) {
            num = num%2==0 ? num/2 : num *3 +1;
        } else {
            return answer = i
        }
    }
    return answer = -1
}

위의 문제가 풀이를 보면 해석은 되는데, 스스로 작성은 아직 못하겠다. 그래서 코드를 검색해왔다. 일단 for문은 500번까지만 돌아간다. 만약 조건문이 500을 넘어가면 반환된 값이 없기에 초기값으로 return answer =-1 두었다. 즉 중간에서 있는 조건문 내에서 해결이 된다면, return 아래는 실행되지 않을 것이다.

조건1) 만약 num이 1이 아니면으로 시작한다. 조건 안에 조건부 삼항 연산자가 들어가 있다. 저렇게도 사용할 수 있는 것 같다. 보면 num에 재할당이 이뤄지는데 짝수일 때면 num을 나눈 값이 그러나 짝수가 아니면 3을 곱하고 1을 더해준 값이 num에 재할당된다. 해서 넘이 1이 될떄까지 진행된다. 그리고 이렇게 1에 도달하는 횟수의 i 값을 answer에 재할당시켜 해당함수구문이 종료되게 하였다.


4) 문자열 내림차순으로 배치하기

문제 설명
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

function solution(s) {
    return s.split("").sort().reverse().join("");
}

먼저 배열로 만들어주고, 정렬을 시켰다. 그리고 해당 내용을 리버스시켜준다. 이때 대문자는 소문자보다 앞에 있기에 뒤집어주면 뒤로 간다. 그리고 공백단위로 합쳐주면 완성이다.

.sort().reverse()는 sort((a,b)=> a>b? 1:-1) 로 사용해도 된다.


05 약수의 개수와 덧셈

  • left~rigth까지의 숫자의 약수의 개수에 따라 +-
function solution(left, right) {
    //left~right 사이 숫자의 약수의 숫자에 따라서 배열 만들기, 
  	let even=[]
    let odd = []
    for(let j=left;j<=right;j++) {
        let count = 0;
        for(let i=1;i<=j;i++) {
        if(j%i==0) {
            count++
        }
    }
    count%2==0 ? even.push(j) : odd.push(j)
    }
    //짝수배열의 합에서 홀수배열의 합을 빼주기 
    return even.reduce((acc, cur)=> acc+cur,0)-odd.reduce((acc, cur)=> acc+cur,0);
}

다른사람 풀이 살펴보기

제곱근이 정수이면, 약수는 홀수구나...

function solution(left, right, answer=0) {
    for(let i=left;i<=right;i++) {
        if(Number.isInteger(Math.sqrt(i))) {
        	answer -= i;
        } else {
         	answer +=i;
        }
    }
 	return answer
}

5) 같은 숫자는 싫어

문제 설명

  • 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면, 배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

제한사항

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

나의풀이

function solution(arr){  
    return arr.reduce((unique, val, i, itemlist)=>itemlist.indexOf(val) === i ? [...unique, val] : unique, [])
}
  • const arr = [1, 1, 3, 3, 0, 1, 1] => 결과내가 예상한 결과 [1,3,0]
  • const arr = 〉 [4, 4, 4, 3, 3] => 결과내가 예상한 결과 [4,3]
  • 내생각은 [1,3,0] 이었지만, 결과는 [1,3,0,1] 이었다.

다시풀어보기

제한사항

function solution(arr) {
    let list = [];
    for(let i=0; i<arr.length; i++) {
        if(arr[i]!==arr[i+1]) {
            list.push(arr[i])
        } 
    }
    return list
}
profile
신학전공자의 개발자 도전기!!

0개의 댓글