[SEB FE] Section 1 unit3 (2) - 문자열 문제 풀기

동화·2022년 10월 6일
1

코드스테이츠

목록 보기
3/32

findShortestOfThreeWords

랜덤으로 문자열 3개를 입력 받아, 제일 짧은 문자열을 출력하는 문제

❌ 실패 리스트 ❌

function findShortestOfThreeWords(word1, word2, word3) {
  if (word1.length < word2.length)
      {if (word1.length < word3.length){
      return word1
    }} else if (word2.length < word1.length){
      if (word2.length < word3.length){
        return word2
    }} else if (word3.length < word1.length){
      if (word3.length < word2.length){
        return word3
      }
    }
  }

1트. 일단 같은 거 생각 안 하고 단순 길이 비교로만 짜봤는데,
이렇게 짜고 실행해보니 (같은 거 제외하고) word3이 제일 짧은 경우가 출력이 되지 않았음.
어차피 같은 것도 생각해 봐야 하니 일단 뒤엎고 다시 생각해 보기로.

function findShortestOfThreeWords(word1, word2, word3) {
  if (word1.length <= word2.length){
    shortest = word1
    if (shortest <= word3.length){
      shortest = word1
    } 
  }  

  if (word2.length < word1.length){
    shortest = word2
    if (shortest <= word3.length){
      shortest = word2
    } 
  }  

  if (word3.length < word1.length){
    shortest = word3
    if (shortest < word2.length){
      shortest = word3
    } 
  }  

    return shortest
  }

2트. 일단 같은 문자열이면 앞에걸 출력한댔으니 등호는 작은 게 왼쪽에 있는 (word1 과 word2&3의 비교) 애들만 넣고,
shortest 변수를 새로 만들어서 값을 할당시켜서 진행했는데도 ㅠ.ㅠ 딱 하나가 안됐다
software, is, fun 에서 계속 해서 fun만 출력되는 것...

function findShortestOfThreeWords(word1, word2, word3) {
  if (word1.length <= word2.length){
    shortest = word1
    if (shortest <= word3.length){
      shortest = word1
    } 
  }  

  else if (word2.length < word1.length){
    shortest = word2
    if (shortest <= word3.length){
      shortest = word2
    } 
  }  

  else if (word3.length < word1.length){
    shortest = word3
    if (shortest < word2.length){
      shortest = word3
    } 
  }  

    return shortest
  }

3트. 조건문을 조건문 속에 넣고 else if로 바꿨는뎅.. 이제는

차례대로 'must', 'choose', 'me'을(를) 입력받은 경우, 'me'을(를) 리턴해야 합니다
차례대로 'happy', 'good', 'wow'을(를) 입력받은 경우, 'wow'을(를) 리턴해야 합니다

이 두 개를 각각 must, good으로 리턴.

function findShortestOfThreeWords(word1, word2, word3) {
  let shortest = word1
  if (word1.length > word2.length){
    shortest = word2 
    if (word2.length >= word3.length){
      shortest = word3
    } 
  } 
    return shortest
  }

4트. 생각해보니 word1 을 일단 기본값으로 지정해도 될 거 같아서 급 짧아진 코드
차례대로 'must', 'choose', 'me'을(를) 입력받은 경우, 'me'을(를) 리턴해야 합니다
하지만 여전히 여기서 must를 출력한다... ㅠ_ㅠ

function findShortestOfThreeWords(word1, word2, word3) {
  let shortest = word1
  if (word1.length > word2.length){
    shortest = word2 
    if (word2.length >= word3.length){
      shortest = word3
    } 
  } else if (word1.length > word3.length){
    shortest = word3
  }
    return shortest
  }

5트.. 드뎌 성공 .. 이무슨 실패의 연속기록인가 ㅠ_ㅠ.....
암튼 바보같이 word1이랑 3을 비교를 안해 넣었다는 거다.. 발견했으니까 됐지
레퍼런스도 똑같이 나왔다 그래도 스스로 깨우친거에 큰 큰 점수!




isOddLength

문자열을 입력받아 그 길이가 홀수인지 여부를 리턴해야 합니다.

function isOddLength(word) {
  if (word.length % 2 === 1){
    return true
  } 
    return false
}

어렵지 않게 해결




takeLetters

수(num)와 문자열을 입력받아 차례대로 num개의 문자로 구성된 문자열을 리턴해야 합니다.

function takeLetters(num, str) {
  return str.substr(0,num)
}

내가 쓴 코드. substr 이용했다 (시작지점, 길이)

function takeLetters(num, str) {
  if (num >= str.length || str === '') {
    return str;
  }

  return str.slice(0, num);
}

