Study

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

wookjae 2023. 1. 29. 00:43

about:blank

 

Question11. 배열 두배 만들기  

정수배열  numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진  배열을 return 하도록 solution함수를 완성해보세요.

 

# javascript 답안

function solution(numbers) {

   return numbers.map(v => v * 2);
}

// map 함수의 역할로 써 특정 요소만 추출하는 목적으로도 사용한다. 
Cf).
       var data = [
          { name, age, address, email, favorite }, 
          { name, age, address, email, favorite }, 
          { name, age, address, email, favorite },
        ];
      
        // data 의 name속성 만 추출  
        data.map(v => v['name'])        // name만 갖는 배열리턴

        // data 의 name, age 속성 추출..  
        data.map(v => [ v['name'], v['age'] ])  // name과 age를 갖는 배열을 갖는 배열을 리턴
        

# python 답안 

##### 방법1 

def doubleFn(x):
    return x * 2

def solution(numbers):
        
    # map 함수 + 람다(lambda)
    # map( 람다(익명함수) , 매개변수(배열) )

    # return list(map(lambda x: x*2, numbers))

    return list(map(doubleFn, numbers))

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

import numpy as np 

def solution(numbers):

    numbers = np.array(numbers)
    
    return (numbers*2).tolist() 




 

Question12. 문자열 뒤집기 

문자열  my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return 하도록 solution함수를 완성해보세요.

 

# javascript 답안

// 방법1. 
function solution(my_string) {

   // Array.from('문자열') -- 문자열 각 요소를 배열로 생성 
   // join함수 -- 배열을 구분자 기준으로 다시 문자열로 결합 
   return Array.from(my_string).reverse().join('')
}

// 방법2. 
function solution(my_string) {

   return my_string.split('').reverse().join("");
}

/** 배열에 관한 컨트롤

  Array('hello world');     // ['hello world']
  Array(10);                    // 크기가 10인 빈 배열을 생성
  '@'.repeat(10).split('@')    // 크기가 11인 빈 배열을 생성
**/        

# python 답안 

def solution(my_string):    
    # 슬라이싱 [start : stop : step]
    # 슬라이싱은 원본과의 별개 주소로 변수에 복사(깊은복사 == 다른 주소값 할당) 
    # 메모리 공간을 새로 차지하여, 공간복잡도가 증가한다.     

    return my_string[::-1]         

    # 인덱스는 0부터 시작.
    # return my_string[0::2]       0번 인덱스 부터 2스탭씩 증가하여 요소추출..

 

Question13. 특정 문자열 제거하기 

문자열  my_string과 문자 letter가 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return 하도록 solution함수를 완성해주세요 

 

# javascript 답안

function solution(my_string, letter) {

   // 정규표현식 사용
   // 'g' : 전역적 표현

   /*  
      RegExp('[A-Z]', 'g');    //RegExp(문자열, 플래그)
     
       --> /[A-Z]/g 와 같이 치환된다.
      값의 전역적으로 A부터 Z값이 있는지 확인

      /[123]/g
      값의 전역적으로 1,2,3 있는지 확인
 
      /[1-9]/g
      /[a-z]/g
   */

   let reg = new RegExp(letter, 'g');

   // replace('정규식', '치환될 값')
   return my_string.replace(reg, '')

   //return my_string.replaceAll(letter, '')
}

# python 답안 

import re 

def solution(my_string, letter):    
    return re.sub(letter, '', my_string)
        
# 정규표현 결과 값에 대해서 출력시도...
print(solution('ABCD1234asdiidv983', '[a-zA-Z]'))    

 

Question14. 배열의 유사도 

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열  s1s2가 주어질 때 같은 원소의 갯수를 return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

