본문 바로가기

프로그래밍/Javascript 알고리즘 문제

Javascript 알고리즘 문제 - 1번부터 8번까지

Q1. 직사각형 별찍기

문제 설명

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

 

제한 조건


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

 

입출력의 예


입력

5 3

출력

*****
*****
*****

 

나의 풀이

/* 오답 처리되는 코드입니다. */

// n=가로, m=세로
function solution(n m){
    // 바깥쪽 for문은 세로 방향
    for(i=0; i<m; i++)
    {
            // 안쪽 for문은 가로 방향
        for(j=0; j<n; j++)
        {
            console.log("*");
        }
        console.log("\n"); // 가로 한 줄 출력이 끝나면 다음 줄로 줄바꿈
    }
}

 

위 코드 자체에는 오류가 없지만 프로그래머스에 돌리면 오답 처리됩니다.

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {

를 쓰지 않고 function만으로 프로그래머스에 통과하기는 어려워 보입니다.

 

 

다른 사람의 풀이

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => { // 입력받은 숫자를 'data에 받는다'
    
    const a = data.split(" "); // data(입력받은 숫자)를 배열로 변경
    const n = Number(a[0]), m = Number(a[1]); // n = 가로, m = 세로
    
    for(let i=0; i<m; i++){ // 세로 방향으로 m줄 출력
        let star = ""; // 출력할 변수 선언
        for(let j=0; j<n; j++){ // 가로 방향으로 n줄 출력
            star = star + "*" // 출력할 변수에 별을 담음
        } 
    console.log(star) // 별 출력
    }
    
});

 


Q2. 짝수와 홀수

문제 설명

정수 num이 짝수일 경우 "Even"을 반환하고

홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

 

제한 조건

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

 

입출력의 예

 

num return
3 "Odd"
4 "Even"

 

나의 풀이

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

 


 

Q3. 가운데 글자 가져오기

문제 설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요.

단어의 길이가 짝수라면 가운데 두 글자를 반환하면 됩니다.

 

제한 조건

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

 

입출력의 예

s return
"abcde" "c"
"qwer" "we"

 

나의 풀이

function solution(s) {
    let howlong = s.length; // 입력받은 글자의 수를 변수에 담음
    
    if(s.length%2 == 0){ // 입력받은 글자의 수가 짝수라면
        answer = s[howlong/2 - 1] + s[howlong/2];
        // 예를 들어, 글자의 길이가 4라면 4/2 = 2,  s[1]과 s[2] 출력
    } else{ // 입력받은 글자의 수가 홀수라면
        howlong = howlong + 1;
        answer = s[howlong/2 - 1]; 
        // 예를 들어, 글자의 길이가 5라면 i = (5+1)/2 = 3,  s[i-1] 출력
    }
    
    return answer;
}

 


Q4. 두 정수 사이의 합

문제 설명

두 정수 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의 대소관계는 정해져있지 않습니다.

 

입출력의 예

a b return
3 5 12
3 3 3
5 3 12

 

 

나의 풀이

function solution(a, b) {
    var answer1 = 0; // 0부터 둘 중 더 큰 값까지의 합을 넣을 변수
    var answer2 = 0; // 0부터 둘 중 더 작은 값까지의 합을 넣을 변수
    var answer = 0; // 0부터 둘 중 더 큰 값까지의 합에서 0부터 둘 중 더 작은 값까지의 합을 뺀 값을 넣을 변수
 
        if(a>b){ 
            answer1 = a*(a+1)/2; // 가우스 법칙으로 0부터 a까지 수를 모두 더함
            answer2 = (b-1)*b/2; // 가우스 법칙으로 0부터 b-1까지 수를 모두 더함
        } else{ 
            answer1 = b*(b+1)/2;
            answer2 = (a-1)*a/2;
        }
    answer = answer1 - answer2; // 0부터 큰 값까지의 합에서 0부터 작은 값 바로 전 값까지의 합을 뺌
    return answer;
}

 


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

문제 설명

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

 

