[SEB FE] Section 1 unit3 (3) - 반복문 문제 풀기1

동화·2022년 10월 6일
0

코드스테이츠

목록 보기
4/32

01_findTheBug

문자열을 입력받아 버그('#')의 인덱스를 리턴해야 합니다.
bug# 이 입력되면 3이 리턴되어야함

function findTheBug(word) {
  for (let i = 0; i < word.length; i++){
    if (word[i] === '#'){
    return i
    }
  }
}

레퍼런스에는 for문 밖에 return undefined도 적혀있었는데, 나는 그걸 적지 않았으나 통과했다




02_sum

수를 입력받아 0부터 해당 수까지의 합을 리턴해야 합니다.

function sumTo(num) {
  let sum = 0;
  for (let i = 0; i <= num; i++){
    sum = sum + i
  }
  return sum
}




03_isOdd

수를 입력받아 홀수인지 여부를 리턴해야 합니다. (while 문 사용, 나눗셈/나머지 연산자 사용 금지)
나눗셈없이 홀수 여부를 리턴하는게 어려웠다.
생각하구 고민한 결과.. 0보다 크면 -2씩 빼서 0으로 어지면 짝수! 0보다 작으면 +2씩해서 0이 나오면 짝수! 였음

❌ 실패 코드 ❌

function isOdd(num) {
  if (num >= 0){
    let i = 0;
    while (i < num){
      i = i + 2
      num - 2 === 0
    } return false
  }
  
  if (num < 0){
    let i = 0;
    while (i < num){
      i = i + 2
      num + 2 === 0
    } return false
  }
return true
}

실패한 구조문.. 77과 -17이 false 가 나왔다. 아니 지금 보니 모든 수가 false가 나온모양
내 생각에는 num-2가 0이 되었을 때 탈출해서 false를 출력했음 하는거 였는데..
num - 2 ===0 이게 맞나? 해서 2를 i로 바꿨으나 실패

❌ 실패 코드 2 ❌

function isOdd(num) {
  if (num = 0){return false}
  if (num > 0){
    let i = 0;
    while (i < num){
      i += 2
      num - i === 1
    } return true
  }
  
  else if (num < 0){
    let i = 0;
    while (i < num*-1) {
      i += 2
      num + i === -1
    }  return true
  }
return false
}

계속 틀리고 있음.. 심지어 출력값이 100이랑 -1000이 틀리니까 이거 뭐 뭐때메 틀리는지 알 수도 없고 ㅠ.ㅠ
디버깅해도 이해가 안가고... 이쯤에서 틀린 기록 한번 더 쓴다..

❌ 실패 코드 3 ❌

function isOdd(num) {
  if (num = 0){return false}
  
  num = -num

  let i = 0;
  while (i < num){
    i += 2
    num - i === 1
    return false
  } 
return true
}

길을 바꿔봤는데, num이 양수일때나 음수일 때나 같다고 설정하고 싶었다.. 실패했지만 ㅜㅜ

while 문에 대해서 더 공부하고,

⭕️ 성공 ㅠ_ㅠ

function isOdd(num) {
  if (num < 0){
  num = -num
  }

  let i = 0;
  let result = 0;
  while (i <= num){
    result = i
    i = i + 2
  } 
  if (result !== num){
    return true
  }
return false
}

성공 ㅠㅠ 2씩 계속 더해서 0이 아니고 num 이랑 같아 질 때까지 더하기! 그러면 짝수

레퍼런스 📌

function isOdd(num) {				
  if (num < 0) {				// 일단 num이 음수면 양수 취급	
    num = -num;
  }

  while (num >= 0) { 			// num이 0보다 같거나 큰 경우,
    if (num === 0) {			// num이 0이랑 같다면
      return false;				// false를 출력한다.	
    } else if (num === 1) {		// num 이 1과 같다면
      return true;				// true 를 출력한다.
    }
						// 두 조건을 다 충족하지 않는다면 조건문을 빠져나와서 
    num = num - 2;		// num = num - 2를 반복 실행하다가 0, 1이 되었을 때 
  }						//각각 짝/홀 이므로 false/true 출력
}

레퍼런스는 뺄셈을 이용했다. ㅠㅠ 사람들은 정말 너무 똑똑 하다..




04_factorial

이름에 맞게 자릿수를 다 곱하는 문제 (팩토리얼 구하기)
이거는 2번에서 했던 다 더하는 문제에서 곱하기로 바꾸어서 해결했당

function factorial(num) {
  let fac = 1;
  for (let i = 1; i<=num; i++){
    fac = fac * i
  }
  return fac
}




05_repeatString

문자열과 수를 입력받아 반복된 문자열을 리턴해야 합니다.

let output = repeatString('code', 3);
console.log(output); // --> "codecodecode"

이렇게 된다는 이야기

function repeatString(str, num) {
  let result = '';

  for (let i=1; i<=num; i++){
    result += str
    if (num === 0) {
      result = '';
    }
  }
return result
  }

처음에 약간 헤맸는데 result += str을 이용해서 해결했다.
그리고 let i = 0으로 놨더니 str을 하나 더 출력했음.




06_makeDigits