function solution(s1, s2) {

    // CASE1. 배열내장함수 filter사용

    //return s1.filter(v => v > 2);
    //return s1.filter(v => s2.includes(v));
    return s1.filter(v => s2.includes(v)).length;

    // CASE2. SET(집합) 사용
    // new Set([...s1], [...s2]).size
    // Set은 중복을 제거하여 내부 요소를 전개한다..
    // Set의 Type은 Object이다.
    //return s1.length + s2.length - new Set([...s1], [...s2]).size;
}

# python 답안 

def solution(s1, s2):
    
    # CASE1. 일반적인 제어문 사용
    # answer = 0
    
    # for i in s1: 
    #     if i in s2: 
    #         answer += 1
    # return answer

    # CASE2. 집합 (Set) 사용
    # return len(set(s1) & set(s2))
    return len(s1) + len(s2) - len(set(s1 + s2))

 

Question15. 가위 바위 보 

가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우의 순서대로 나타낸 문자열을 return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

function solution(rsp) {
    // CASE1. 반복, 제어문 활용
    // var answer = "";

    // for (let i of rsp) {
        // if (i == "0") {
            // answer += 5;
        // } else if (i == "2") {
            // answer += 0;
        // } else if (i == "5") {
            // answer += 2;
        // }
    // }

    // return answer;
 
    // CASE2. 전개연산자활용
 
    // let testVal = [...rsp];
    // let testVal2 = [1, 2, 3, 4, 5];

    // console.log("-----------23-------------");
    // console.log("testVal Type :", typeof testVal);
    // console.log("testVal Type :", typeof testVal2);

    // for (let i = 0; i < testVal.length; i++) {
        // console.log(testVal[i]);
    // }
    //console.log("------------23------------");
    let answer = {
        "0": "5", // 바위(0)를 이길수 있는건 보 (5)
        "2": "0", // 가위(2)를 이길수 있는건 바위(0)
        "5": "2" // 보(5)를 이길수 있는건 가위 (2)
    };

    return [...rsp].map((v) => answer[v]).join("");
}

# python 답안 

def solution(rsp):

    answer = ''
    
    # CASE1. 반복, 제어문 활용
    
    # for i in rsp: 
    #     if i == '0': 
    #         answer += '5'
    #     elif i == '2':
    #         answer += '0'
    #     elif i == '5':
    #         answer += '2'
    
    # return answer
    
    # CASE2. 전개연산자활용
    d = {'0': '5', '2': '0', '5': '2'}       # 객체형태의 딕셔너리 생성
    
    #for i in rsp:
    #    answer += d[i]
    
    #return answer

    # 위 for문을 간결하게 표기 
    # 가상배열에 [ ] 반복문을 돌려서 나온 d[i] 값을 넣고,
    # join 함수를 써서 다시 문자열로 변환
    return ''.join( [ d[i] for i in rsp ] )   

 

Question16. 배열 회전시키기

정수가 담긴배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction 방향으로  한 칸씩 회전시킨 배열을 return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

function solution(numbers, direction) {

    // 방향에 대한 분기처리 (Direction)

    if (direction == "right") {
        // 배열의 맨 뒤 요소를 추출하여 맨 앞에 삽입
        //numbers.unshift(numbers.pop());
        numbers = [numbers.pop(), ...numbers];
    } else {
        // 배열의 0번째 요소를 추출하여 맨 뒤 에 삽입
        //numbers.push(numbers.shift());
        numbers = [...numbers.slice(1), numbers.shift()];
    }

    return numbers;
}
 

# python 답안 

# CASE1. 라이브러리 미 사용 (슬라이싱 사용)

def solution(numbers, direction):

    if direction == 'right':
        return [numbers[-1]] + numbers[:-1]
    else: 
        return numbers[1:] + [numbers[0]]
    
    return answer

# CASE1. deque 라이브러리 사용 

from collections import deque 

def solution(numbers, direction):

    if direction == 'right':
        numbers = deque(numbers)
        numbers.rotate(1)
        return list(numbers)
    else: 
        numbers = deque(numbers)
        numbers.rotate(-1)
        return list(numbers)

 

Question17. 외계행성의 나이 

