알고리즘 베이직

FeelSoo·2022년 4월 13일
0

CodeStates

목록 보기
13/43

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


입출력 예시

let output = computeWhenDouble(7);
console.log(output); // --> 11

output = computeWhenDouble(10);
console.log(output); // --> 8

정답

function computeWhenDouble(interestRate) {
let rate = 1 + interestRate/100 // 이율
let M = 1						// 돈
let year = 0					// 걸리는 햇수
while( M < 2){					// 돈이 2배 될 때까지
  M = M*rate					// 이율을 곱한 복리를 계산
  year++						// 연도를 1씩 증가시킨다
}
return year
}



< 4. 문자열을 입력받아 문자열을 구성하는 각 단어의 첫 글자로 이루어진 문자열을 리턴해야 합니다 >


입출력 예시

let output = firstCharacter('hello world');
console.log(output); // --> "hw"

output = firstCharacter(
  'The community at Code States might be the biggest asset'
);
console.log(output); // --> "TcaCSmbtba"

정답

function firstCharacter(str) {
  if(str==''){			// 받은게 빈문자열이면 빈문자열 리턴
    return ''
  }
  let A=""				// 빈문자열 A 선언
  let B= str.split(' ')	// 받은 문자열을 띄어쓰기 기준으로 나눈다

  for(let i=0; i<B.length; i++){	// 문자절의 갯수만큼 루프를 돌린다
    A = A + B[i][0]					// 빈문자열에 각 문자절의 첫번째 글자를 삽입
  }
  return A
}



<문자열을 입력받아 순서가 뒤집힌 문자열을 리턴해야 합니다>


입출력 예시

let output = firstReverse('codestates');
console.log(output); // "setatsedoc"

output = firstReverse('I love codestates');
console.log(output); // "setatsedoc evol I"

정답

function firstReverse(str) {
return str.split('').reverse().join('')
}

/// join은 배열의 모든 요소를 하나로 합친다. 인자가 공백이면 단어사이에 ,를 두고 ''일경우 사이에 아무문자 없이 연결됨. 
/// split은 ''일경우 한글자를 기준으로 나누고, ' '일 경우 띄어쓰기를 기준으로 나눈다



<6. 문자열을 입력받아 문자열을 구성하는 각 단어의 첫 글자가 대문자인 문자열을 리턴해야 합니다 >


입출력 예시

let output1 = letterCapitalize('hello world');
console.log(output1); // "Hello World"
let output2 = letterCapitalize('javascript  is sexy ');
console.log(output2); // "Javascript  Is Sexy "

정답

