2024.01.14 TIL - 알고리즘(map, reverse, Math.sqrt, Math.pow, toLowerCase, match, split)

Innes·2024년 1월 14일
0

TIL(Today I Learned)

목록 보기
39/147
post-thumbnail

📘 오늘의 공부

  • 알고리즘

📝 알고리즘

  • 문제 : 자연수 뒤집어 배열로 만들기

    <문제 설명>
    자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
    <제한 조건>
    n은 10,000,000,000이하인 자연수입니다.

  • 내 풀이 (실패) - sort로 내림차순한 부분을 reverse()로 바꾸니 성공함

function solution(n) {       //ex. n===123
    let stringN = String(n); // n ==== '123' (문자열로 바꿔서 쪼갤거야)
    Arr = stringN.split(''); // ['1','2','3'];
    let reverseN = Arr.sort((a, b) => b - a); // ['3','2','1']
    let turnNumber = function(arg) { // 매개변수를 숫자로 만드는 함수
        return Number(arg);}
    return reverseN.map(turnNumber); //배열 돌아서 숫자로 만들어줘
}
  • 성공한 코드
function solution(n) { 
    let stringN = String(n); 
    Arr = stringN.split(''); 
    let reverseN = Arr.reverse()
    let turnNumber = function(arg) {
        return Number(arg);}
    return reverseN.map(turnNumber); 
}
  • 알게된 지식
    • split()
      • 문자열만 쪼갤수 있음 - 숫자열 쪼개려면 문자열로 형변환 후 쪼개야함
      • 쪼갠 후 배열로 반환함
    • map()
      • 배열의 모든 요소를 돌면서 -> 주어진 함수를 실행 -> 함수 실행 반환값을 모아 새로운 배열로 반환해줌
      • 안에 함수만 넣어도 됨
    • reverse()
      • 배열 안 요소들을 거꾸로 정렬해줌(sort()로 내림차순 할 필요 없음)

  • 문제 : 정수 제곱근 판별

    <문제 설명>
    임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
    n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
    <제한 사항>
    n은 1이상, 50000000000000 이하인 양의 정수입니다.

  • 시도 (-1 출력 성공, (x+1)^2 출력 실패)

// 루트 씌워서 실수이면 false, 정수이면 true 로직으로 접근

function solution(n) {
    let x = Math.sqrt(n);
    let remove_float = Math.floor(x);
    if (x === remove_float) {
        return (x + 1) ^ 2;
    } else { return -1; }
}
  • 성공한 코드
function solution(n) {
    let x = Math.sqrt(n);
    let remove_float = Math.floor(x);
    if (x === remove_float) {
        return Math.pow(x + 1, 2);
    } else { return -1; }
}
  • 알게된 지식
    • Math.sqrt() : 숫자의 제곱근 반환(루트 씌운값 반환)
    • 제곱근 : n = x^2 인 경우에서 x가 제곱근
    • Math.pow(base, exponent) : 제곱한 값 반환
      • ex) Math.pow(x, 2); -> x의 2제곱 반환

  • 문제 : 문자열 내 p와 y의 개수

    <문제 설명>
    대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
    (예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.)
    <제한사항>
    문자열 s의 길이 : 50 이하의 자연수
    문자열 s는 알파벳으로만 이루어져 있습니다.

  • 시도 : 문자열 s를 전부 쪼개고 p,P 개수와 y,Y 개수 따로 구해보려함 (실패)

function solution(s) {
  let split_s = s.split(""); // ['s', 'p', ...]
  // 's'의 개수
  for (let i = 0; i < split_s.length; i++) {
    if (split_s[i] === "s" || split_s[i] === "S") {
      i = i+1;
    } console.log(i);
  } 
}
  • 풀이 : 전부 소문자로 바꿔서 split('p') 개수 === split('y')개수 비교
function solution(s) {
  let check_p = s.toLowerCase().split('p').length;
  let check_y = s.toLowerCase().split('y').length;
  return check_p === check_y;
}
  • 해설
    • 문자열 "pPoooyY" 일때 소문자 변환 후 split('p') -> [ '', '', 'oooyY' ]
  • 알게된 지식
    • 문자열.toLowerCase() : 전부다 소문자로 바꿔줌
    • 문자열.toUpperCase() : 전부다 대문자로 바꿔줌
    • 특정 문자열 기준으로 split하면 해당 문자열은 ''이 되고 나머지 문자는 뭉쳐서 하나의 요소로 변함
    • 문자열.match('문자') : 문자열 안에 특정 문자가 있는지 확인 가능

  • 문제 : 음양 더하기

    <문제 설명>
    어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
    <제한사항>
    absolutes의 길이는 1 이상 1,000 이하입니다.
    absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
    signs의 길이는 absolutes의 길이와 같습니다.
    signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

  • 풀이 : 처음으로 아무런 외부 도움없이 혼자 힘으로 풀었다! 뿌듯!!

function solution(absolutes, signs) {
    let answer = 0;
    for (let i=0; i < absolutes.length; i++) {
        if (signs[i] === true) {
            absolutes[i] = Number(absolutes[i]);
        } else if (signs[i] === false) {
            absolutes[i] = -Number(absolutes[i]);
        } answer = answer + absolutes[i];
    } return answer;
}
  • 참고 풀이 : 같은 로직인데 3항 연산자로 코드를 짧게 만들었다. 참고하기 유용한 풀이!
function solution(absolutes, signs) {
    let answer = 0;
    for (let i = 0; i < absolutes.length; i++) {
        signs[i] ? answer += absolutes[i] : answer -= absolutes[i]
    }
    return answer;
}
profile
꾸준히 성장하는 우상향 개발자

0개의 댓글