프로그래머스 문제풀이 4

zitto·2023년 3월 27일
0

Algorithms

목록 보기
4/22
post-thumbnail

1.x만큼 간격이 있는 n개의 숫자

문제 설명
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건
x는 -10000000 이상, 10000000 이하인 정수입니다.
n은 1000 이하인 자연수입니다.


입출력 예
x / n / answer
2 5 [2,4,6,8,10]
4 3 [4,8,12]
-4 2 [-4, -8]

문제풀이

function solution(x, n) {
    let answer = [];
    for(let i = 1; i<=n; i++){
         answer.push(i*x)
    }
    return answer;
}

다른풀이

function solution(x, n) {
  const answer = new Array(n)
                .fill(1)
                .map((el,index)=>{
                    const num = el+index
                    // console.log(el,index,index * num)
                    return num * x;
                })
  console.log(answer);
    return answer;
}

접근방법
1. 2의 배수만큼 증가한다.
2. x의 배수가 n개 만큼 증가함.
3. answer라는 빈배열을 만든다.
4. 배열의 길이가 n을 충족할때만큼 반복문을 만든다.
5. i가 0부터 시작해서 n까지 포함한 값을 출력해본다.
6. i를 이용해 배수값을 구해온다.
7. i * x 를 해주면 0,2,4,6,8,10 으로 나옴
8. 0부터 시작하므로 i를 1부터 시작하도록 함.
9. 배열을 리턴하는 메소드를 사용해보자!
10. map은 배열타입, 그러나 지금은 배열데이터를 가지고 있지 않음.
11. 콘솔로 x,n값을 찍어보면 차례대로 가져올 수 있음.
12. 숫자데이터를 이용해 새로운 배열을 만듬
13. 빈배열은 하나의 데이터로 가득 채워줘야 함 fill메소드이용!
전체를 원하는 데이터로 채워줄 수 있음.
14. 1이 n만큼 출력됨.

map과 forEach의 차이점
쓰임에 차이가 있다.
map은 변수값에 담아둘 수 있다.
map은 return값이 존재하지만
forEach는 return하는 값이 업기 때문에 변수에 할당하는 것 자체가 불가능함.
map은 원하는 배열을 리턴받기 위해 사용하는 것인데
단순하게 사용하는데 쓰이기에는 알맞지 않음
그럴때는 forEach가 적절함.


2. 문자열 다루기 기본

문제 설명
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 조건
s는 길이 1 이상, 길이 8 이하인 문자열입니다.
s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.


입출력 예
s / return
"a234" false
"1234" true

문제풀이

function solution(s) {
    if(s.length !== 4 && s.length !== 6){
        //1,2,3,5,7,8글자를 가질 때 실행됨.
        return false;
    }
    // if(Number(s) === NaN){
    //     return false;
    // }
    // if(Number.isNaN(Number(s)) === true){
    //     return false;
    // }
    for(let i =0;i<s.length;i++){
        if(Number.isNaN(Number(s[i])) === true){
              // console.log(i, s[i],Number(s[i]))
            return false;
        }  
    }
    return true;
  // console.log(s,typeof s, Number.isNaN(Number(s)))
}

다른풀이

function solution(s) {
    if(s.length !== 4 && s.length !== 6){
        return false;
    }
  const answer = s.split("").filter(el=>
      Number.isNaN(Number(el)) // === true
  ) //{}중괄호 생략가능 return 제거
  // console.log(answer)
  return !answer.length === 0 //falsey한 값
}
}

접근방법
1. 전체가 숫자가 아니다 false
2. s길이가 4글자가 아닌경우

NaN 직접적으로 부등호를 이용해 비교가 불가능하다
NaN === NaN false값 가짐
다른방법이용해야함.isNaN활용하기
isNaN의 결과가 false = NaN값이 아니다. = 숫자가 많다.
Number.isNaN(1) // false
isNaN("a") //true
Number.isNaN("a") // 알파벳 에이가 그대로 들어가서 넘버인지 아닌지 판별한다.
isNaN과 결과를 동일하게 사용하고 싶다면
Number.isNaN(Number("a"))
Number.isNaN()이 더 엄격하게 검사함.
실제로 NaN값이 맞는지 아닌지를 판별하고 싶기 때문에
isNaN은 목적에 맞지 않음.


10el el은 지수를 얘기한다 10의 지수
10e2 10의 2제곱 1000
"10el"
지수가 섞여있다면 숫자타입이 떠있게 됨

for문안에서 리턴하면 종료시키고 함수도 종료시킴.

fillter걸러주는 것
쪼개서 배열을 만들어줘야되는데
뭘 이용해서 만들어줄 수 있을까?
쪼개서 만들어주는 메소드 s.split 이용

profile
JUST DO WHATEVER

0개의 댓글