반응형

2016년

 

문제 설명

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT

입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건
  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

입출력 예

abresult

a b result
5 25 "TUE"

 

function solution(a, b) {
    var answer = '';

    let date = new Date(`2016, ${a}, ${b}`).getDay();

    const week = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
    const dayOfWeek = week[date];

    return answer = dayOfWeek;
}

console.log(solution(5, 24));

getDay() 메서드로 주어진 날짜의 현지 시간 기준으로 반환해서 요일을 찾아주었습니다.

 

  • getDay()메서드: 주어진 날짜의 현지 시간 기준 요일을 반환합니다. 0은 일요일을 나타냅니다.

 

다른사람의 풀이

function solution(a, b) {
    // 윤년은 2월이 29일까지 있고, 1년은 정확히는 365.2422일이라고 합니다.
    // 4, 100, 400으로 나누어지는 년도는 윤년입니다.
    const weekToDay = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
    const leapYearMonths = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
    let day = b + 4; // 1월 1일은 FRI, b가 1일 때 인덱스로는 5가 되어야합니다.
    // 1월은 이전 월의 일수를 더하지 않기 때문에, a-1 조건으로 해야합니다.
    for(let i = 0; i < a - 1; ++i){
        day += leapYearMonths[i];
    }
    return weekToDay[day % 7];
}

 

다른사람의 풀이쪽에 저의 풀이 내용과 비슷하게 풀린 내용들이 꽤 있었는데, 알고리즘 문제에서 new Date() 객체를 사용했다고 질책하는 댓글들이 있었습니다..ㅠ

물론 알고리즘 절차에 따라 문제를 해결하는 것도 중요하다고 생각하지만, 활용할수 있는 내용을 가지고 활용하는 것도 나쁘지 않다고 생각합니다..!

:: 활용하는 내용은 잘 알고 써야한다고 생각은 합니다!

 

반응형
반응형

콜라츠 추측

 

문제 설명

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항
  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.
입출력 예nresult
6 8
16 4
626331 -1
입출력 예 설명

입출력 예 #1
문제의 설명과 같습니다.

입출력 예 #2
16 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.

입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.


※ 공지 - 2022년 6월 10일 다음과 같이 지문이 일부 수정되었습니다.

  • 주어진 수가 1인 경우에 대한 조건 추가

 

function solution(num) {
    var answer = 0;
    
    if (num === 1) return answer;
    
    for (let i = 1; i <= 500; i++) {
        if (num % 2 === 0) num = num / 2;
        else if (num % 2 === 1) num = num * 3 + 1;
        
        if (num === 1) return answer = i;
    }
    
    return answer = -1;
}

나머지가 0이 되느냐 되지 않느냐로 홀수짝수를 판단한 뒤에 num이 1이 될 때까지 반복문을 돌려주고, num이 1이되면 반복한 숫자만큼 반환해줍니다. 500번 돌아갈 때까지 없으면 -1을 반환해줍니다.

코드 실행할때는 문제가 없었는데, 테스트 13번이 자꾸 막혀서 문제만 계속 들여다보고 있었습니다. ㅠ

여기서 스크롤을 한번더 안내렸던게 문제였습니다 ㅠㅠ

주어진 수가 1인 경우에 대한 조건을 추가했다는 내용을 못보고 고생했던거같습니다.

( 문제는 끝까지 읽어봅시다 [ 문제 중간에도 추가를 좀 해주지..ㅂㄷㅂㄷ ] )

 

다른 사람의 풀이

function solution(num) {
    let counter = 0;
    while (num !== 1){
        if(counter++ === 500) return -1;
        num = num%2 ? num*3+1 : num/2;
    }
    return counter;
}

3항 연산자가 있었습니다...!

반응형
반응형

대문자와 소문자

 

문제 설명

문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string은 영어 대문자와 소문자로만 구성되어 있습니다.

입출력 예my_stringresult
"cccCCC" "CCCccc"
"abCdEfghIJ" "ABcDeFGHij"

입출력 예 설명

입출력 예 #1

  • 소문자는 대문자로 대문자는 소문자로 바꾼 "CCCccc"를 return합니다.

