Study

[ javascript && Python ] 알고리즘 챌린지 "Part3"

wookjae 2023. 2. 13. 02:35

about:blank

 

Question21. 팩토리얼

i 팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다.
정수 n이 주어질때 다음조건을 만족하는 가장 큰 정수 i를 
return 하도록 solution함수를 완성해보세요.

조건
i! <= n

제한사항
0 < n < 3,628,800

 

# javascript 답안

function solution(n) {

   let i = 1;                    //  곱셈의 누적 시퀀스 (i, i+1, i+1+1... )
   let factorial = 1;        //  곱셈의 누적 값 

   while (factorial <= n) {

      i += 1
      factorial *= i
   }

   return i-1;
}

# python 답안 

##### 방법1 

def solution(n):    

    factorial = 1      
    i = 1 
    
    while factorial <= n: 
        i += 1
        factorial *= 1
        
    return i-1

##### 방법2 : math 라이브러리 사용하기 

from math import factorial 


def solution(n):    
    i = 1     
    
    while factorial(i) <= n: 
        i += 1
        
    return i - 1

 

Question22. k의 개수 

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때,

i부터 j까지 k가 몇번 등장하는지 return 하도록 solution함수를 완성해보세요.

제한사항
* 1 <= i < j <= 100,000
* 0 <= k <= 9

 

# javascript 답안

/*** 방법1 */
function solution(i, j, k) {

    let s = '';
 
    for (i; i<=j; i++) {
 
        s+= i;
    }

    return s.split(k).length - 1;
}

/*** 방법2 */
function solution(i, j, k) {
    // Array(j) : j크기만큼의 빈 공간의 배열을 생성

    return (
        Array(j - i + 1)
           .fill(i)
           .map((val, index) => val + index)  
           .join("")                                             // ""빈 문자열 기준으로 배열을 문자열로 변환..
           .split(k).length - 1                             // k기준으로 split(분산) 할 시 갯수가 하나 더 생기므로 -1..
    );
}

# python 답안 


def solution(i, j, k):        

    
    # count('찾을문자') -- 문자열에서 해당 문자의 수를 찾아서 갯수를 리턴한다.
    return str(list(range(i, j+1))).count(str(k));

 

Question23. 가까운 수 

정수배열 array와 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운수를 return 하도록 solution함수를 완성해주세요.

제한사항
* 1 <= i < j <= 100,000
* 0 <= k <= 9

 

# javascript 답안

function solution(array, n) {

    // 차이가 동일한 다른 두 수가 존재할 시 작은 값을 리턴하도록 정렬수행. 
    array.sort((a, b) => a - b);

    let 두수의차 = Infinity;
    let result = 0;

    for (let i of array) {
        if (Math.abs(n - i) < 두수의차) {
            두수의차 = Math.abs(n - i);
            result = i;
        }
    }

    return result;
}

# python 답안 

##### 방법1 
def solution(array, n):        

    
    # 차이가 동일한 다른 두 수가 존재할 시 작은 값을 리턴하도록 정렬수행. 
    # array = sorted(array) 

    compVal = float('inf')    
    result = 0
    
    for i in array:
        if abs(n-i) < compVal: 
            compVal = abs(n-i)
            result = i
    
    return result 

##### 방법2
def solution(array, n):        
    return sorted(array, key=lambda v: (abs(v-n), v-n))[0]  

 

Question24. 한 번만 등장한 문자 

문자열 s가 매개변수로 주어집니다. s에서 한번만 등장하는 문자를 사전순으로 정렬한 문자열을 return 하도록 solution함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다. 

제한사항
* s는 소문자로만 이루어져 있습니다.

 

# javascript 답안

/*** 방법1 */
function solution(s) {

   // 문자열 s를 배열로 변환한다.
   //let ss = [...s];
   //let ss2 = s.split("");

   return [...s]
      .filter((val) => s.split(val).length == 2)
      .sort()
      .join('');
}

/*** 방법2: 정규표현식 사용 */
function solution(s) {

   // 문자열 s를 배열로 변환한다.
   //let ss = [...s];
   //let ss2 = s.split("");

   // new RegExp(ab, "g")
   //   >>  /ab/g   "문자열을 전역적으로 검색하되 'ab' 만 추출"

   return [...s]
      .filter((c) => s.match(new RegExp(c, "g")).length == 1)  // 정규표현식 (/{val}/g)
      .sort()
      .join("");
}

