[6/16 TIL].repeat() .Sort() Math .includes()

haegnim·2023년 6월 16일
0

TIL

목록 보기
13/52
post-thumbnail

.repeat()

직사각형 별찍기

문제 1. 직사각형 별찍기

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

내가 쓴 코드

이거 일주일 동안 풀어야하는 문제들중 1번째 문제였다. 첫번째부터 나만 어려운가~~~. 다 풀고 다른 사람들의 풀이를 봤는데 repeat()을 쓰더라. 기억 저편에 잊어버린 .repeat() 안쓰고 짜려고 하니 더 고생한다.

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

핸드폰 번호 가리기

문제 2.핸드폰 번호 가리기

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

내가 쓴 코드

처음에 난해하게 느꼈었다. for문도 써보고.. if문도 써보고... 그러다가 다 지워도 되네? 싶어서 다 지우고 다 지웠더니 선언한 변수들이 잔뜩 생겼다.
열심히 짤 땐 메서드들을 이어서 쓰면 어떤건 동작 하고 어떤건 동작 안하기도 하는데 아직 정확한 이유를 모르겠다. 그때마다 끊어 놓는데 너무 당황스럽다. 이 코드도 처음엔 다 끊어놨다. .repeat()도 앞에 바로 문자열 써도 된다고 예제는 나와있는데 처음 시도할 땐 안됐다. 다른 분께 보여드리면서 고치니까 또 된다. 그리고 지적받아서 깨달았는데 매개변수를 문자열로 받고 있었다. number로 받고있는 줄. 하하.

before

function solution(phone_number) {
    const arr = phone_number.toString().split('');
  	const star = '*';
    const starNum = arr.length - 4;
    const answer = arr.splice(starNum, 4).join('');
  	answer.join('')
    const starRepeat = star.repeat(starNum);
    return starRepeat + answer;
}

after

function solution(phone_number) {
  const starNum = phone_number.length - 4;
  const answer = phone_number.slice(starNum);
  const starRepeat = '*'.repeat(starNum);
  return starRepeat + answer;
}

.Sort()

나누어 떨어지는 숫자 배열

문제 3. 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

내가 쓴 코드

sort()를 썼는데 어떤 놈은 오름차순이고 어떤 놈은 내림차순이다. 무슨일이지?
친절한 챗gpt 선생님께 물어보자
sort는 오름차순으로 정렬하는데 문자열로 변환된 요소를 비교한다고 한다. 그래서 5와 10이 있으면 5가 1보다 크니까 [ 10 , 5 ]로 정렬된다.

function solution(arr, divisor) {
    var answer = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] % divisor === 0) {
            answer.push(arr[i]);
        }
    }
    if (answer.length === 0) {
        answer.push(-1);
    }
    return answer.sort((a, b) => {
        return a - b;
    });
}

Math

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

내가 쓴 코드

if도 쓰고 if안에 for도 쓰고 그 안에 또 삼항연산 있고~
이 문제는 다른 사람이 어떻게 했는지 참고하자

function solution(a, b) {
    var answer = 0;
    if (a === b) {
        return (answer = a);
    } else {
        answer = a + b;
        for (let i = 1; i < Math.abs(a - b); i++) {
            a < b ? (answer += a + i) : (answer += b + i);
        }
    }
    return answer;
}

다른 사람 풀이

  • Math.min(a, b) : a와 b중 더 작은 값을 반환
  • Math.max(a, b) : a와 b중 더 큰 값을 반환
  • 파라미터에 변수를 선언한 건 코드 한 줄을 더 쓰지 않고 간결하게 보이기 위함이라 한다.
function adder(a, b, s = 0){
  for (let i = Math.min(a, b); i <= Math.max(a, b); i++) s += i;
  return s;
}

Math 메소드

  1. Math.min()
    :인수로 전달받은 값 중에서 가장 작은 수를 반환
Math.min();                              // Infinity
Math.min(1, 10, -100, -10, 1000, 0);     // -100
Math.min(1, 10, -100, -10, "-1000", 0);  // -1000
Math.min(1, 10, -100, -10, "문자열", 0); // NaN
  1. Math.max()
    :메소드는 인수로 전달받은 값 중에서 가장 큰 수를 반환
Math.max();                              // -Infinity
Math.max(1, 10, -100, -10, 100, 0);      // 100
Math.max(1, 10, -100, -10, "1000", 0);   // 1000
Math.max(1, 10, -100, -10, "문자열", 0); // NaN
  1. Math.random()
    : 0과 1사이의 무작위 숫자(random number)를 반환
var min = 10, max = 20;
Math.random();                     // [0, 1)
Math.random() * (max - min) + min; // [min, max)
  1. Math.round()
    :인수로 전달받은 소수점 이하 값을 반올림하여 그 결과값을 반환
Math.round(10.49);  // 10
Math.round(10.5);   // 11
Math.round(-10.5);  // -10 //-10.5는 내림이네?
Math.round(-10.51); // -11
  1. Math.floor()
    :인수로 전달받은 소수점 이하 값을 버리리고 정수로 반환
Math.floor(10.95);  // 10
Math.floor(11.01);  // 11
Math.floor(-10.95); // -11
Math.floor(-11.01); // -12
  1. Math.ceil()
    :인수로 전달받은 값을 소수점 이하를 올림하여 정수로 반환
Math.ceil(10.95);  // 11
Math.ceil(11.01);  // 12
Math.ceil(11);     // 11
Math.ceil(-10.95); // -10
Math.ceil(-11.01); // -11

.includes()

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

내가 쓴 코드

indexOf를 두고 좌우로 numberList와 numbers의 전후관계가 헷갈렸다. AI에게 알고리즘 평가를 부탁했더니 indexOf를 사용하면 선형적으로 시간이 늘어난다고 추천하지 않는 듯한 뉘앙스를 보였다.

function solution(numbers) {
    let NumberList1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    let NumberList = [];
    for (let i = 0; i < 9; i++) {
        let num = numbers.indexOf(NumberList1[i]);
        if (num === -1) {
            NumberList.push(NumberList1[i]);
        }
    }
    let answer = NumberList.reduce((arr, cur) => {
        return arr + cur;
    }, 0);
    return answer;
}

다른 사람 풀이

다른 분들을 보니 includes()를 많이 썼더라.
0~9까지 증가하는 for문으로 numbers에 i가 있는지 확인하면서 i가 없다면 i를 추가한다.

function solution(numbers) {
    let answer = 0;

    for(let i = 0; i <= 9; i++) {
        if(!numbers.includes(i)) answer += i;
    }

    return answer;
}

.includes()

.includes()는 문자열이 특정 문자열을 포함하는지 확인하는 메서드이다.

0개의 댓글