Programmers: Javascript 문제풀이(1-8번)

너겟·2022년 5월 13일
0
post-thumbnail

Programmers_level1

프로그래머스에서 자바스크립트 알고리즘을 풀어볼 수 있다!

1번) 직사각형 별찍기

1번 문제 풀러가기!

  • 이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
  • 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);       
});

풀이:
repeat과 for반복문을 이용해 풀이

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    
    const firstrow = "*".repeat(a)
    for(let i=0; i < b; i++) {
        console.log(firstrow);
    }
       
});

note
풀이하면서 의문점: 줄바꿈이 왜 자동으로 되는가? 그리고 이건 절대 하하 난이도가 아니다!

다른 풀이법: for문 안에 for문을 한번 더 넣으면 된다!

2번) 짝수와 홀수

2번 문제 풀러가기!

  • 정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

조건:

  • num은 int 범위의 정수입니다.
  • 0은 짝수입니다.
function solution(num) {
    var answer = '';
    return answer;
}

풀이:
2로 나눴을 때 나머지가 없으면 짝수, 그렇지 않으면 홀수이다! 여기서 주위할 것은 return하는 결과 텍스트를 대소문자 구분해서 정확히 기입할 것!

function solution(num) {
    var answer = '';
    if( num % 2 === 0) {
        return answer = "Even"
    } else {
        return answer = "Odd"
    }
    return answer;
}

3번) 가운데 글자 가져오기

3번 문제 풀러가기!

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

조건:

  • s는 길이가 1 이상, 100이하인 스트링입니다.
function solution(s) {
    var answer = '';
    return answer;
}

처음 짠 코드:

function solution(s) {
    var answer = s.split('');
    var snum = s.split('').length - 1;
    
    var position;
    var addon;
    if(snum % 2 == 1) {
        position = snum / 2;
        addon = 1
        var a = position + addon
        return answer[a]
    } else {
        var b = a + 1
        return answer[a,b]
    }
}

풀이:
일단 s[] 안에 문자열이 몇번째에 있는지 불러와야하는데 문자열 번호는 0부터 시작하기 때문에 중간에 위치한 문자열의 번호는 5자리일 경우 2번째, 4자리일 경우 1,2번째이다.

  • 먼저 문자열의 갯수를 세어 갯수가 짝수인지 홀수인지에 따라 결과값이 달라진다.
  • 짝수일 경우 2로 나누면 나머지가 0. 결과값은 문자열의 갯수에서 2를 나눈 결과와 그 결과에서 1을 뺀 번째 수 두가지를 출력한다.
  • 홀수일 경우 2로 나누면 나머지가 1. 결과값은 문자열의 갯수에서 2를 나눈 결과를 정수로 만들어주거나 간단하게 나머지인 0.5를 빼주면된다.

*새로 알게된점: length를 쓰면 굳이 문자열을 split으로 나눠서 갯수를 세지 않아도 알아서 처리해준다. 편리하다.

function solution(s) {
    var answer = '';
    const snum = s.length;
   
    if(snum % 2 === 0) {
         answer = s[(snum/2)-1] + s[(snum/2)]; 
    } else {
         answer = s[(snum/2)- 0.5];   
    }
    return answer;
}

note
다른 풀이도 공부해볼 것:
아직 배우지 않은 부분이 많지만 간략하고 멋지다.

function solution(s) {
    return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);
}

substr : substr에서 substr(위치, 갯수) 를 출력
Math.floor: 버림 함수

4번) 두 정수 사이의 합

4번 문제 풀러가기!

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

조건:

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다.
function solution(a, b) {
    var answer = 0;
    return answer;
}

풀이:

function solution(a, b) {
    var answer = 0;
    let min = Math.min(a,b)
    let max = Math.max(a,b)
    for(let i = min; i <= max; i++) {
        answer += i
    }        
    return answer;
}

5번) 문자열을 정수로 바꾸기

5번 문제 풀러가기!

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

조건:

  • s의 길이는 1 이상 5이하입니다.
  • s의 맨앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져있습니다.
  • s는 "0"으로 시작하지 않습니다.

풀이:

function solution(s) {
    const answer = Number(s);
    return answer;
}