# python 답안 

##### 방법1 
def solution(s):    
    
    # for --> if --> c (Result) --> sorted --> join 
    return ''.join(sorted([c for c in s if s.count(c) == 1]))

##### 방법2 : collections 라이브러리 사용하기
from collections import Counter 

def solution(s):    
    
    string = []
    
    # i: 각 요소, j: 각 요소의 갯수
    for i, j in Counter(s).items(): 
        if j == 1: 
            string.append(i)
    
    return ''.join(sorted(string))

print("111233444456777")

 

Question25. 잘라서 배열로 저장하기 

문자열 my_strn이 매개변수로 주어질때, my_str을 길이 n씩 잘라서 저장한 배열을 return 하도록 solution함수를 완성해 주세요.

 

# javascript 답안

/*** 방법1: 정규표현식 사용 */
function solution(my_str, n) {
   

   // 정규표현식 에서 "."  은 모든문자를 포함하는 문자열 이다.

   return my_str.match(new RegExp(`.{1, ${n}}`, 'g'));
   //return my_str.match(new RegExp(`.{1, ${n}}`, 'g'));
}

/*** 방법2 */
function solution(s) {

   let result = [];

   for (let i = 0; i< my_str.length; i+=n) {

     result.push(my_str.slice(i, i+n));
   }

   return result;
}

# python 답안 

##### 방법1

import re 

def solution(my_str, n):
    
    # RegExp Pattern 
    # p = re.complie(f'.{{1, 3}}')
    p = re.complie(f'.{{1, {n}}}')
    return p.findall(my_str)  

##### 방법2
def solution(my_str, n):
    
    # range(start, end, step)
    return [my_str[i:i+n] for i in range(0, len(my_str), n)]

print('Result : ', solution("abcdefefghijknmop", 3))    // 결과확인.

 

Question26. 진료 순서 정하기 

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다.

정수 배열 emegency가 매개변수로 주어질때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return 하도록 solution함수를 완성해 주세요.

 

# javascript 답안

function solution(emergency) {
 
   // 응급한 환자부터 내림차순 정렬
   // slice() 함수를 써야 "깊은복사"가 되서 원본에 영향을 미치지 않는 복사본이 응급순서 변수에 저장.
   let 응급순서 = emergency.slice().sort((a, b) => b - a);   // b-a시.. 내림차순 정렬..

   //emergency.map(v => 응급순서.indexOf(v));
   console.log("응급순서 :", 응급순서);
   console.log("emergency: ", emergency);

   return emergency.map((v) => 응급순서.indexOf(v) + 1);
}

# python 답안 

def solution(emergency):
    
    # 응급순서를 정렬 (내림차순) 
    emergencySort = sorted(emergency, reverse=True)
    
    # Method1
    #return list(map(lambda x:emergencySort.index(x) + 1, emergency))    
    
    # Method2 
    return [ emergencySort.index(i) +1 for i in emergency ]

 

Question27. 영어가 싫어요 

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

 

# javascript 답안

/*** 방법1 */
function solution(numbers) {

   // String 에서 Number 형변환 하는 방법
   // +를 붙여준다
   // Number
   return +numbers.replaceAll('one', '1').replaceAll('two', '2')
                              .replaceAll('three', '3').replaceAll('four', '4')
                              .replaceAll('five', '5').replaceAll('six', '6')
                              .replaceAll('seven', '7').replaceAll('eight', '8')
                              .replaceAll('nine', '9').replaceAll('zero', '0');
}

/*** 방법2 */
function solution(numbers) {

   const obj = {
     one: 1,
     two: 2,
     three: 3,
     four: 4,
     five: 5,
     six: 6,
     seven: 7,
     eight: 8,
     nine: 9
   };

   // 정규식을 활용한 replace( "정규식",  "Replacer Function")
   return Number(numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g
                          ,(v) => { return obj[v] }));
}

# python 답안 

