JavaScript - LeetCode Random Algorithm Test(11)

먹보·2023년 3월 21일
0
post-thumbnail

1. Length of Last Word (No.0058)

문제 설명

Given a string s consisting of words and spaces, return the length of the last word in the string.
A word is a maximal substring consisting of non-space characters only.

해석

띄어쓰기와 문자로 구성되어 있는 문자열이 주어졌을 때, 맨 마지막 단어의 길이를 반환하는 함수를 구현해주세요.

예제

코드

function lengthOfLastWord(s: string): number {
  const sArr = s.split(" ");
  for(let i = sArr.length-1 ; i >= 0 ; i--){
    if(sArr[i]) return sArr[i].length
  }
};
//다른 풀이 법
function lengthOfLastWord(s: string): number {
  const sArr = s.trim().split(" ");
  return sArr[sArr.length-1].length
};

🗒️코멘트

NULL


2. Simplified Fractions (No.1447)

문제 설명

Given an integer n, return a list of all simplified fractions between 0 and 1 (exclusive) such that the denominator is less-than-or-equal-to n. You can return the answer in any order.

해석

정수 n이 주어졌을 때, 분모가 n보다 작으면서 분수의 크기가 0보다 크고 1보다 작은 기약분수를 문자열 형태로 배열에 담아 반환해주세요.

예제

코드

function simplifiedFractions(n: number): string[] {
  const answer : string[] = [];
  for (let i = 2 ; i <= n ; i++){
    for (let j = 1 ; j < i ; j ++){
      let gcf = findGCF(i,j);
      let denom = Math.trunc(i/gcf)
      let num = Math.trunc(j/gcf);
      let simplifiedFrac = `${num}/${denom}`
      answer.includes(simplifiedFrac) ? null : answer.push(simplifiedFrac)
    }
  }
  return answer
};

function findGCF(num1 : number, num2 : number) : number {
  let smallerNum = Math.min(num1, num2);
  let GCF = 1;
  for (let i = 2; i <= smallerNum; i++) {
    if (num1 % i === 0 && num2 % i === 0) {
      GCF = i;
    }
  }
  return GCF;
}

🗒️코멘트

이번에는 유클리드의 호제법을 사용하지 않고 최대공약수를 찾은 다음 만들어둔 빈 배열 안에 기약분수를 추가로 넣어주는 방식으로 문제를 풀었다.

Set을 이용한 방식도 생각했지만 수학적으로 접근을 하고 싶었기에 최대공약수만을 사용해 접근해서 풀었다.


3. Minimum Moves to Convert String (No. 2027)

문제 설명

You are given a string s consisting of n characters which are either 'X' or 'O'.
A move is defined as selecting three consecutive characters of s and converting them to 'O'. Note that if a move is applied to the character 'O', it will stay the same.
Return the minimum number of moves required so that all the characters of s are converted to 'O'.

해석

'X'와 'O'로만 n개의 문자로 이루어진 문자열 s가 주어졌을 때, 연속된 3개의 문자를 'X' 에서 'O'로 바꾸는 것을 한 번의 '이동'이라고 보았을 때 문자열 s 안에 'X'가 없을 때 까지 총 몇 번 '이동' 해야 하는 지 반환하는 함수를 구현해주세요.

예제

코드

function minimumMoves(s: string): number {
  let answer = 0;
  let i = 0;
  while (i < s.length){
    if(s[i] === 'X'){
      answer++
      i += 3
    } else {
      i++
    }
  }
  return answer
};

🗒️코멘트

처음에는 's'를 split하여 순환하면서 연속된 자리를 'X'에서 'O'로 바꿔주는 방식으로 문제를 푸려고 했으나 너무 평이해보이길래 접근 방식을 인덱스로만 생각했다. 어차피 특정 자리가 'X'이고 그 후에 첫번째와 두번째 모두 'O'로 변경되는 것이기 때문에 건너띄어도 될 것이라고 생각해서 그런 방식으로 접근하기로 하였다.


4. Maximum 6,9 Number (No.1323)

문제 설명

You are given a positive integer num consisting only of digits 6 and 9.
Return the maximum number you can get by changing at most one digit (6 becomes 9, and 9 becomes 6).

해석

6과 9로만 이루어진 숫자가 주어졌을 때, 하나의 자릿수만 변경해서 만들 수 있는 숫자들 중 최댓값을 반환해주세요.

예제

코드

function maximum69Number (num: number): number {
  const numStr = num.toString();
  const numDigits = numStr.length
  if (!numStr.includes('6')){
    return num
  }
  
  for (let i = 0 ; i < numDigits ; i++){
    if(numStr[i] === '6'){
      return (num + 3*(Math.pow(10,(numDigits-(i+1)))))
    }
  }
};

🗒️코멘트

정말 단순하게 생각해서 몇 자리수의 상관없이 9가 가장 크기 때문에 앞에서부터 순환하면서 6을 찾으면 그것을 바로 9로 바꾸고 반환하는 방식으로 문제를 접근하였다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글