입출력 예 #2

  • 소문자는 대문자로 대문자는 소문자로 바꾼 "ABcDeFGHij"를 return합니다.

 

function solution(my_string) {
    
    var answer = '';
    let arr = [];
    
    for (let i = 0; i < my_string.length; i++) {
        if (my_string[i].match(new RegExp(/^[A-Z]/)) === null) arr.push(my_string[i].toUpperCase());
        else arr.push(my_string[i].toLowerCase())
    }
    
    answer = arr.join("")
    return answer;
}

.match() 메서드를 사용해서 대문자인지 소문자인지를 판단했습니다.

위 방법 말고도 아스키코드로 확인을 한다던가, === ( Strict Equal Operator )를 사용하여 my_string[i] === my_string[i].toUpeerCase()같은 방법으로 비교를 할 수도 있습니다.

 

다른 사람의 풀이

function solution(my_string) {
    var answer = '';
    for (let c of my_string) answer += c === c.toLowerCase() ? c.toUpperCase() : c.toLowerCase();
    return answer;
}

for ... of와 3항 연산자를 사용한 내용인것 같습니다.

 

function solution(my_string) {
    return my_string.split('').map(n => n === n.toUpperCase() ? n.toLowerCase() : n.toUpperCase()).join('')
}

저도 처음에 .map을 사용했었는데, 오류인지 오타인지 계속 실행은 되는데 답이 나오지 않아서 for문으로 바꿔했습니다 ㅠ

반응형
반응형

lastIndexOf() 메서드

lastIndexOf() 메서드는 배열에서 주어진 값을 발견할 수 있는 마지막 인덱스를 반환하고, 요소가 없으면 -1을 반환합니다.

배열 탐색은 fromIndex에서 시작하여 뒤로 진행됩니다.

 

구문

arr.lastIndexOf(searchElement[, fromIndex]);

 

매개변수

  • fromIndex: 역순으로 검색을 시작할 인덱스. 배열의 길이에서 1을 뺀 값( arr.length - 1 )을 기본값으로 지정하지 않을 경우 전체 배열을 검색합니다. 주어진 값이 배열의 길이 이상이면 전체 배열을 검색합니다. 값이 음수라면, 배열의 마지막부터 시작하는 인덱스로 처리됩니다. 다만, 음수를 제공하더라도 검색 순서는 뒤에서 앞으로 진행됩니다. 위의 모든 절차를 거친 최종 계산값이 0미만인 경우, lastIndexOf()는 항상 -1을 반환합니다. 즉, 배열을 탐색하지 않습니다.

 

반환 값

주어진 값과 일치하는 마지막 요소의 인덱스를 반환합니다. 없으면 -1을 반환합니다.

 

예제

 

lastIndexOf() 메서드를 사용하여 배열의 값 찾기

let arr = [2, 5, 9, 2];
console.log(arr.lastIndexOf(2)); // 3
console.log(arr.lastIndexOf(7)); // -1
console.log(arr.lastIndexOf(2, 3)); // 3
console.log(arr.lastIndexOf(2, 2)); // 0
console.log(arr.lastIndexOf(2, -2)); // 0
console.log(arr.lastIndexOf(2, -1)); // 3

 

arr: [2, 5, 9, 2]
2 5 9 2
0 1 2 3

위처럼 표를 그려놓고 보면 헷갈리지 않습니다!

 

요소의 모든 항목 찾기

var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.lastIndexOf(element);
while (idx != -1) {
  indices.push(idx);
  idx = (idx > 0 ? array.lastIndexOf(element, idx - 1) : -1);
}

console.log(indices); // [4, 2, 0]

 

반응형
반응형

행렬의 덧셈

 

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예arr1arr2return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]
[[1],[2]] [[3],[4]] [[4],[6]]

 

function solution(arr1, arr2) {
    var answer = [];

    for (let i = 0; i < arr1.length; i++) {
        answer.push(arr1[i].map((x, y) => arr1[i][y] + arr2[i][y]))
    }

    return answer;
}

console.log(solution([[1,2],[2,3]], [[3,4],[5,6]])); // [[4,6],[7,9]]
console.log(solution([[1],[2]], [[3],[4]])); // [[4],[6]]

