JavaScript - LeetCode Random Algorithm Test(13)

먹보·2023년 3월 27일
0

1. Ugly Number (No.0263)

문제 설명

An ugly number is a positive integer whose prime factors are limited to 2, 3, and 5.
Given an integer n, return true if n is an ugly number.

해석

못생긴 숫자란 양수 중에서 소인수가 2,3, 그리고 5에 제한된 숫자를 뜻한다.

이 때 정수 n이 주어졌을 때 못생긴 숫자인지 아닌지 판별하는 함수를 구현해주세요.

예제

코드

function isUgly(n: number): boolean {
    if(n <= 0) return false
  
    while (n != 1) {
        if (n % 2 === 0) {
            n /= 2
        } else if (n % 3 === 0) {
            n /= 3
        } else if (n % 5 === 0) {
            n /= 5
        } else {
            return false
        }
    }
    return true
};

🗒️코멘트

미련하다..라는 말 밖에 나오지 않는다.

실질적으로 쉬운 방법이 있음에도 불구하고 나는 소인수분해를 직접 한 다음 그 결과를 이용해서 답을 내려고 시도했었다.

머리가 둔해졌다 아니 약간 딱딱해진 것 같다.

유연한 사고 능력.. 최근 일련의 사건들로 인해 많이 무뎌진 것 같다.


2. Latest Time by Replacing Hidden Digits (No.1736)

문제 설명

You are given a string time in the form of hh:mm, where some of the digits in the string are hidden (represented by ?).
The valid times are those inclusively between 00:00 and 23:59.
Return the latest valid time you can get from time by replacing the hidden digits.

해석

시간을 표현하는 방식으로 hh:mm로 된 문자 중 일부가 ?로 가려져 주어졌을 때, ?에 들어가는 숫자 중 가장 큰 숫자를 적용 한 후 유효한 시간을 반환하는 함수를 구현해주세요.

예제

코드

function maximumTime(time: string): string {
  const timeArr = time.split("");
  
  if (timeArr[0] === '?' && timeArr[1] === '?'){
    timeArr[0] = '2'
  } else if (timeArr[0] === '?' && Number(timeArr[1]) < 4){
    timeArr[0] = '2'
  } else if (timeArr[0] === '?'){
    timeArr[0] = '1'
  };
  
  if (timeArr[0] !== '2' && timeArr[1] === '?'){
    timeArr[1] = '9'
  } else if (timeArr[0] === '2' && timeArr[1] === '?'){
    timeArr[1] = '3'
  }
  
  if (timeArr[3] === '?') timeArr[3] = '5'
  
  if (timeArr[4] === '?') timeArr[4] = '9'
  
  return timeArr.join("")
};
//
var maximumTime = function(time) {
	let [hour, minute] = time.split(':');

	hour = hour == '??' 
		? 23
		: hour.replaceAll('?', (str, index) => {
			return index === 0 ? +hour[1] <= 3 ? 2 : 1 : hour[0] == 2 ? 3 : 9;
		})

	minute = minute.replaceAll('?', (str, index) => index === 0 ? 5 : 9);

	return `${hour}:${minute}`;
}

🗒️코멘트

접근 방식 만큼은 가장 성능이 좋은 풀이법인것 같다.

물론 수 많은 if문 때문에 가독성이 떨어져 보일 수 있으나 코딩테스트는 가독성 보다는 푸는 속도, 함수의 러닝 타임, 그리고 마지막으로 공간 복잡도만 생각을 하면 되기 때문에 이렇게 접근을 하고 넘어가면 될 것 같다.


3. Decode Ways (No.0091)

문제 설명

A message containing letters from A-Z can be encoded into numbers using the following mapping:

To decode an encoded message, all the digits must be grouped then mapped back into letters using the reverse of the mapping above (there may be multiple ways). For example, "11106" can be mapped into:

  • "AAJF" with the grouping (1 1 10 6)
  • "KJF" with the grouping (11 10 6)

Note that the grouping (1 11 06) is invalid because "06" cannot be mapped into 'F' since "6" is different from "06".
Given a string s containing only digits, return the number of ways to decode it.
The test cases are generated so that the answer fits in a 32-bit integer.

해석

숫자로 표현된 암호가 있고 암호를 해석하기 위해서는 다음과 같은 키를 적용해야 한다.

예를 들어, "11106"이라는 암호는

  • "AAJF" with the grouping (1 1 10 6)
  • "KJF" with the grouping (11 10 6)

이렇게 두 가지 방식으로 해석이 가능하다.

문제 : 숫자가 주어졌을 때, 그 숫자를 해석하는 방식의 갯수를 구하는 함수를 구현해주세요.

예제

코드

function numDecodings(s: string): number {
    if(!s || s.length === 0) return 0; 
    if(s[0] === "0") return 0; 
    if(s.length === 1) return 1;
    
    const dp: number[] = new Array(s.length + 1).fill(0); 
    dp[0] = 1; 
    dp[1] = 1;
    
    for(let i = 2; i <= s.length; i++) {
        const oneDigit: number = Number(s.slice(i - 1, i));
        if(oneDigit > 0) {
            dp[i] += dp[i - 1]; 
        }
        
        const twoDigit: number = Number(s.slice(i - 2, i)); 
        if(twoDigit >= 10 && twoDigit <= 26) {
            dp[i] += dp[i - 2];    
         }
    }
    
    return dp[s.length]
};

🗒️코멘트

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

0개의 댓글