##### 방법1
def solution(numbers):

    
    return int(numbers.replace('one', '1').replace('two', '2')

                  .replace('three', '3').replace('four', '4')
                  .replace('five', '5').replace('six', '6')
                  .replace('seven', '7').replace('eight', '8')
                  .replace('nine', '9').replace('zero', '0'))

##### 방법2
import re 


def solution(numbers):
    
    s = ''                     # Return 누적 값.
    d = {
             'one': '1',
             'two': '2',
             'three': '3',
             'four': '4',
             'five': '5',
             'six': '6',
             'seven': '7',
             'eight': '8',
             'nine': '9',
             'zero': '0'
           }
        
    for i in re.findall(r'(zero|one|two|three|four|five|six|seven|eight|nine)', numbers):
        s += d[i] 
    
    return int(s)
    
print('Result : ', solution("onefivesevenzero"))   # 1570

 

Question28. 외계어 사전

외계행성에 불시착한 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴배열 spell과 외계어사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 , 존재하지 않는다면 2를 return 하도록 solution함수를 완성해 주세요. (dic과 spell은 모두 중복된 원소X)

 

spell dic result
["p", "o", "s"] ["sod", "eocd", "qixm", "adio", "soo"] 2 (조건을 만족하지 않음)
["z", "d", "x"] ["def", "dww", "dzx", "loveaw"] 1 (조건을 만족함)

 

# javascript 답안

function solution(numbers) {

    var answer = 0;

    return dic.some((v) => [...v].sort().toString() === [...spell].sort().toString())
               ? 1
               :  2;

    //let ttt = dic.map((v) => [...v].sort());
    //console.log("dic Result ::" + ttt);
    //console.log("spell : " + [...spell].sort());
    //console.log("spell : " + typeof [...spell]); 
}

[ 배열내장함수 ]
* some( callbcak )   >> 콜백함수의 결과가 하나라도 만족한다면 true (Boolean 으로 리턴)
* every( callbcak )   >> 콜백함수의 결과가 모두 만족한다면 true (Boolean 으로 리턴)

# python 답안 

def solution(spell, dic): 

    for di in dic: 
        if sorted(di) == sorted(spell):
            return 1
            
    return 2

# 결과 1
print(solution(["b","c","a"], ["xman", "wodi", "cab", "buxz"]))  

 

Question29. 문자열 밀기

문자열 hello에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 str1str2가 매개변수로 주어질 때 str1을 밀어서 str2가 될 수 있다면 몇번 밀어야 하는지 횟수를 return 하고 str2가 될 수 없으다면 -1을 return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

/*** 방법1 */
function solution(str1, str2) {
   
    // 1차원으로 만든 후 전체 문자열 길이에서 이동 문자열에 대한 인덱스를 뺀다.. 
    return str1.length - ((str1+str1).indexOf(str2));
}

/*** 방법2 */
function solution(str1, str2) {
    
    // llohellohe  .indexOf ("hello")
  
    return (str2+str2).indexOf(str1);
}

solution("hello", "llohe");

# python 답안 

def solution(str1, str2): 

    # 메소드 index 경우, 찾지못할 시. -1리턴이 아닌 에러가 발생된다. 따라서 find사용
    # return (str2 * 2).index(str1)
    return (str2 * 2).find(str1)    

 

Question30. 컨트롤 제트

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이때 "Z"가 나오면 바로전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 "Z"로 이루어진 문자열  s가 매개변수로 주어질 때, 머쓱이가 구한 값을 return 하도록 solution함수를 완성해주세요.

str result
"1 2 Z 3" 4
"10 Z 20 Z 1" 1

 

# javascript 답안

function solution(numbers) {

    s = s.split(" ");

    let result = [];         // 리턴 값.

    for (let i of s) {

        if (i === "Z") {

            result.pop();    // 배열의 마지막 요소를 제거 
        } else {
            result.push(Number(i));
        }
    }

    // 누적 값 계산 후 리턴..
    return result.reduce((a, c) => a + c, 0);
}

console.log("Result : "+ solution("1 2 Z 3"));

# python 답안 

def solution(s):
    
    result = []
    arr = s.split(' ')
    
    for i in arr: 
        if i == 'Z':
            # pass: is Equal.. Java (continue)
            result.pop()
        else:
            result.append(int(i))
                
    return sum(result)