제한 조건

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

 

입출력의 예

예를들어 str이 1234이면 1234를 반환하고, -1234이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

 

나의 풀이

스스로 풀지 못했지만, 풀려고 헤매다가 어느 블로그에서 발견한 메소드입니다.
: /[정규식 표현]/옵션 → 이때 옵션이 g면 전체 검사, i면 대소문자 모두 검사.

숫자만 추출 문자만 추출
str.replace(/[a-z]/gi,""); str.replace(/[1-9]/g,"");

 

다른 사람의 풀이 1.

function solution(s) {
    return Number(s);
}

스트링을 number로 바꿔주는 Number 메소드를 사용.

 

다른 사람의 풀이 2 & 3.

function solution(s){
  return s/1;
  }

 

 

function solution(s){
  return  +s;
}

자바스크립트의 특징 중 하나로, 문자열을 숫자 연산자(+, -, *, /, %)와 함께 사용하면
JS가 문자열을 숫자로 자동으로 바꿈.


Q6. 없는 숫자 더하기

문제 설명

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. 

numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

 

제한 사항

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

 

입출력 예

numbers result
[1,2,3,4,6,7,8,0] 14
[5,8,4,0,6,7,9] 6

입출력 예 #1

  • 5, 9가 numbers에 없으므로, 5 + 9 = 14를 return 해야 합니다.

입출력 예 #2

  • 1, 2, 3이 numbers에 없으므로, 1 + 2 + 3 = 6을 return 해야 합니다.

 

나의 풀이

function solution(numbers){
        let sum = 0, answer = 0;
        
         // 일단 numbers[i]의 값을 모두 확인한다.
        for(i=0; i < numbers.length; i++){ // numbers에 존재하는 값의 개수만큼 for문을 돌린다.
            if(numbers[i] == 0||1||2||3||4||5||6||7||8||9){ // 만약 numbers에 있는 값이 0~9 중
                sum = sum + numbers[i]; // 어느 값과도 일치하면 그 값끼리 더해 sum에 담는다.
            }
        }
    
        answer = 45 - sum; // 0부터 9까지의 합에서 numbers에 있는 값끼리 더한 값인 sum을 뺀다. 
                           // 0부터 9까지의 합: 9*10/2 = 45 
        return answer; 
}

 


Q7. 음양 더하기

문제 설명

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

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

 

입출력 예


[4,7,12] [true,false,true] 9
[1,2,3] [false,false,true] 0

입출력 예 #1

  • signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
  • 따라서 세 수의 합인 9를 return 해야 합니다.

입출력 예 #2

  • signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
  • 따라서 세 수의 합인 0을 return 해야 합니다.

 

나의 풀이

// 정수 = 부호 + 절댓값

function solution(absolutes, signs) { // absolutes = 절댓값, signs = 부호, 둘 다 배열.
    let num = 0, sum = 0; 

    for(i=0; i<absolutes.length; i++){
         if(signs[i] == 0){ // 주어진 정수가 음수이면
              num = -absolutes[i]; // 그 정수의 절댓값에 -부호를 붙여 num에 넣음.
         } else{
              num = absolutes[i]; // 주어진 정수가 양수이면 절댓값 그대로 num에 넣음.
         } // 이제 절댓값과 부호 부분으로 나뉘었던 정수가 원래 형태로 복원됨.
        sum = sum + num; // 위 if문을 통해 얻은 원래 정수 값을 모두 더해 sum에 넣음.
    }
    return sum;
}

 Q8. 평균 구하기

 

문제 설명

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

 

제한 사항

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

 

입출력의 예


arr return
[1,2,3,4] 2.5
[5,5] 5

 

나의 풀이

function solution(arr) {
    let avg = 0;
    let sum = 0;
    
    // 평균 = 배열에 담긴 모든 값의 "합"/배열에 담긴 값의 "개수"
    for(i=0; i<arr.length; i++){
        sum = sum + arr[i];
    }
    
    avg = sum/arr.length;
    
    return avg;
}