생각보다 간단하게 풀이를 했는데 다른 풀이가 많을 것 같다.

  • numer함수를 쓰면 숫자가 아닌 문자나 undefined 등을 인자로 전달하면 NaN(Not A Number)를 리턴

note

  • 구글링하다가 찾은 다른 함수들!
  • parseint함수 같은 경우 소수를 갖고 있는 실수는 정수로 변환하여 나타낸다.
  • Math>> ceil(올림), round(반올림), floor(버림)
    Math는 문자열이 아닌 숫자도 인자로 받을 수 있다!!!!
    참고한 링크
  • 굳이 원래 제공하는 탬플릿을 이용할 필요가 없다.

  • 다른 분이 풀이한 것 중 너무 천재적인 방법이 있었다!:

function strToInt(str){
  return str/1
  }

6번) 없는 숫자 더하기

6번 문제 풀러가기!

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

조건:

  • 1 ≤ numbers의 길이 ≤ 9
  • 0 ≤ numbers의 모든 원소 ≤ 9
  • numbers의 모든 원소는 서로 다릅니다. >> 이게 핵심!

풀이:

function solution(numbers) {
    let sum = 0;
    for (i=0; i< numbers.length; i++) {
        sum += numbers[i];
    }
    
    let answer = 45-sum;
    
    return answer;
}

0 부터 9까지 라는 조건을 제시된 상태. 0부터 9까지 전체 합에서 포함되어 있는 요소들의 합을 빼는 방법을 생각했다.

note
-다른 풀이: reduce 사용!

function solution(numbers) {
    return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}

reduce 함수: 배열의 각 요소를 순회하며 callback함수의 실행 값을 누적하여 하나의 결과값을 반환한다. (각 요소를 모두 더하는 의미)

reduce함수가 가지는 4가지 인수:

  • accumulator(이름바꿔도됨) - accumulator는 callback함수의 반환값을 누적합니다.
  • currentValue(이름바꿔도됨) - 배열의 현재 요소: 초기값을 제공하지 않을경우 배열의 첫 번째 요소를 사용
  • index(Optional) - 배열의 현재 요소의 인덱스
  • array(Optional) - 호출한 배열

참고링크

const sum1 = numbers.reduce((accumulator, currentNumber) => accumulator + currentNumber);

console.log('sum1 =', sum1);

또는 function으로 선언할 시
function sumReducer(accumulator, currentNumber) {
  return accumulator + currentNumber;
}

const sum2 = numbers.reduce(sumReducer);

console.log('sum2 =', sum2);

7번) 음양 더하기

7번 문제 풀러가기!

정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

조건:

  • absolutes의 길이는 1 이상 1,000 이하입니다.
  • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

풀이:
signs와 absolutes 배열의 길이가 같기 때문에 요소들의 포지션도 같을 것이다.

  • absolutes의 요소가 false일 때에 signs의 요소에 -1을 곱하면 음수가 된다.
  • if절로 absolutes[i] === false 인 i포지션을 찾아서 -1을 곱해준다.
  • reduce 함수를 이용해서 absolutes의 요소를 모두 더해준다.
function solution(absolutes, signs) {
    for(i=0;i<=absolutes.length;i++) {
        if(signs[i] === false) {
            absolutes[i] = absolutes[i]* -1
        } else {
            absolutes[i]
        }            
    } 
    let answer = absolutes.reduce(function(accumulator, currentnumber){ 
    return accumulator + currentnumber})
    
    return answer;    
    
}

reduce 함수는 이렇게도 써줄수있다:

const sum1 = numbers.reduce((accumulator, currentNumber) => accumulator + currentNumber);

note

  • function내에 여러가지 함수를 겹쳐서 넣는 법을 조금 더 연습하자! (가독성도 고려하자!)

8번) 평균구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

조건:

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

풀이:
7번 문제에 나온 reduce를 사용하여 푸는 문제인데 다 더한다음 배열 내 요소의 갯수로 나누면 평균을 구할 수 있다.

function solution(arr) {
    let sum1 = arr.reduce(function(accumulator, currentnumber){
        return accumulator + currentnumber})
    
    let answer = sum1/ (arr.length);
    return answer;  
    
}
profile
꾸준하게 하는 법을 배우는 중입니다!

0개의 댓글