function letterCapitalize(str) {
  let words=str.split(' ')				// 받은 문자열을 띄어쓰기 기준으로 나눔
  for(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
}



< 7. 2차원 배열(배열을 요소로 갖는 배열)을 입력받아 각 배열을 이용해 만든 객체를 리턴해야 합니다 >


입출력 예시

const arr = [
  ['make', 'Ford'],
  ['model', 'Mustang'],
  ['year', '1964'],
  ['make', 'Bill'],
];

let output = convertListToObject(arr);

console.log(output) // -->
{
  make : 'Ford'
  model : 'Mustang',
  year : '1964'
}

정답

function convertListToObject(arr) {
let result = {}			// 빈 객체 선언

for(let i=0; i<arr.length; i++){	// 배열 길이만큼 순회
  if(arr[i].length>0 && result[[arr[i][0]]] === undefined ){ // 배열의 인자가 비지 않았고 순회하는 인자의 속성값이 result에 정의되지 않았다면
    result[arr[i][0]] = arr[i][1] // 배열을 객체로 만든다 
  }
}return result
}



< 8. 문자열을 입력받아 해당 문자열에 등장하는 두 칸의 공백을 모두 한 칸의 공백으로 바꾼 문자열을 리턴해야 합니다 >


입출력 예시

let output = convertDoubleSpaceToSingle('string  with  double  spaces');
console.log(output); // --> "string with double spaces"

정답

function convertDoubleSpaceToSingle(str) {
let result = ""         // 빈 문자열 result 선언
let before = ""         // 빈 문자열 before 선언

for(let i=0; i<str.length; i++){    // str의 길이만큼 for 루프 실행                               case 1 before가 문자, 현재도 문자
  if(before !== ' ' || str[i] !== ' '){   // before가 공백이 아니었거나, 현재가 공백이 아닐경우 --- case 2 before가 공백이거나 현재가 문자일 경우 
    result = result + str[i]              // result에 현재 문자를 추가                             case 3 before가 문자이거나 현재가 공백일 경우에 실행 가능
  }                                                                                                 
  before = str[i]                         // before는 현재 문자가 된다 
}
return result                             // result를 반환
}



< 9. 문자열을 입력받아 문자열 내에 아래 중 하나가 존재하는지 여부를 리턴해야 합니다 >

'a'로 시작해서 'b'로 끝나는 길이 5의 문자열
'b'로 시작해서 'a'로 끝나는 길이 5의 문자열

입출력 예시

let output = ABCheck('lane Borrowed');
console.log(output); // --> true

정답

function ABCheck(str) {
  if(str === ''){
    return false		// 빈문자열 받았으면 false 리턴
  }

  str = str.toLowerCase()	// 문자열을 소문자로 변환

  for(let i=4; i<str.length; i++){	// 5번째 문자부터 문자열 끝까지 순회
    if((str[i] === 'a' && str[i-4] === 'b')|| { i번째 문자가 a이고 i와 5만큼 차이나는 문자가 b이거나
      (str[i] === 'b' && str[i-4] === 'a')) {  i번째 문자가 b이고 i와 5만큼 차이나는 문자가 a 이면
        return true // 트루 리턴
      }
    
  }
  return false
}




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


입출력 예시

let output = insertDash('454793');
console.log(output); // --> 4547-9-3

정답

function insertDash(str) {
let result = str[0]			// result는 문자열의 첫번째
for(let i=1; i<str.length; i++){ // 첫번째 문자부터 문자열 끝까지 순회
  if(Number(str[i-1]) %2 ===1 && Number(str[i]) %2 ===1){ // 문자열을 숫자형으로 바꾼 i-1번째 숫자를 2로 나눴을 때 나머지가 1이고 그 뒤의 숫자도 나머지가 잇다면
    result = result + '-' // - 기호를 붙여준다
  }
  result = result + str[i] // 차례로 숫자들을 검사한 후 이어붙인다
}
return result
}



< 11. 문자열을 요소로 갖는 배열을 입력받아 가장 짧은 문자열과 가장 긴 문자열을 제거한 배열을 리턴해야 합니다 >


입출력 예시

let output = removeExtremes(['a', 'b', 'c', 'def']);
console.log(output); // --> ['a', 'b']

output = removeExtremes(['where', 'is', 'the', 'longest', 'word']);
console.log(output); // --> ['where', 'the', 'word',]

정답

function removeExtremes(arr) {
 let short = 20 	// 최대 길이는 20
 let long = 0
 let shortidx = 0
 let longidx = 0

 for(let i=0; i<arr.length; i++){  // 배열을 순회
 if(arr[i].length >= long) {	// long보다 이상인 인자의 길이는
   long = arr[i].length			// 곧 long이 된다
   longidx = i					// 그 때의 인덱스 번호를 longidx라 한다
  }								// 상향식 접근

  if(arr[i].length <= short) { // short보다 이하인 인자의 길이는
    short = arr[i].length	// 곧 short가 된다
    shortidx = i		 // 그 때의 인덱스 번호를 shortidx라 한다
  }						// 하향식 접근 

    }
  let result = []
  for(let i=0; i<arr.length; i++){	// 배열을 순회
    if(i !== longidx && i !==shortidx){ // 인덱스 번호가 long도 아니고 short도 아니면
      result.push(arr[i]) // 그 인자를 빈배열 result에 푸쉬
  }
 }
  return result
}



< 12. 2차원 배열(배열을 요소로 갖는 배열)을 입력받아 'B'의 위치 정보를 요소로 갖는 배열을 리턴해야 합니다 >


입출력 예시

let output = findBugInApples([['A'], ['B']]);
console.log(output); //[1, 0]

output = findBugInApples([
  ['A', 'A', 'A', 'A', 'A'],
  ['A', 'B', 'A', 'A', 'A'],
  ['A', 'A', 'A', 'A', 'A'],
  ['A', 'A', 'A', 'A', 'A'],
  ['A', 'A', 'A', 'A', 'A'],
]);
console.log(output); //[1, 1]

정답

function findBugInApples(arr) {
 for (let i = 0; i < arr.length; i += 1) {   /// arr의 길이만큼 for 루프를 실행 arr.length = 5
    for (let j = 0; j < arr[i].length; j += 1) {    /// arr[i]의 길이만큼 루프를 실행. arr[0].length = 5
      if (arr[i][j] === 'B') {                    ///arr[i]번째 배열의 [j]번째 인자를 돌며 'B'를 탐색한다
        return [i, j];
      }
    }
  }
}



< 13. 문자열을 요소로 갖는 배열을 입력받아 문자열을 세로로 읽었을 때의 문자열을 리턴해야 합니다 >


입출력 예시

let input = [
  //
  'hello',
  'wolrd',
];
let output = readVertically(input);
console.log(output); // --> 'hweolllrod'

input = [
  //
  'hi',
  'wolrd',
];
output = readVertically(input);
console.log(output); // --> 'hwiolrd'

정답

function readVertically(arr) {
  let temp = [];                              // temp = 빈배열
  for (let i = 0; i < arr.length; i++) {      // i가 arr 갯수보다 작으면 i ++, arr.length = 2
    for (let j = 0; j < arr[i].length; j++) {    // j가 arr[i].length 즉, arr의 i번째 인자의 글자수보다 작으면 j ++
      if (temp.length === j) {                // temp.length 즉, temp 배열의 갯수가 j와 같으면
        temp.push(arr[i][j]);                    // temp에 arr[i][j] 즉, arr의 i번째 인자의 j번째 글자를 push한다
      } else {                                
        temp[j] = temp[j] + arr[i][j];           // temp[j] 즉, temp의 j번째 글자에 arr[i][j] 즉, arr의 i번째 인자의 j번째 글자를 추가한다
      }
    }                                           //for(let i=0)일 때 for(let j)는 5번의 루프를 반복한다. 즉 temp에는 [hello]가 담긴다
  }                                             // for(let i=1)일 때 for (let j)는 다시 5번의 루프를 반복하지만 else의 형식에 담겨 hello의 각 단어 사이에 추가된다

  let result = '';                            // 빈 문자열 result를 선언
  for (let i = 0; i < temp.length; i++) {     // temp.length, temp 배열의 갯수만큼 for 루프를 실행
    result = result + temp[i];                // result에 temp[i]를 추가하여 누적
  }

  return result;
}



< 14. 수를 요소로 갖는 배열을 입력받아 각 요소들이 그 이전의 요소들의 합보다 큰지 여부를 리턴해야 합니다 >


입출력 예시

let output = superIncreasing([1, 3, 6, 13, 54]);
console.log(output); // --> true

output = superIncreasing([1, 3, 5, 9]);
console.log(output); // --> false

정답

function superIncreasing(arr) {
  // TODO: 여기에 코드를 작성합니다.
let sum=arr[0]		
for(let i=1; i<arr.length; i++){
  if(arr[i] <= sum){		// 배열을 순회하는데 인자가 sum 이하라면
    return false			// false 리턴
  }
  sum = sum + arr[i]		// sum에 현재 인자를 더하여 누적시킨다
}
return true					// 아니면 끝까지 돌고 true 리턴
}



profile
세상은 넓고 배울건 많다

0개의 댓글