자바스크립트 알고리즘 공부(1)

Lee.GS·2021년 2월 27일
0

1. DescendingOrder

Your task is to make a function that can take any non-negative integer as an argument and return it with its digits in descending order. Essentially, rearrange the digits to create the highest possible number.
=>
입력값으로 음수가 아닌 숫자가 주어지고, 각 숫자를 내림차순으로 정렬한 후에 return 해주면 된다.

Examples:
Input: 42145 Output: 54421

Input: 145263 Output: 654321

Input: 123456789 Output: 987654321

풀이

function descendingOrder(n){
  return Number(n.toString().split("").sort((a,b) => b-a).join(""))
}

ex) n이 42145라면
n.toString() // "42145"
.split("") // 각문자열을 배열로 변환, ["4","2","1","4","5"]
sort((a,b) => b-a) // sort함수를 이용해서 내림차순으로 정렬한다. ["5","4","4","2","1"]
.join("") // 각 배열의 값을 문자열로 합쳐준다, "54421"
Number() // 문자열값을 Number로 변환한다

2. Chuck Norris IV - Bearded Fist

It has long been rumoured that behind Chuck's beard is not a chin, but another fist!

When shaving, Chuck accidentally punched himself in the face. He is the only man that could take that punch without dying, but that doesn't mean it didn't sting! Chuck can't remember a thing - he needs your help!!

Hidden within the provided array of arrays are numbers that represent the letters of the words for some of Chuck's favourite things! Your job is to translate them, and return the words so that Chuck can get back to the business of punching and kicking things.
=>
각 숫자들에 대해 아스키코드로 변환해서 리턴

EXAMPLE
(1)
input : fistBeard([[78], [117, 110, 99], [104, 117], [107, 115]])
output : 'Nunchuks';
(2)
input : fistBeard([[70, 97, 99], [101, 45, 75, 105, 99, 107]])
output : 'Face-Kick'

풀이

function fistBeard(arr) {
  var step1 = arr.join(',') // "78,117,110 ..."
  var step2 = step1.split(',') 
  var answer = ''
  
  for(let i = 0; i<step2.length; i++) {
    answer = answer + String.fromCharCode(step2[i])
  }
  return answer
}

arr가 2차원 배열로 있는 경우가 있으니
arr.join(',')으로 배열을 문자열로 바꿔준 후에
다시 split(',')으로 1차원배열로 만들어준다.
그 후에 for문으로 각 글자에 대한 아스키코드를 answer에 넣어주고 리턴해준다.

3. A-Number

넥슨 프로그래밍 출제문제

0보다 큰 정수x에 대해, 함수F(x)를 다음과 같이 정의하자.
x가 10진수로 표현했을 때 K자리인 수라면,
F(x) = (x를 제곱해서 10진수로 표현하고 마지막 K자리를 취한 값이 x와 같으면) 1, (그렇지않으면) 0

몇가지 예를 들면
F(1) = 1이다 (11 = 1)
F(2) = 0이다 (2
2 = 4)
F(3) = 0이다 (33 = 9)
F(10) = 0이다 (10
10 = 100)
F(625) = 1이다 (625*625 = 390625)

어떤 주어진 정수 n에 대해, x<n이면서 F(x) = 1을 만족하는 정수 x들 중 가장 큰 정수를 찾는 프로그램을 작성하라.

입력 형식
정수 n이 주어진다. n은 0보다 크고 2147483647보다는 작다.
출력 형식
입력받은 n에 대해, F(x) = 1, x < n을 만족하는 정수 x들중 가장 큰 정수를 리턴한다.

풀이

function aNum(x) {
    var len = x.toString().length
    var mul = x*x
    var a = mul.toString()
    var res = ''
    for(let i = a.length-len; i<a.length; i++) {
        res = res + a[i]
    }
    var b = Number(res)
    if(b === x) {
      return 1
    }
    if( b !== x) {
      return 0
    }
}

4. Playing with digits

  • 정수 n과 p가 주어지고, p를 n의 각 자리숫자에 p승을 하나씩 증가시켜서 그 값이 n으로 나눠졌을 때의 숫자를 반환.
    계산이 안되면 -1 반환.
    ex) n=89, p=1 일때, 89는 8^1 + 9^2으로 계산되고, 89 = 891 이므로 answer는 1을 반환한다.
    n=46288, p=3일때, 46288은 4^3 + 6^4 + 2^5 + 8^6 + 8^7 = 2360688으로 계산되고 2360688 = 46288
    51이므로 answer는 51을 반환한다.

풀이

  • 먼저 n을 toString을 통해 각 자리로 나눈후에 for문을 돌려서 Math.pow(ntoStir[i], p+i)로 값을 middleAnswer에 대입한 후에 n으로 나눈 숫자를 answer로 반환한다. 만약 middle / n이 정수가 나오지 않는다면 -1을 반환시킨다.
코드
function digPow(n, p){
  var middleAnswer = 0
  var ntoStr = n.toString()
  for(let i = 0; i<ntoStr.length; i++) {
    middleAnswer = middleAnswer + Math.pow(ntoStr[i],p+i)
  }
  if(!Number.isInteger(middleAnswer/n)) {
    return -1
  }
  var answer = middleAnswer / n 
  return answer
}

0개의 댓글