우주여행을 하던 머쓱이는 엔진 고장으로 XX행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, XX행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ... j는 9 입니다. 예를들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 XX행성의 표현식 나이를 return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

function solution(age) {

    // 만들고 싶은 대상 [2, 3]
    // let testAge = 23;
    // Array(testAge.toString()); // ['23']
    // Array.from(testAge.toString()); // ['2','3']

    let chr = 'abcdefghij';

    //return Array.from(age.toString()).map(v => 'abcdefghij'[v]).join('');
    return Array.from(age.toString()).map(v => chr[v]).join('');
}
 

# python 답안 

def solution(age):
    
    kijunAge = 'abcdefghij'
    
    # age를 문자열로 변환하여 하나 씩 순회하면서 값을 꺼내어,
    # 람다 식 으로 하나하나의 요소에 관한 kigunAge 매핑 요소에 관한 배열 생성 후 다시 문자열로 변환.
    return ''.join(map(lambda x: kijunAge[int(x)]  ,str(age)))
    
print('Resolve: ', solution(23))    

 

Question18. 369게임 

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 갯수만큼 박수를 치는 게임 입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 . return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

function solution(order) {

    // CASE1. 정규식을 활용한 해결
    // toString변수는 변수에만 사용가능하다. 100.toString (X)
    /** Nullish 연산 -'??'
     * '??' 기준, 좌변의 값 이 Null 일때 우변의 값으로 적용
     **/
    //let value = order.toString().match(/[369]/g) ?? [];

    //return value.length;

    // CASE2. SET 활용
    // Set --> .has() 포함되고있냐 ??
    const s = new Set("369");

    // return order.toString().split('').filter(v => v == '3' || v == '6' || v == '9' ? true: false).length;

    return order.toString().split("").filter((v) => s.has(v)).length;
}

# python 답안 

def solution(age):
    
    answer = 0    
    order = str(order)
    
    # CASE1. 기본함수 사용
    
    # answer += order.count('3')
    # answer += order.count('6')
    # answer += order.count('9')
    
    # return answer 

    # CASE2. 람다 Map활용
    # answer = sum(map(lambda x: order.count(x), '369'))

    # CASE3. 람다 Filter활용
    answer = len(list(filter(lambda x: x in '369', order)))

# 라이브러리 're'사용
import re 

def solution(order):

    order = str(order)
    
    return len(re.findall('[369]', order))
    
  

 

Question19. 중복된 문자 제거

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return 하도록 solution함수를 완성해주세요.

 

# javascript 답안

function solution(my_string) {

   
    // 자바스크립트에서 SET은 숫서를 보장한다.
    // SET은 그냥 Object이다. 배열이 아니다..
    // 숫서를 보장하면서 전개연산 [... ] 을 사용하면 배열로 생성된다.

    let answer = [...new Set(my_string)].join("");

    return answer;
}

# python 답안 

def solution(my_string):

    # dict 자료형의 fromkeys 함수는 문자열을 순회하며, 중복제거+순서제공 하여 
    #  JSON형태의 값을 형성함
    #     cf). dict.fromkeys('abc', 'v')  --> { 'a': 'v', 'b': 'v', 'c': 'v'   }
    return ''.join(dict.fromkeys(my_string))
 

 

Question20. A로 B만들기 

문자열 before, after 가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 무 있으면 1을, 만들수없으면 0을 return 하도록 solution함수를 완성해보세요.

 

# javascript 답안

function solution(my_string) {

   
    let answer = "";

    // 각 문자열, 매개변수를 배열로 변환 후
    // 정렬을 수행. 정렬된 배열을 문자열로 변환 후 비교.
    answer = before.split("").sort().join("") === after.split("").sort().join("")
                   ? 1
                   : 0;

    return answer;
}

# python 답안 

def solution(before, after):
    
    # 문자열을 배열로 변환 list 정렬 sort 
    return 1 if sorted(list(before)) == sorted(list(after)) else 0