레퍼런스. 일단 str 값이 없거나 num보다 크면 str을 출력하도록 설정하고, slice를 이용




compareNumberStrings

두 개의 숫자 문자열을 입력받아 더 큰 수를 나타내는 문자열을 구하고, 해당 문자열이 나타내는 수에 5를 더한 수를 나타내는 숫자 문자열을 리턴해야 합니다.

❌ 페어분이랑 문제풀면서 내가 썼던 코드 (실패)

function compareNumberStrings(numStr1, numStr2) {
    if (Number('numStr1') < Number('numStr2')){
    return 'numStr2.length + 5'
  } else {
    return 'numStr1.length + 5'
  }
}

Number()를 이용해서 숫자로 바꾼다음에 크기 비교를 했는데 싹다 실패
결과 값이 그냥 numStr2.length + 5 이런 식으로 출력이 되었다.. 계산을 먼저하고 스트링 타입이 될 줄 알았는데 아니었음
근데 이거 문제를 다시읽어보니.. length를 대체 왜 가져온거지 갑자기? ㅋㅋㅋㅋ
완전 뻘짓했던 코드는 안 가지고 오는데 이건 그래도 가지고 온 이유가,
변수였던 numStr1,2를 Number()안에 넣으면서 작은 따옴표를 적은 것, 그리고
' ' 말고 String() 을 이용해서 숫자를 다시 문자열로 바꾸는 작업을 할 것.... 해서 가지고 와봤다

function compareNumberStrings(numStr1, numStr2) {
    if (Number(numStr1) < Number(numStr2)){
    return String(Number(numStr2) + 5)
  } else {
    return String(Number(numStr1) + 5)
    }
}

이렇게 해서 성공했는데 상당히 난잡한 모습..
사실 적다가 아 변수를 새로 할당하면 되겠다 했는데 일단 하던것부터 끝내고 새로 해봄

function compareNumberStrings(numStr1, numStr2) {
  let num1 = Number(numStr1)
  let num2 = Number(numStr2)
  if (num1 >= num2) {
    return String(num1+5)
  } else {
    return String(num2+5)
  }
}

그래서 나온 결과! 레퍼런스도 이와 같은데 Number() 말고 parseInt() 이용




makeLastSeenMsg

사용자의 이름과 미접속 시간(분)을 입력받아 조건별로 다른 메세지를 리턴해야 합니다.

  • string 타입을 리턴해야 합니다.
  • 미접속 시간이 1시간 보다 적을 경우, 분 단위로 표기합니다.
  • 미접속 시간이 1시간 보다 크고 24시간 보다 적을 경우, 시간 단위로 내림처리하여 표기합니다.
  • 미접속 시간이 24시간 보다 클 경우, 일 단위로 내림처리하여 표기합니다.
function makeLastSeenMsg(name, period) {
  let hour = parseInt(period / 60) 
  let day = parseInt(hour / 24)
  if (period<60){
    return `${name}: ${period}분 전에 접속함`
  } else if (period>60 && period<1440) {
    return `${name}: ${hour}시간 전에 접속함`
  } else if (period>1440) {
    return `${name}: ${day}일 전에 접속함`
  }
}

내가 썼던 답.. 뭐 거의 노가다인가..? parseInt 는 정수처리 해줌.

function makeLastSeenMsg(name, period) {
  const day = 60 * 24;
  const hour = 60;
  if (period >= day) {
    return `${name}: ${Math.floor(period / day)}일 전에 접속함`;
  } else if (period >= hour) {
    return `${name}: ${Math.floor(period / hour)}시간 전에 접속함`;
  } else {
    return `${name}: ${period}분 전에 접속함`;
  }
}

레퍼런스 답. 나는 어차피 내림하는게 소수점 떼어버리는(정수처리) 일이라고 생각해서 시작부터 떼어버렸는데,
여기선 Math.floor() 를 이용해서 소수점 버림 연산을 이용함. 나는 math 이거 적응이 잘 안돼서.. 잘 이용해버릇해야지

Math.floor() : 소수점 이하를 버림한다.
Math.ceil() : 소수점 이하를 올림한다.
Math.round() : 소수점 이하를 반올림한다.








진짜로 진짜로 너무 힘들었다
근데 반복문까지 끝내고 나서 회고하는 거라 그런지
그나마 좀 낫다..^^...........

HTML/CSS 부터 할 줄 알았지..
반복문이 진짜 헬of헬이었음 그거 챕터 하나였는데 끝까지 결국 못풀고..
이거도 페어분이랑도 계속 너무 힘들다.. 고생하셨다.. 하면서 7시 넘어서까지 계속 코플릿 풀었다 ㅠ_ㅠ

0개의 댓글