algorithm - 기본 문제 연습

dabin *.◟(ˊᗨˋ)◞.*·2021년 9월 6일
0

CodeKata

목록 보기
3/9
post-thumbnail

세 수 중 최솟값

function minOfThree(a, b, c) {
  let answer = a;
  if (a > b) {
    answer = b
  }
  if ( answer > c) {
    answer = c
  }
  return answer
}

삼각형이 만들어질까?

function makeTrianglePossible(a, b, c) {
   let total = a + b + c;
   let max = a;
   if (b > a) max = b;
   if (c > max) max = c;
   if ((total - max) > max) return true
   else return false
}

필요한 연필은 몇 dozen?

function howManyDozen(n) {
  let answer = Math.ceil(n / 12)
  return answer
}
//Math.ceil()은 올림 메서드

1부터 n까지의 합

function sum(n) {
  let answer=0;
  for(let i=1; i<=n; i++) {
    answer += i
  }
  return answer;
}

숫자로 구성된 배열에서 최솟값

function minOfArr(arr) {
  let min = arr[0];
  for(let i = 0; i < arr.length; i++) {
    if (arr[i] < min) {
      min = arr[i]
    }
  }
  return min
}
//min값을 구해야 할 때 초기값을 큰 값으로 설정하는게 도움이 될 수 있다. 
let min = Number.MAX_SAFE_INTEGER;

내장함수로 최솟값, 최댓값을 구한다?

Math.min(2, 3, 4, 7)
Math.min([2, 3, 4])
: ()에 배열을 바로 담으면 값을 구할 수 없다.
: spread 연산자를 사용하자
Math.min(...arr)
Math.max(...arr)
: spread 연산자를 사용하지 않으려면? apply를 사용하자
: 첫 번째 인자에는 객체를 넘겨야 한다
: 두 번째 인자에 배열을 넘긴다
Math.max.apply(null, arr)

홀수 중 최솟값

function minOfOdd(arr) {
  let answer = arr.filter(i => i % 2 === 1);
  return Math.min(...arr)
}

1의 자리 수가 같은 요소는 몇 개?

function sameUnits(arr, num) {
  let answer = 0;
  for( let i=0; i<arr.length; i++) {
    if(arr[i] % 10 === num) {
      answer += 1;
    }
  }
  return answer;
}

배열의 요소 중 합쳐서 100이 되는 요소만 반환

function sumIsHundred(arr) {
  let answer = arr;
  let sum = answer.reduce((a, b)=> a+b, 0);
  for(let i=0; i<answer.length-1; i++) {
    for(let j=i+1; j<answer.length; j++) {
      if(sum - (answer[i]+answer[j]) === 100) {
        answer.splice(j, 1)
        answer.splice(i, 1)
      }
    }
  }
  return answer;
}

만약 answer[i]를 먼저지우면 index의 번호가 달라진다. 바로 splice를 다시 해주게 되면 해당 index가 아닌 다른 index에 있는 요소를 삭제하게 될 수도 있다. 따라서 순서는 j => i 가 되어야 한다.
문자열에서 A => #

function changeWord(str) {
  let answer = ""
  for( let x of str) {
    if(x === "A") {
      answer += "#"
    } else {
      answer += x
    }
  }
  return answer
}

string의 replace 메서드를 이용해보자.

function changeWord(str) {
  let answer = str
  answer = answer.replace(/A/g, '#')  //정규표현식과 global
  return answer

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace

문자열에서 주어진 문자와 일치하는 문자는 몇 개?

let sum = 0;

function sameWord(s, str) {
  for(x of str) {
    if (x === s) {
      sum += 1
    }
  }
  return sum
}

split을 사용하면 해당문자(s)가 str 가장 앞이나 뒤에 나와도 빈문자열을 요소로 추가하기 때문에 아래와 같은 코드는 동작한다.

function sameWord(s, str) {
  let answer = str.split(s)
  return answer.length - 1
}

대문자는?

let sum = 0;

function isUpperCase(str) {
  for(x of str) {
    if (x === x.toUpperCase()) {
      sum += 1
    }
  }
  return sum
}

charCodeAt()을 사용하면 대문자의 코드(65- 90)와 소문자의 코드(97 - 122)가 다르기 때문에 대문자와 소문자를 구별할 수 있다.

let sum = 0;

function isUpperCase(str) {
  let num=x.charCodeAt();
  if(num >=65 && num<=90) {
    sum++;
  }
  return sum
}

대문자로 통일

function toUpperCase(str) {
  return str.toUpperCase()
}
function toUpperCase(str) {
  let answer=''
  for(let x of str) {
    let num=x.charCodeAt()
    if(num>=97 && num<=122) {
      answer+=String.fromCharCode(num-32);
    } else {
      answer += x
    }
  }
}

String.fromCharCode()는 코드로부터 문자열을 생성해 반환한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
대문자는 소문자로, 소문자는 대문자로

answer = ''

function changeLetterCase(str) {
  for(x of str) {
    if(x === x.toUpperCase()) {
      answer += x.toLowerCase()
    } else {
      answer += x.toUpperCase()
    }
  }
  return answer
}

가장 긴 문자열 찾기

let answer = ''
let max = 0;
function longestString(arr) {
  for(let i=0; i<arr.length; i++) {
    if (arr[i].length > max) {
      max = arr[i].length
      answer = arr[i]
    }
  }
  return answer
}

가운데 문자

let answer = ''
function centerLetter(str) {
  if (str.length % 2 === 1) {
    return answer += str[Math.floor(str.length/2)]
  } else {
    return answer = str[(str.length/2 - 1)] + str[str.length/2]
  }
}
function centerLetter(str) {
  let answer = ''
  let mid=Math.floor(str.length/2)
  if (str.length % 2 === 1) {
    return answer = str.substring(mid, mid+1)
  } else {
    return answer = str.substring(mid-1, mid+1)
  }
}

substring()은 string 객체의 시작 인덱스로부터 종료 인덱스 전까지 문자열의 부분 문자열을 반환한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/substring

중복문자제거

function removeSameLetter(str) {
  let answer = ''
  for(let i=0; i<str.length; i++){
    if(str.indexOf(str[i])===i) {
      answer += str[i]
    }
  }
  return answer
}

같은 문자는 몇 개?

function howManySameLetter(s, str) {
  let answer = 0
  let position = str.indexOf(s)
  while(position !== -1) {
    answer += 1
    position = str.indexOf(s, position+1)
  }
  return answer
}

while은 조건문이 참일 때 실행되는 반복문이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/while
중복단어제거

function howManySameWord(arr) {
  let answer = []
  for(let i=0; i<arr.length; i++) {
    if(i === arr.indexOf(arr[i])){
        answer.push(arr[i])
       }
  }
  return answer
}

filter로 간단하게 만들어보자. filter 함수 내에서 v는 arr요소의 value고, i는 index 값이다. 참이 되는 값만 모아 새로운 배열로 반환한다.

function howManySameWord(arr) {
  let answer;
  answer = arr.filter( (v,i) => {
    if(arr.indexOf(v) === i) return true;
  });
  
  return answer
}
//더 간단하게?
function howManySameWord(arr) {
  let answer;
  answer = arr.filter( (v,i) => {
   	return arr.indexOf(v) === i
  });
  
  return answer
}
profile
모르는것투성이

0개의 댓글