[알고리즘] 데일리 코딩1-10문제

HIHI JIN·2023년 1월 19일

알고리즘

목록 보기
6/29
post-thumbnail

30분 동안 1문제씩 시간을 정해두고 푸는 코딩 학습 방법을 적용하고
풀이코드를 작성하였습니다.

1.배열을 입력받아 차례대로 배열의 첫 요소와 마지막 요소를 키와 값으로 하는 객체를 리턴해야 합니다. 빈 배열을 입력받은 경우, 빈 객체를 리턴해야 합니다.
입력으로 받는 배열을 수정하지 않아야 합니다.

function transformFirstAndLast(arr) {
  let obj = {};
  if(arr.length === 0) return obj;
  obj[arr[0]] = arr[arr.length-1];
  return obj;

}
//arr 첫 요소가 키, 마지막 요소가 값이 되는 객체 리턴
//문자열을 객체의 키로 주고싶다면 obj[property]써야 함!!
//빈배열이라면 빈객체 리턴

2.연이율을 입력받아 원금이 2배 이상이 될 때까지 걸리는 시간(년)을 리턴해야 합니다.
number 타입을 리턴해야 합니다.

function computeWhenDouble(interestRate) {
  let year = 0;
  let a = 1;
  let interest = 1 + interestRate / 100;
  for(let i = 1; a<2; i++){
    a = a*interest;
    year++;
  }
  return year;
}
/*
연이율이 100%라면 걸리는 시간은 1년? No
만약 원금이 100만원 연이율이 10%라면, 100*0.1=10만원 1년에 10만원씩 이자가 붙음
내년에는 원금 100만원이 110만원이 된다. 110만원에 연이율 10%라면, 110*0.1=11만원 11만원 이자가 붙음
또 내후년에는 121만원이 되고 .....
원금 += (원금*0.1) <- 원금 >= 원금*2 가 될 때까지 count++

let 걸리는 시간 = 0;
let 원금 = 1;
let 이자율 = 1 + interestRate / 100; //10이면 1.1
//원금 = 원금*(1+이자율)하면 원금+(원금*이자율)과 같은 계산이다.
//원금이 2배와 같아지기 전까지 for문 돌리기
for(let i = 1; 원금<2; i++){
  원금 = 원금 *(1+이자율);
  걸리는 시간++;
}
return 걸리는 시간;
*/

3.수를 입력받아 2의 거듭제곱인지 여부를 리턴해야 합니다.
반복문(while)문을 사용해야 합니다.
2의 0승은 1입니다.
Number.isInteger, Math.log2, Math.log 사용은 금지됩니다.

function powerOfTwo(num) {
  if (num === 1) {//2의 0승은 1
    return true;
  }
  if (num % 2) {//홀수라면
    return false;
  }
  let i = 1;
  let count = 0;
  while(i<100){ //임의값 100까지 반복하기
    if(Math.pow(2,i)===num){ //2의 100승까지 중에서 num과 같은게 있으면 count
      count++;
    }
    i++;
  }
  if(count === 1){
    return true;
  }else{
    return false;
  }
}
//거듭제곱 구하는 방법
//2**3 = 2*2*2=Math.pow(2,3)
//2의 거듭제곱은? 2,4,8,16,32,64,128...중에 num이 있으면 true
//for반복문으로 숫자 나열 i=1부터 num까지
//if Math.pow(2,i)===num이면 return true;

/*
function powerOfTwo(num) {
  if (num === 1) {//2의 0승은 1
    return true;
  }
  if (num % 2) {
    return false;
  }
  let x = 2;
  while (x < num) { //2<8 8이 되기전까지
    x = x * 2; //2를 계속 곱해서 마지막 결과값이 8이 된다.
  }
  return x === num;
}
*/

4.문자열을 입력받아 문자열을 구성하는 각 단어의 첫 글자로 이루어진 문자열을 리턴해야 합니다.
단어는 공백 한 칸으로 구분합니다.
연속된 공백은 없다고 가정합니다.
빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.

