알고리즘 공부 1일 차 (1)

공부할 것

reduce()

1. 직사각형 별찍기

문제 설명

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

제한 조건

n과 m은 각각 1000 이하인 자연수입니다.

문제

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {//받은 숫자를 data로 받는다
    const n = data.split(" ");//data를 배열로 만든다
    const a = Number(n[0]), b = Number(n[1]);//a는 세로길이 b는 가로 길이
    console.log(a);
    console.log(b);
});

해결

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

2. 홀수와 짝수

문제 설명

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

제한 조건

num은 int 범위의 정수입니다.
0은 짝수입니다.

해결

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

삼항연산자를 써서 코드를 줄여보았다.

//0은 false이고 1은 true다.
function solution2(num){
    let answer = num%2? 'Odd':'Even';
    return console.log(answer);
}

3. 가운데 글자 가져오기

문제 설명

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

제한 조건

s는 길이가 1 이상, 100이하인 스트링입니다

해결

function solution(s) {
    let answer = '';
    if(s.length%2===0){
        answer=s[s.length/2-1]+s[s.length/2];
    }else{
        answer=s[s.length/2-0.5]//내림 함수? Math.floor() 
    }
    return answer;
}

substring 쓰기

function solution(s) {
    let answer = '';
    let center =Math.floor(s.length/2)
    console.log(center)
    if(s.length%2===0){
        answer=s.substring(center-1,center+1);
    }else{
        answer=s.substring(center,center+1)
    }
    return answer;
}

참고

올림(Math.ceil())
내림(Math.floor())
반올림(Math.round())
소수점 반올림 (toFixed(), toPrecision())

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) {
	//a와 b중 어느 게 큰지 모른다고 이렇게 너절하게 나누다니ㅠㅠ
    let answer = 0;
    if(a<b){
        for(let i=a; i<=b; i++){
        answer+=i;
        }
    }else if(a>b){
       for(let i=b; i<=a; i++){
        answer+=i;
        } 
    }else{
        answer =a;
    }
    return answer;
}

a b중 어떤 게 큰 수인지 확인해 놓기

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

가우스공식사용

function solution3(a, b) {
    let answer = 0;
    //양끝값을 더하고 길이 절반을 곱한다.
    answer =(a+b)*(Math.abs(a-b)+1)/2
    return answer;
}

5. 문자열을 정수로 바꾸기

문제 설명

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

제한 조건

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

해결

function solution(s) {
    var answer = 0;
    answer=Number(s);
    //반대로 String(s)
    return answer;
}

타입자동변환 이용

function solution2(s) {
    var answer = 0;
    answer=s*1;//문자에 숫자를 곱하면 숫자다, 숫자에 문자열을 더하면 문자
    //혹은 s/1; 
    //반대로 s+""
    return answer;
}

6. 없는 숫자 더하기

문제 설명

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

제한 조건

1 ≤ numbers의 길이 ≤ 9
0 ≤ numbers의 모든 수 ≤ 9
numbers의 모든 수는 서로 다릅니다.

해결

includes(i)는 i값이 배열에 없으면 false있으면 true를 리턴

function solution(numbers) {
    let answer = 0;
    for(let i=0;i<=9;i++){
        if(numbers.includes(i)===false){
            answer+=i;
        }
    }
    return answer;
}

indexOf(i)는 i가 있으면 해당 위치, 없으면 -1리턴

function solution2(numbers) {
    let answer = 0;
    for(let i=0;i<=9;i++){
        if(numbers.indexOf(i)===-1){
            answer+=i;
        }
    }
    return answer;
}

reduce()사용

다른 사람 풀이(더 알아볼 것)
0부터 더한 값(45)에서 numbers배열 합을 뺀다

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

좋은 웹페이지 즐겨찾기