위와 같은 배열은 잘 사용하지 않다보니 순간적으로 조금 헷갈렸던 부분이 있었습니다.

이차원 배열, 다중 배열, 다차원 배열 같이 여러가지 이름으로 불리는 것 같습니다.

선언 방법이 arr[1][1]이라는 것을 확인하고 for문과 map을 활용하여 더하기를 진행해 주었습니다.

 

다른 사람의 풀이

const matrixAddition = (matrix1, matrix2) =>
  matrix1.map((row, y) => row.map((v, x) => v + matrix2[y][x]));

function solution(arr1, arr2) {
    return matrixAddition(arr1, arr2);
}



// ------------------------------------------------------ //



const solution = (arr1, arr2) => arr1.reduce((acc, val, i) => [...acc, val.map((x, idx) => x + arr2[i][idx])], [])

대부분 이중 for문을 사용한 내용들이 많고, 문제가 개편되었는데 위 내용들이 좀 깔끔해 보였습니다.

반응형
반응형

Error: 'string | string[]' 형식의 인수는 'string' 형식의 매개 변수에 할당될 수 없습니다.  'string[]' 형식은 'string' 형식에 할당할 수 없습니다.

 

NextJS에서 Typescript를 사용하는 도중에 query에 JSON.stringify()로 넘겨줄 때 위 에러가 발생했습니다.

아마 JSON.stringify()로 오브젝트를 넘겨줄 때 데이터 타입이 일치하지 않아서 일어나는 현상인 것 같습니다.

 

해결방법

 

넘겨준 내용

JSON.stringify(넘겨준 객체 내용)

 

넘겨받은 내용

console.log(JSON.parse("넘겨받은 내용" as string));

넘겨 받은 내용이 string이라고 알려줘서 문제를 해결했습니다.

반응형
반응형

직사각형 별찍기

 

문제 설명

이 문제에는 표준 입력으로 두 개의 정수 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]);

    let str = "";
    
    for (let i = 0; i < b; i++) {
        for (let j = 1; j <= a; j++) {
            str += "*"
            if (j === a) str += "\n";
        }
    }
    
    console.log(str);
});

 

어려운 내용 없이 이중 반복문으로 처리를 해버렸습니다.

처음에 반환 값이 없어서 다 풀고 나서 헤매버렸습니다..ㅋㅋ

 

소요시간: 10분

 

다른 사람의 풀이

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

요즘 다른 사람들의 풀이를 보면서 느끼는 게, 이중 반복문의 사용을 조금 줄여야겠다는 생각이 들었습니다..ㅠ.ㅠ

문법을 좀 더 많이 봐야겠습니다 !!

반응형
반응형

keys() 메서드

keys() 메서드는 배열의 각 인덱스를 키 값으로 가지는 새로운 Array Iterator 객체를 반환합니다.

 

구문

arr.keys();

 

반환 값

새로운 Array 반복기 객체

 

예제

Sparse Arrays에 keys() 메서드 사용하기

let arr = ["a", , "c"];
let sparseKeys = Object.keys(arr);
let denseKeys = [...arr.keys()];

console.log(sparseKeys); // ['0', '2']
console.log(denseKeys); // [0, 1, 2]

배열에 실제로 존재하는 키 값만을 포함하는 Object.keys()와는 달리 [...arr.keys()]는 누락된 속성이 나타나는 빈 공간을 무시하지 않습니다.

 

Calling Keys() on non-array Objects

const arrayLike = {
  length: 3,
};
for (const entry of Array.prototype.keys.call(arrayLike)) {
  console.log(entry);
}

keys() 메서드는 this 값에서 length 속성을 읽고 0과 length - 1 사이에 있는 모든 정수 인덱스를 생성합니다. ( 인덱스는 실제로 생기지 않습니다. )

반응형
반응형

예산

 

문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항
  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

입출력 예dbudgetresult
[1,3,2,5,4] 9 3
[2,2,3,3] 10 4
입출력 예 설명