function firstCharacter(str) {
  if(str === "") return "";
  let answer = "";
  let arr = str.split(" ");
  for(let i=0; i<arr.length; i++){
    answer += arr[i][0];
  }
  return answer;
}
//str.split("")으로 공백을 기준으로 나눠서 배열arr만들기
//배열 첫문자열요소에 첫 인덱스구하기 arr[0][0]
//배열 마지막문자열요소에 첫 인덱스구하기 arr[arr.length-1][0]
//for반복문으로 arr[i][0], 변수 answer에 값을 저장해서 문자열 다합치기

5.문자열을 입력받아 순서가 뒤집힌 문자열을 리턴해야 합니다.
배열은 arr.reverse를 통해 쉽게 뒤집을 수 있습니다.

function firstReverse(str) {
  return str.split("").reverse().join("");
}
//배열은 arr.reverse를 통해 쉽게 뒤집기 가능
//str.split("")으로 배열arr만들기
//arr.reverse()로 배열 뒤집기reverseArr변수에 넣기
//reverseArr.join("")으로 배열을 문자열로 하나로 합쳐서 리턴

6.문자열을 입력받아 문자열을 구성하는 각 단어의 첫 글자가 대문자인 문자열을 리턴해야 합니다.
단어는 공백으로 구분합니다.
연속된 공백이 존재할 수 있습니다.
빈 문자열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.

function letterCapitalize(str) {
  return str.replace(/\b[a-z]/g, char => char.toUpperCase());
}
//str을 구성하는 각 단어의 첫글자가 대문자인 문자열 리턴
//\b는 문자의 경계선을 의미,단어의 시작 부분을 찾을 수 있다.
//g는 일치하는 패턴을 모두 변경하라는 의미
//공백을 기준으로 첫번째단어가 a-z중에 있다면 첫글자를 대문자로 치환하기

//레퍼런스 코드
function letterCapitalize(str) {
  let words = str.split(' ');

  for (let i = 0; i < words.length; i++) {
    if (words[i].length > 0) {
      words[i] = words[i][0].toUpperCase() + words[i].substr(1);
    }
  }
  str = words.join(' ');
  return str;
}//words[i].length > 0  => 빈 문자열이 아니라면
//단어의 0번째 인덱스를 대문자로 바꾸고 인덱스1부터끝까지 옆에 붙이고 join으로 문자열로 반환

7.2차원 배열(배열을 요소로 갖는 배열)을 입력받아 각 배열을 이용해 만든 객체를 리턴해야 합니다. 중복되는 키의 경우, 초기의 값을 사용합니다.
빈 배열을 입력받은 경우, 빈 객체를 리턴해야 합니다.
arr[i]의 길이가 0인 경우, 무시합니다.

function convertListToObject(arr) {
  let obj = {};
  for(let i = 0; i < arr.length; i++){
    if(arr[i].length > 1 && obj[arr[i][0]] === undefined){
      obj[arr[i][0]] = arr[i][1];
      delete obj[undefined];
    }
  }
  return obj;
}
//새로운 객체 obj 선언
//for문으로 arr[i]를 나열하고
//obj[arr[i][0]] = arr[i][1]
//obj 키가 중복되면 초기값으로 고정, 나중에꺼 지우기
//만약 obj[arr[i][0]] obj키값이 빈값이라면 => 해주기
//if(obj[arr[i][0]] === undefined)<--키값이 undefined라는 건 아직 정의되지 않았다,아직 키가 추가되지않았다
//if(obj[arr[i][0]] === "") <--이 코드는 작동하지 않는다.

//arr[i].length가 1보다 크다면 = arr[i].length가 0이 아니고,arr.length도 0이 아니고

8.문자열을 입력받아 해당 문자열에 등장하는 두 칸의 공백을 모두 한 칸의 공백으로 바꾼 문자열을 리턴해야 합니다. 두 칸을 초과하는 공백은 존재하지 않는다고 가정합니다.