수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴해야 합니다.

function makeDigits(num) {
  let resultDigits = '';
  for (let i =1 ; i <= num; i++){
   resultDigits += i
  }
  return resultDigits
}

한번에 테스트 통과해서 약간 당황...

function makeDigits(num) {
  let result = '';

  for (let i = 1; i <= num; i++) {
    result = result + String(i);
  }

  return result;
}

레퍼런스 답. 페어분이랑 할때는 이런 방식으로 했었던거 같은데 다시 풀어서 된 걸 이유를 모르겠다리




07_makeDigits2

수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴해야 합니다.

  • 숫자(number string) 사이를 '-'로 구분합니다. ('1-2-3-4-5')
  • 반복문(while)문을 사용해야 합니다.

    let output = makeDigits2(5);
    console.log(output); // --> "1-2-3-4-5"

이런 결과가 나와야 한다. 약간 이때 번뜩 든 생각이 일단 기본값을 1로 해놓고 출력을 -num 으로 하면 되겠다 싶었음

function makeDigits2(num) {
  let resultDigits = '1';
  let i = 2
  while (i<=num){
    resultDigits = resultDigits + `-${i}`
    i++
  }
  return resultDigits
}

08_makeOddDigits

let output = makeOddDigits(3);
console.log(output); // --> "135"

output = makeOddDigits(5);
console.log(output); // --> "13579"

수(num)를 입력받아 1을 포함하여 num개의 홀수로 구성된 문자열을 리턴해야 합니다.

❌ 실패 코드 ❌

function makeOddDigits(num) {
  let oddDigits = '';
  let i = 0;
  while (i<=num){                 
    if (i % 2 === 1){            
    oddDigits = oddDigits + String(i)   
    }
    i++
  }
  return oddDigits
}

처음에는 num 안에 있는 홀수 찾기 식으로 만들어 버림 ㅠ.ㅠ 그게 아니라 홀수 개수를 추출하는건데..

function makeOddDigits(num) {
  // 홀수가 나열된 결과를 담아 낼 문자
  let oddDigits = '';

  // i가 하나씩 올라갈 때마다 홀수 하나씩을 추가할
  // 새로운 변수(j:홀수값) 설정
  // i가 num와 같아질 때 반복문을 종료한다.

  // i가 하나 올라갈 때마다 j가 결과값에 추가
  // i는 2개씩 증가
  let i = 0;
  let j = 1;
  while (i<num){
    oddDigits = oddDigits + j;
    j += 2
    i++
  }
  return oddDigits
}

하나하나 되짚어 가면서 풀었다.
i와 j를 너무 헷갈려해서 ㅠ ㅠ 다음부턴 다른 변수로 해야지 하고 다짐




09_makeMultiplesOfDigit

let output = makeMultiplesOfDigit(7);
console.log(output); // --> "36"

output = makeMultiplesOfDigit(19);
console.log(output); // --> "369121518"

수를 입력받아 1부터 해당 수까지의 수 중에서 3의 배수로만 구성된 문자열을 리턴해야 합니다.
이건 아까 내가 num속에있는 홀수를 뽑아낸 방법처럼 하면 될 거 같다!

function makeMultiplesOfDigit(num) {
  let result = '';
  for (let i = 1; i<=num; i++){
    if (i % 3 === 0){
      result = result + i
    }
  }
  return result
}

어렵지 않게 성공. 근데 i = 0부터로 돌렸더니 0369..이런식으로 출력
생각해보니 0나누기 3도 나머지가 0이라서..인듯 ?




10_makeMultiplesOfDigit2 ★★

let output = makeMultiplesOfDigit2(8, 12);
console.log(output); // --> 3

output = makeMultiplesOfDigit2(12, 8);
console.log(output); // --> 3

  • 두 개의 수를 입력받아 두 수를 포함해 두 수 사이의 수 중 2의 배수의 개수를 리턴해야 합니다.
  • num1이 num2보다 작지 않을 수도 있습니다.
  • 0은 2의 배수가 아니라고 가정합니다.

나를 애먹였던.. 기억에 남은 문제중 하나

function makeMultiplesOfDigit2(num1, num2) {
  let result = 0;
  if (num1 === 0){num1 = 1}
  if (num2 === 0){num2 = 1}
  
  // num1보다 num2가 큰 경우  
  if (num1 < num2){
      for (let i = num1; i<=num2; i++){
        if(i % 2 === 0){
        result = result + 1
        }
      }
  // num1보다 num2가 작은 경우  
  } else if (num1 > num2){
      for (let i = num2; i<=num1; i++){
        if (i % 2 === 0){
        result = result + 1
        } 
      }
  // num1과 num2가 같은 경우    
  } else if (num1 === num2){
      for (let i = num1; i<=num1; i++){
        if (num1 % 2 === 0){
        result = 1
        }
      }
  }
  return result
}

처음에 내가 생각했던 방법이다. 일단 num1과 2에 0이 들어올 경우를 가정해

1과 같다고 하고, 그 뒤로는 크기를 비교해가면서 쭉쭉 만들었는데.. 어쩐지 0일 때 값이 안나온다 ㅜㅜ 해서 봤더니

