Level 1) 직사각형 별찍기, 최대공약수와 최소공배수, 같은 숫자는 싫어, 3진법 뒤집기

Doozuu·2023년 2월 10일
0

프로그래머스 (JS)

목록 보기
44/183

📌 문제 1. 직사각형 별찍기

문제 설명

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

제한 조건

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

예시

입력
5 3
출력

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

풀이

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++){
         console.log("*".repeat(a))
    }
});



📌 문제 2. 최대공약수와 최소공배수

문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

제한 사항

두 수는 1이상 1000000이하의 자연수입니다.

입출력 예

n m return
3 12 [3, 12]
2 5 [1, 10]

풀이

유클리드 호제법을 이용해 최대공약수를 구하는 함수를 따로 만들고, 최소공배수는 두 수의 곱에 최대공약수를 나눈 것과 같다는 성질을 이용해 최소공배수를 구하는 함수를 따로 만든다.

function solution(n, m) {
    function fnGCD(a,b){
        return (a%b) ? fnGCD(b,a%b) : b;
    }
    function fnLCM(a,b){
        return a*b / fnGCD(a,b);
    }
    return [fnGCD(n,m), fnLCM(n,m)];
}



📌 문제 3. 같은 숫자는 싫어 (스택/큐)

문제 설명

배열 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]

풀이

배열의 값을 두개씩 묶어서 비교하여 값이 다른 경우에만 새로운 배열에 push해준다.
이때, i의 범위를 i<arr.length-1 로 하면 마지막에 있는 요소가 추가되지 않는 문제가 생긴다.
ex) [4,4,3,3], [4,3]
4 === 4 -> continue
4 !== 3 -> arr.push(4)
3 === 3 -> 더 이상 비교대상이 없으므로 추가되지 않고 종료

이를 방지하기 위해 i의 범위를 i<arr.length 로 바꾸면, i+1이 배열의 범위를 넘어서기 때문에 마지막 요소는 undefined와 비교하게 되고, 그럼 항상 같지 않기 때문에 마지막 요소도 빠트리지 않고 추가할 수 있게 된다.(굿 아이디어~~)
ex) [4,4,3,3], [4,3]
4 === 4 -> continue
4 !== 3 -> arr.push(4)
3 === 3 -> continue
3 !== undefined -> arr.push(3)

function solution(arr){
    let answer = [];
    for(let i=0;i<arr.length;i++){
        if(arr[i] !== arr[i+1]){
          answer.push(arr[i])   
        } 
    }
    return answer;
}

filter를 이용하는 방식도 있다.

function solution(arr)
{
    return arr.filter((val,index) => val != arr[index+1]);
}



📌 문제 4. 3진법 뒤집기

문제 설명

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

n은 1 이상 100,000,000 이하인 자연수입니다.

입출력 예

n result
45 7
125 229

입출력 예 설명

입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
45 1200 0021 7

풀이

  1. 3진법으로 바꾸기(문자열로 바뀜)
  2. 배열로 바꿔서 reverse()
  3. 다시 10진법으로 바꾸기
function solution(n) {
    return parseInt([...n.toString(3)].reverse().join(''),3);
}

10진법 -> n진법 변환 : num.toString(n)

ex. num = 10 일 때, 2진법 변환 : 10.toString(2)

n진법 -> 10진법 변환 : parseInt(num,n)

ex. 2진법으로 표현된 num = 1010 일 때, 10진법 변환 : Number.parseInt(1010,2)

profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글