function convertDoubleSpaceToSingle(str) {
  return str.split(" ").filter(v => v!=="").join(" ");
  
}
//str의 2칸의 공백을 모두 1칸의 공백으로 바꾸기
//str.split(" ")으로 공백1개기준 띄우기
//'this', '', 'here', '', 'string'
//filter로 공백걸러주기 v => v!==""
//'this', 'here', 'string'
//join(" ")으로 문자열 중간에 공백 하나만 줘서 출력

9.문자열을 입력받아 문자열 내에 아래 중 하나가 존재하는지 여부를 리턴해야 합니다.
'a'로 시작해서 'b'로 끝나는 길이 5의 문자열
'b'로 시작해서 'a'로 끝나는 길이 5의 문자열
대소문자를 구분하지 않습니다.
공백도 한 글자로 취급합니다.
'a'와 'b'는 중복해서 등장할 수 있습니다.

function ABCheck(str) {
  let lowerStr = str.toLowerCase();
  let a = lowerStr.indexOf('a');
  let aa = lowerStr.indexOf('a',a+1); //a의 중복된 인덱스 뒤에꺼 찾기
  let b = lowerStr.indexOf('b');
  let bb = lowerStr.indexOf('b',b+1); //b의 중복된 인덱스 뒤에꺼 찾기
  let resultA = lowerStr.slice(a, b+1);
  //let resultB = lowerStr.slice(b, a+1); 결과값에서 필요없음
  let resultABBA = lowerStr.slice(bb, aa+1); //abba형태라 앞에 중복 b,a를 지나침
  let resultAAB = lowerStr.slice(aa,b+1); //aab형태라 앞에 중복 a를 지나침


  if(resultA.length === 5 || resultAAB.length === 5 || resultABBA.length === 5) return true;
  return false;
}
//문자열 str 글자 중 a-b or b-a 5글자 문자열이 있는지 확인
//모두 소문자로 만들기 str.toLowerCase()
//문자 a와 b의 특정위치 알기 str.inexOf(a) = a의 인덱스를 찾아줌
//특정위치에서 slice로 자르기
//만약 자른 str이 5글자라면 true

//레퍼런스 코드 (내풀이와 많이 달라서 추가함)
function ABCheck(str) {
  if (str === undefined) {
    return false;
  }
  str = str.toLowerCase();
  for (let i = 4; i < str.length; i++) {
    if (
      (str[i] === 'a' && str[i - 4] === 'b') ||
      (str[i] === 'b' && str[i - 4] === 'a')
    ) {
      return true;
    }
  }
  return false;
}//인덱스 0=a,4=b또는 0=b, 4=a이런식으로 5글자씩
//인덱스 0부터 차례대로 5글자가 일치하는 ab 또는 ba형태가 있다면 true

10.문자열을 입력받아 연속된 한자리 홀수 숫자 사이에 '-'를 추가한 문자열을 리턴해야 합니다.
0은 짝수로 간주합니다.

function insertDash(str) {
  let words = str.split("");
  for(let i=0; i<words.length; i++){
    if(words[i]%2 && words[i+1]%2){
      words.splice(i+1, 0, "-");
      //words[i] = words[i]+'-'; //이 코드도 가능
    }
  }
  str = words.join("");
  return str;
}
//연속된 홀수 자리 사이에 - 추가한 문자열리턴
//str.split("")으로 배열만들기
//for 반복문으로  i%2===1 && (i+1)%2===1 이라면 str[i]=str[i]+"-"
//join("")으로 배열을 문자열로 리턴

//레퍼런스 코드
function insertDash(str) {
  let result = str[0];
  for (let i = 1; i < str.length; i++) {
    if (Number(str[i - 1]) % 2 && Number(str[i]) % 2) {
      result = result + '-';
    }
    result = result + str[i];
  }
  return result;
}//단어의 앞과 뒤과 홀수라면 첫번째 글자 뒤에 '-'를 붙이고 아니면 바로 다음 글자가 온다.
profile
신입 프론트엔드 웹 개발자입니다.

1개의 댓글

comment-user-thumbnail
2023년 1월 24일

이번에도 정말 보기 좋게 정리해주셔서 감사합니다!
저도 자극 많이 받고가요ㅎㅎ

답글 달기