역삼각형 출력하기 (Level 1)

문제

printReversedTriangle 메소드는 양의 정수 num을 매개변수로 입력받습니다.

다음을 참고해 *(별)로 높이가 num인 삼각형을 문자열로 리턴하는 printReversedTriangle 메소드를 완성하세요

높이(num)가 3일때 다음과 같은 문자열을 리턴하면 됩니다.

***
**
*

풀이

function printReversedTriangle(num) {
  let result = "";
  for ( let i = num; i > 0; i-- ) {
    for ( let j = 0; j < i; j++ ) {
          result += "*"
    }
    result += "\n"
  }
  return result
}

좀 다른 방법을 떠올리려 했는데 이 방법밖에 생각이 나지 않았다..

매우 안좋은 코드인건 분명하다

다른 사람의 풀이

좋은 방법이 두가지나 있어 둘다 가져왔다.

function printReversedTriangle(num) {
  var result = ''

  while(num>0){result+=Array(num+1).join("*")+'\n';num--}

  return result
}

생각치도 못한 방법이다.

join은 그냥 배열을 문자열로 바꿀때 쓴다고만 생각했는데,

빈 배열을 만들고 그 원소를 *로 잇는다는 생각은 매우 신박하며 응용해보려 해야겠다.

function printReversedTriangle(num) {
  return '*'.repeat(num) + (num && '\n' + printReversedTriangle(num - 1) || '');
}

repeat!! 이 문제에 가장 어울리는 메서드인듯하다. 재귀함수로 반복출력

적재적소에 메서드를 사용할 수 있도록 익숙해져야겠다

정수제곱근 판별하기 (Level 1)

문제

nextSqaure함수는 정수 n을 매개변수로 입력받습니다.

n이 임의의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 임의의 정수 x의 제곱이 아니라면 ‘no’을 리턴하는 함수를 완성하세요.

예를들어 n이 121이라면 이는 정수 11의 제곱이므로 (11+1)의 제곱인 144를 리턴하고, 3이라면 ‘no’을 리턴하면 됩니다.

풀이

function nextSqaure(n){
  if ( Number.isInteger(Math.sqrt(n)) ) {
    return Math.pow((Math.sqrt(n)+1), 2)
  } else {
      return "no"
  }
}

루트n이 정수인지 판별 후에 참이면 루트n에 1을 더해 제곱한 값을 리턴하고 거짓이라면 no를 출력

메서드를 많이써서 깔끔해보이지 않으니 찝찝하다

다른 사람의 풀이

function nextSqaure(n){
  var result = 0;
  var x = 0;
  while (x*x < n){
    x++;
  }
  if (x*x == n){
    x++;
    result = x*x; 
  }else{
    result = 'no';
  }

  return result;
}

반복문, 조건문으로 풀이한 식 따봉이 8개인데 코드를 보며 이해하기는 쉽지만 복잡도는 O(N)이다.

내 코드가 더 낫다! 빼액!! (비하발언아님)

  1. ㅁㄴㅁ 2018.09.22 10:57 신고

    sqrt 자체가 연산이 느려서 시간복잡도는 더 느리지 않나요?

짝수와 홀수 (Level 1)

문제

evenOrOdd 메소드는 int형 num을 매개변수로 받습니다.

num이 짝수일 경우 “Even”을 반환하고 홀수인 경우 “Odd”를 반환하도록 evenOrOdd에 코드를 작성해 보세요.

num은 0이상의 정수이며, num이 음수인 경우는 없습니다.

풀이

function evenOrOdd(num) {
  if ( num % 2 == 0 ) {
      return "Even"
  } else {
      return "Odd"
  }
}

조건문으로 나머지가 0이면 짝수, 1이면 홀수인 경우로 리턴

다른 사람의 풀이

function evenOrOdd(num) {
  return (num % 2)? "Odd":"Even";
}

어메이징 고수의 풀이. 0 == false를 이용한 삼항 연산자 사용

알고는 있었지만 풀이에 적용하도록 익숙해져야겠다.


평균 구하기 (Level 1)

문제

def average(list):

함수를 완성해서 매개변수 list의 평균값을 return하도록 만들어 보세요.

어떠한 크기의 list가 와도 평균값을 구할 수 있어야 합니다.

풀이

function average(array){
  return array.reduce((a,b) => { return a+b })/array.length
}

reduce 메서드로 배열 각원소의 합을 구하고 배열의 길이로 나눠줌

나한테도 한줄짜리 코드가 나오다니 ㅎㅎ..

다른 사람의 풀이

for문으로 작성한 분들도 있지만 reduce가 더 좋다 판단된다. (성능은 같겠지만..)

핸드폰 번호 가리기 (Level 1)

문제

별이는 헬로월드텔레콤에서 고지서를 보내는 일을 하고 있습니다. 개인정보 보호를 위해 고객들의 전화번호는 맨 뒷자리 4자리를 제외한 나머지를 “*”으로 바꿔야 합니다.

전화번호를 문자열 s로 입력받는 hide_numbers함수를 완성해 별이를 도와주세요

예를들어 s가 “01033334444”면 “*4444”를 리턴하고, “027778888”인 경우는 “*8888”을 리턴하면 됩니다.

풀이

function hide_numbers(s) {
  let hide = null;
  hide = s.substr(0,s.length-4).replace(/\d/g,"*")
  s = s.substr(s.length-4,4)
  return hide.concat(s)
}

hide라는 빈 문자열을 생성 후에 s에서 뒤에 네자리를 제외한 나머지를 *로 치환해주고

나머지 네자리는 s에 다시 할당해 둘을 concat으로 이어줌

다른 사람의 풀이

function hide_numbers(s) {
  return s.replace(/\d(?=\d{4})/g, "*");
}

정규식은 하루빨리 익혀야겠다.

자바스크립트 알고리즘

구직하는데 필수인 알고리즘 테스트

자료구조와 알고리즘의 필요성을 느끼지 못해 (허접이라) 공부를 안하다가 기본기를 다짐과 동시에 일을 구하기 위해

유일하게 아는 스크립트 언어 자바스크립트로 알고리즘 문제를 풀고 기록해보려함

기본도 안돼있는 매우 허접이지만 열심히 풀어봄

tryhelloworld 사이트


+ Recent posts