if (num1 === 0){num1 === 1} 
if (num2 === 0){num2 === 1}

초반에 이렇게 해놨던 거다.. 생각해보니 이상해서 이거 수정하고 제출해서 통과..

근데 레퍼런스 답은 굉장히 간단했다

function makeMultiplesOfDigit2(num1, num2) {
  let count = 0;
  let start = num1;
  let end = num2;

  if (num1 > num2) {
    start = num2;
    end = num1;
  }

  if (start === 0) {
    start = 1;
  }

  for (let i = start; i <= end; i++) {
    if (i % 2 === 0) {
      count += 1;
    }
  }

  return count;
}

시작값과 초기값을 지정해주고, num1 이 num2 보다 큰 경우는 반대로 된다 가정해서
반복문에서 start는 작은값, end는 자동으로 큰 값이 되었다.
훨씬 간단하게 start, end 변수로 계산해주었다.




11_countCharacter

let output = countCharacter('I am a hacker', 'a');
console.log(output); // --> 3

문자열과 문자를 입력받아 문자열에서 문자(letter)가 등장하는 횟수를 리턴해야 합니다.

function countCharacter(str, letter) {
  let result = 0
  for (let i = 0; i <= str.length; i++){
    if (str[i]===letter){
      result++
    } 
  }
return result
}



12_getMaxNumberFromString

let output = getMaxNumberFromString('53862');
console.log(output); // --> '8'

output = getMaxNumberFromString('4321');
console.log(output); // --> '4'

숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자를 리턴해야 합니다.

+str.split 이용해서 구해보기

❌ 실패 1 ❌ 원래 답 (str.split 이용x) 작성해보기

function getMaxNumberFromString(str) {
  //string 타입 리턴
  //문자열str[i] 이용, 가장 큰 수 찾아 리턴 (숫자 비교)
  // 첫번째 문자열이 두번째 문자열보다 작으면 
  // - 두 번째 문자열과 세 번째 문자열 비교해서 작으면
  // - 세 번째 문자열과 네 번째 문자열 비교해서 크면
  // -       ``        다섯 번째 문자열 ~ 끝까지 비교
  // 1 < 2 - 2 < 3 - 3 < 4 - 3 > 5 - 3 < 6 - 6 < 7
  // 문자열n과 n다음의 문자열n번째(j)까지 비교
  let i = 0;
  let j = i + 1
  let largest = '';
  for (let i = 0; i<=str.length; i++){
      if (str[i] < str[j]){
        return str[j]
      } else if (str[i] > str[j]){
        return str[i]
      }
  } 
}

1234를 입력하면 2가 출력.. 2개 이상을 안 간다는 거고 반복문 실해잉 안된다는건데
반복문에 대한 이해가 부족한 거 같다 ㅠ.ㅠ

❌ 실패 2 ❌

function getMaxNumberFromString(str) {
  if (str === ''){return '0'}
 
  let i = 0;
  let j = i + 1
  let largest = '';
  
  for (let i = 0; i<str.length; i++){
      if (str[i] < str[j]){
        largest= str[j]
      } else if (str[i] > str[j]){
        largest = str[i]
      }
  } 
  return largest
}

수정한 코드. 근데 여전히 하나를 출력 못 한다. ㅠㅠ 12375를 출력했는데 왜.. 5가 출력 되는지?
근데 쓰면서 생각했다. 내가 적은 str[i],,가 과연 비교를 할 수 있나? 쟤네 다 숫자여야 비교가 되는데..!
그것도 수정하고 이것저것 수정해서 겨우 찾은 답..

function getMaxNumberFromString(str) {
    let max = 0;
    for (let i = 0; i<str.length; i++){
      if (max < parseInt(str[i])){
      max = parseInt(str[i])
      }
    }
    return String(max)
}

이 비교하는 부분에 대한 이해를 확실히 머리에 넣고 가야할 거 같음.. ㅠㅠ

+str.split 이용해서 풀어보기

function getMaxNumberFromString(str) {
  if (str === ''){return '0'}
  var result = str.split('').map(Number)
  return `${Math.max.apply(null,result)}`
}

어찌 저찌 해서 됐다.. 이게 맞는지는 모르지만 결과는 나옴!
첫줄은 빈문자열일 때 0 출력하는 거 넣어주고,
str.split을 이용해서 분할하면 문자열로 나오는데, 이걸 숫자로 바꿔주는게 .map(Number)
그리고 그 숫자배열 중에 최댓값 출력하는 함수 Math.max 이용했다.
스트링으로 출력해야 되기 때문에 ${} 사용..


🍎 apply에 대한 정보🍏




13_replaceAll

문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴해야 합니다.

function replaceAll(str, from, to) {
  // 문자열을 탐색해 from 값을 찾는다
  // from 과 같은 문자는  to를 넣는다 (result += to)
  // from과 다른 문자는 그대로 출력   (result += str[i])
  let result = '';

  for (let i = 0; i<str.length; i++){
    if(str[i] !== from){
      result = result + str[i]
    } else if (str[i] === from){
      result = result + to
    }
  }
  return result
}

0개의 댓글