입출력 예 #1
각 부서에서 [1원, 3원, 2원, 5원, 4원]만큼의 금액을 신청했습니다. 만약에, 1원, 2원, 4원을 신청한 부서의 물품을 구매해주면 예산 9원에서 7원이 소비되어 2원이 남습니다. 항상 정확히 신청한 금액만큼 지원해 줘야 하므로 남은 2원으로 나머지 부서를 지원해 주지 않습니다. 위 방법 외에 3개 부서를 지원해 줄 방법들은 다음과 같습니다.

  • 1원, 2원, 3원을 신청한 부서의 물품을 구매해주려면 6원이 필요합니다.
  • 1원, 2원, 5원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
  • 1원, 3원, 4원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
  • 1원, 3원, 5원을 신청한 부서의 물품을 구매해주려면 9원이 필요합니다.

3개 부서보다 더 많은 부서의 물품을 구매해 줄 수는 없으므로 최대 3개 부서의 물품을 구매해 줄 수 있습니다.

입출력 예 #2
모든 부서의 물품을 구매해주면 10원이 됩니다. 따라서 최대 4개 부서의 물품을 구매해 줄 수 있습니다.

 

function solution(d, budget) {
    var answer = 0;

    d.sort((a, b) => a - b);

    for (let i = 0; i < d.length; i++) {
        if (budget - Number(d[i]) > 0) {
            answer++;
            budget = budget - Number(d[i]);
        } else if (budget - Number(d[i]) === 0) {
            answer++;
            budget = budget - Number(d[i]);
        }
    }

    return answer;
}

console.log(solution([1,3,2,5,4], 9)); // 3
console.log(solution([2,2,3,3], 10)) // 4

이 문제에서 중요했던 점은 오름차순으로 만들어주는 거였던 것 같습니다.( 최대 몇개의 부서까지 물품을 구매해 줄 수 있는지 알아야 하기 때문입니다. )

 

  • sort() 메서드: 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.

 

소요시간 : 15분

 

다른 사람의 풀이

function solution(d, budget) {
    return ~(~d.sort((a,b)=>a-b).map(v => budget -= v).findIndex(v => v < 0) || ~d.length);
}

각 비트를 뒤집는 Bitwise Not ( ~ )연산자라고 합니다.. 매우 신기하네요. 내용을 보고도 잘 모르겠던..하하

반응형
반응형

영어가 싫어요

 

문제 설명

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.


제한사항
  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

입출력 예numbersresult
"onetwothreefourfivesixseveneightnine" 123456789
"onefourzerosixseven" 14067

입출력 예 설명

입출력 예 #1

  • "onetwothreefourfivesixseveneightnine"를 숫자로 바꾼 123456789를 return합니다.

입출력 예 #1

  • "onefourzerosixseven"를 숫자로 바꾼 14067를 return합니다.

 

function solution(numbers) {
    var answer = 0;
    let arr = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];

    for (let i = 0; i < arr.length; i++) {
        numbers = numbers.split(arr[i]).join(i);
    }
    answer = Number(numbers)
    return answer;
}
console.log(solution("onetwothreefourfivesixseveneightnine")); // 123456789
console.log(solution("onefourzerosixseven")); // 14067

 

 

split() 메서드로 문자열을 빼서 배열로 나누고, 나눠진 배열을 join() 메서드로 다시 문자열로 합쳐줍니다.

그리고 합쳐준 문자열을 숫자로 변환해서 반환해 줍니다.

 

  • split() 메서드: 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.
  • join() 메서드: 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.

 

0단계 중에서는 이게 제일 헷갈렸습니다. split() 메서드와 join() 메서드를 합쳐서 써본 적이 없어서 이것저것 찾아보면서 한 것 같습니다..ㅠ.ㅠ

 

다른 사람의 풀이

function solution(numbers) {
    const obj = {
        zero: 0, one: 1, two: 2, three: 3, four: 4,
        five: 5, six: 6, seven: 7, eight: 8, nine: 9
    };

    const num = numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v) => {
        return obj[v];
    });

    return Number(num);
}

객체를 만들어서 replace() 메서드로 푸는 방법인데 참 여러 가지 방법이 있는 것 같습니다..!! ( 이 방법이 제일 있어 보였습니다..ㅎㅎ )

반응형

+ Recent posts