프로그래머스 문제풀이3

zitto·2023년 3월 27일
0

Algorithms

목록 보기
3/22
post-thumbnail

1. 같은 숫자는 싫어

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

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


입출력 예
arr answer
[1,1,3,3,0,1,1][1,3,0,1]
[4,4,4,3,3][4,3]

문제풀이

function solution(arr){
    let answer = []
    for(let i=0; i<arr.length;i++){
 //현재 인덱스값의 데이터와 바로 뒤에 있는 인덱스 값의 데이터가 동일하지 않을 때
      if(arr[i] !== arr[i+1])
          // console.log(arr,arr[i+1]);
          answer.push(arr[i])
    }
    return answer;
}

다른풀이

function solution(arr){
    let answer = [];     
   for(let i=0; i<arr.length;i++){
            //현재 인덱스값의 데이터와 바로 뒤에 있는 인덱스 값의 데이터가 동일하지 않을 때
//         if(arr[i] !== arr[i+1])
 if(arr[i] !== answer[answer.length-1]) 
 //console.log(arr,arr[i+1]);      
            answer.push(arr[i])
   }   
    return answer;
}
//filter로 연속적인 값을 삭제하는 방법
function solution(arr){
    const answer = arr.filter((el,i)=>{
        console.log(el,i,arr[i+1]);
        return el !== arr[i+1]   
    })
   return answer;
}

접근방법
1. 0부터 정수의 숫자가 들어온다.
2. 정답은 배열타입이므로 정답을 담을 수 있는 배열을 만들어줌.
3. 콘솔에 arr를 찍어본다.
4. 맨 앞부터 데이터를 하나씩 가져온다.
5. arr[i+1] 현재 인덱스의 다음 인덱스값을 가져올 수 있다.
6. 현재가지고 있는 인덱스값의 데이터를 넣어준다.
7. 배열에서 마지막 데이터 가져오는 법 사용하기

const arr = ["z","x","c"];
arr[arr.length - 1];
arr.at(-1) 
arr.slice(-1) //역행
console.log(arr[-1]);// 다른의미
'c'
'c'
[ 'c' ]
undefined
at은 속도적인 이슈가 있음.

2. 자릿수 더하기

문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한 조건
N의 범위 : 100,000,000 이하의 자연수


입출력 예
N / answer
123 6
987 24

문제풀이

function solution(n){
    n = String(n) //문자타입으로 바꿔줌 ->인덱스 접근 가능
    let answer = 0;
    for(let i=0;i<n.length;i++){
        console.log(i, n[i])
        //문자열 타입을 다시 숫자형으로
        answer += Number(n[i]) //asnwer = answer +n[i]
    }
    console.log(answer);
    // console.log(n,n[0],typeof n);
}

접근방법
1.숫자타입은 인덱스값으로 접근이 불가능하다.
2. 숫자와 문자가 더해져서 "숫자문자"
3. 연산하기 위해서는 다시 숫자형타입으로 바꿔줘야 한다.


다른풀이

function solution(n){
// const answer =String(n).split("") //문자열을 배열로 하나씩 나눠서 쪼개줌
    const answer =String(n).split("").reduce((acc,cur)=>{
      console.log(acc, cur, typeof acc);
        return Number(acc) + Number(cur)
    },0)
    return answer;
 // console.log(answer) //숫자타입을 문자열로 변환해서 저장
}

접근방법
1. 메소드이용하기
2. 배열로 만들어줘야 한다.
3. split메소드로 문자열배열을 만들어주기

3. 약수의 합

문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한 조건
N의 범위 : 100,000,000 이하의 자연수


입출력 예
N / answer
123 6
987 24

문제풀이

function solution(n) {
    const answer = n;
    for(let i=1; i <= n / 2; i++){
        if(n % i === 0){
            answer += i;
        }
    }
    return answer;
}
}

다른풀이

function solution(n) {
  const answer = new Array(n)//n개만큼의 빈배열을 생성 
                    .fill(1)//숫자 1로 전체배열을 채운다.
                    .reduce((acc, cur,i)=>{
            //1로 고정된 현재값과 1이 늘어나는 인덱스 값을 더하면 숫자범위를 표현할 수 있다.
                        const num = cur + i //현재값과 인덱스값을 더함.
                        console.log(acc, n,num)
                        if(n % num === 0){
                            console.log(n,num)
                            acc += num;
                        }
                        return acc;
                       // console.log(acc,cur,i,num) 
                    },0) //0 1 배열전체가 1밖에 없기 때문에 반복문 끝날때까지 출력
  // console.log(answer)
  return answer;
}
}
function solution(n) {
  const answer = new Array(n)//n개만큼의 빈배열을 생성 
                    .fill(1)//숫자 1로 전체배열을 채운다.
                    .reduce((acc, cur,i)=>{
                        const num = cur + i 
                        return acc + (
                            n % num === 0 ? num : 0
                        )
                    },0) 
  return answer;
}
function solution(n) {
  const answer = new Array(Math.floor(n / 2))//n개만큼의 빈배열을 생성 
                    .fill(1)//숫자 1로 전체배열을 채운다.
                    .reduce((acc, cur,i)=>{
                        const num = cur + i 
                        return acc + (
                            n % num === 0 ? num : 0
                        )
                    },n) 
  return answer;
}

접근방법
1. 반복문으로 n의 값을 하나씩 가져오기
2. 약수인지 구별하기 (약수는 a를 b로 나눴을 때 나눠떨어지면 b는 a의 약수
12를 3으로 나눌 때 떨어지니까 3은 12의 약수)
3. new Array()//인자에는 0을 포함한 자연수만 들어올 수 있음.

profile
JUST DO WHATEVER

0개의 댓글