문자열, 조건문

#나는 왜 1차원적인 코드밖에 못짜는거지😭

1. 문자열

  • str[index] : 해당 인덱스의 character를 불러올 수 있다. *단, read-only!!!!
  • str.length
  • 문자열끼리 + 연산자를 사용할 수 있다.
  • 다른 타입과 + 연산하면 string으로 바뀐다. (toString)
    c.f. str.concat(a, b) : 여러개 붙이기 / 잘 사용하지 않는 것 같다.

1-1. string method

1. str.indexValue(searchValue)

‘Blue Whale’.indexOf(‘Blue’); // 0
‘Blue Whale’.indexOf(‘B’); // 0
‘Blue Whale’.indexOf(‘blue’); // -1 * 중복된다면 앞의 인덱스만
‘canal’.lastIndexOf(‘a’); // 3 *가장 뒤의 인덱스를 불러줌

c.f. str.includes(searchValue); : 해당값 존재 여부만 확인

2. str.split(seperator)

: seperator를 기준으로 분할, array로 변환

csv.split('\n') 엑셀 크롤링에서, 줄바꿈 기준으로 나누어줌!

c.f. 다시 문자열로 바꾸려면, str.split("").join("")

❗️내가 자주하는 실수: (그래야할 때)쿼테이션 안에 제발... 공백 넣자.......... 😩

3. str.substring(start, stop)

: 구간 문자열을 가져온다. str.slice()와 비슷!

  • slice와 substring을 비교해보자
  1. 공통점
    • start, stop 동일하면 "" return
    • 인자가 1개 뿐이면 앞 인덱스 n까지 빼고 뒷부분 추출
      let sentence = 'ohmygodness';
      sentence.slice(3); // ygodness
    • start나 stop 값이 문자열 길이보다 길면 str.length로 대체
  2. str.substring()
    • start > stop 이면 자동으로 교체
    • 음수나 NaN 인덱스가 들어오면 0으로 대체
  3. str.slice()
    • start > stop 이면 "" return
    • start가 음수이면 뒤부터 시작
    • stop이 음수이면 str.length로 대체

4. str.toLowerCase(), str.toUpperCase()

c.f. immutable method (한번 거쳐가도 기존 할당값은 변하지 않음)




조건문 문제를 풀어보자

Q3. 수를 입력받아 10과 같은지 여부를 리턴하라.

function equalsTen(num){
  return Boolean(num === 10);
}

Check 👉🏾 Method Boolean. falsy 판별에도 쓸 수 있다!

Q7. 수를 입력받아 3, 5로 각각 나눈 뒤 나머지 값에 따라 알맞은 메세지를 리턴하라.

  • 3으로 나누어 떨어지면, 'Fizz' 리턴
  • 5로 나누어 떨어지면, 'Buzz' 리턴
  • 3과 5로 모두 나누어 떨어지면, 'FizzBuzz' 리턴
  • 3이나 5로 나누어 떨어지지 않으면, 'No FizzBuzz' 리턴
  • 모두 string type으로 리턴할 것

👩🏽 나의 코드 나는 이렇게 if안에 if 넣는 방식을 자꾸 생각한다

function fizzBuzz(num){
  if(num % 3 === 0){       // 3으로 나누어 떨어질 때
    if(num % 5 === 0){     // 5로도 나누어 떨어진다면
      return 'FizzBuzz';    // 모두 떨어지는 'FizzBuzz' 리턴
    } else{
      return 'Fizz';        // 5로는 안되면 'Fizz' 리턴
    } else{ // 3으로는 안나누어 떨어지고
      if(num % 5 === 0){   // 5로는 나누어 떨어진다면
      return 'Buzz';        // 'Buzz'리턴
    } else{                // 5로도 안되면 모두 안되는 'No FizzBuzz' 리턴
      return 'No FizzBuzz';
    }
  }
}    

👩‍🏫 Reference

function fizzBuzz(num){
  if(num % 3 === 0 && num % 5 === 0){ // num % 15 === 0 으로도 표기하더라!
    return 'FizzBuzz';
  } else if(num % 3 === 0){
    return 'Fizz';
  } else if(num % 5 === 0){
    return 'Buzz';
  } else{
    return 'No FizzBuzz';
  }
}

Check 👉🏾 if안에 if넣는 가독성 떨어지는 코드를 짜지 말자!
Check 👉🏾 조건문은 폭포같다! 내려갈수록 걸러지니까 가장 작은 조건부터 나열하도록 생각하자.

Q9. 특정 달(month)을 입력받아 각 달에 며칠이 있는지 리턴하라.

function daysInMonth(month){
  if(month === 2){
    return 28;
  } else if(month === 4 || month === 6 || month === 9 || month === 11){
    return 30;
  } else{
    return 31;
  }
}

Check 👉🏾 무조건 꼬아서 규칙 찾는게 빠른건 아니다. 조건이 3-4개 정도로 정리된다면 그냥 나누자!

[주말에 다시]Q13. 점수를 입력받아 점수에 해당하는 등급을 리턴하라.

  • string type으로 리턴
  • 각 등급의 최저 점수
    • 90 이상 : A
    • 80 이상 : B
    • 70 이상 : C
    • 60 이상 : D
    • 60 미만 : F
  • 점수가 100 초과 0 미만이면 'INVALID SCORE' 리턴
  • 각 등급 최고 점수보다 7점 이하인 경우 등급과 함께 '-' 리턴 (단, 93점은 A)
  • 각 등급 최저 점수보다 8점 이상인 경우 등급과 함께 '+' 리턴
  • F+, F- 는 존재하지 않음

👩🏽 나의 코드

function convertScoreToGradeWithPlusAndMinus(score){

  let grade; // 등급 변수 선언
  let sign; // 쁠마 변수 선언
  let unitDigit = score % 10; // 1의 자리수 선언
  
  if(score > 100 || score <0){  // 에러 메세지
    return 'InVALID SCORE';
  }
  
  // 점수별 A-F를 매긴다
  if(score >= 90){
    grade = 'A';
  } else if(score >= 80){
    grade = 'B';
  } else if(score >= 70){
    grade = 'C';
  } else if(score >= 60){
    grade = 'D';
  } else{
    grade = 'F';
  }
  
  if(socre === 100){ // 특수경우 1. 뒷자리 0이지만 100점은 A'+'
  	sign = '+';
  } else if(score < 60){ // 특수경우 2. 뒷자리 0이지만 제로
    sign = '';
  } else{ //이외 규칙에 맞게 쁠마제로 부여
      if(unitDigit >= 0 && unitDigit <= 3){
        sign = '-';
      } else if(unitDigit >= 8 && unitDigit <= 9){
        sign = '+';
      } else{
        sign = '';
      }
  }

  return grade + sign;
}

👩‍🏫 Reference

function plusOrMinus(score) {
  const extra = score % 10;
  if (extra <= 2) {
    return '-';
  } else if (extra >= 8) {
    return '+';
  } else {
    return '';
  }
}

function convertScoreToGradeWithPlusAndMinus(score) {
  let grade;
  if (score > 100 || score < 0) {
    return 'INVALID SCORE';
  }
  if (score === 100) {
    return 'A+';
  }
  if (score >= 90) {
    grade = 'A';
  } else if (score >= 80) {
    grade = 'B';
  } else if (score >= 70) {
    grade = 'C';
  } else if (score >= 60) {
    grade = 'D';
  } else if (score >= 0) {
    grade = 'F';
  }

  if (grade !== 'F') {
    grade = grade + plusOrMinus(score);
  }
  return grade;
}

Check 👉🏾 고정된 숫자가 어떤 값을 대변한다면 그 값을 쓰자!! ex. score > 60 대신, grade !== 'F'
Check 👉🏾 F에 쁠마 안붙이는걸 저렇게 보여줄 수 있구나....🤭


[주말에 다시]Q14. 삼각형의 세 변을 입력받아 직각삼각형(pythagorean)인지 여부를 리턴하라.

  • 제곱을 구하는 세가지 방법을 모두 사용해라.
  • arr.sort 사용 금지
  • 제곱을 구할 때 입력변수 그대로 사용할 것

👩🏽 나의 코드

function isPythagorean(side1, side2, side3) {
  if(Math.max(side1, side2, side3) === side1){
    return (side1 ** 2 === side2 ** 2 + side3 ** 2)
  }
  else if(Math.max(side1, side2, side3) === side2){
    return (Math.pow(side2,2) === Math.pow(side1,2) + Math.pow(side3,2))
  }
  else{
    return (side3 * side3 === side2 * side2 + side1 * side1)
  }

👩‍🏫 Reference

function isPythagorean(side1, side2, side3) {
  const pow1 = side1 * side1;
  const pow2 = side2 ** 2;
  const pow3 = Math.pow(side3, 2);

  if (pow1 === pow2 + pow3 || pow2 === pow1 + pow3 || pow3 === pow1 + pow2) {
    return true;
  }

  return false;
}

Check 👉🏾 여러 경우 중 하나라도 되는 경우에 대해 Boolean 출력일 때는 논리 연산자를 좀 활용하자...
Check 👉🏾 뭔가 반복되는 것 같으면 선언해서 간단히 쓸 생각을 하자

[주말에 다시]Q16. 시, 분, 초를 입력받아 1초를 더한 결과값을 특정 형태의 메세지로 리턴하라.

  • 0 <= hour && hour <= 24
  • 리턴 값 : 1초 뒤에 {hour}시 {minute}분 {second}초 입니다

👩🏽 나의 코드

function addOneSecond(hour, minute, second) {

if(second === 59){   // 59초일 때
  second = 0;        // 1초가 더해지니 초 단위는 0으로 바꾸고
  if(minute === 59){ // 게다가 59분이기까지 하면
    minute = 0;      // 밀려서 1분이 더해지니 분 단위도 0으로 바꾸고
    if(hour === 23){ // 게~다가 23시라면
      hour = 0;      // 또 밀려서 1시간 더해지니 시간단위는 0으로 바뀐다 (여기까지 23시 59분 59초 특수 상황에 대해
    } else{
      hour += 1;     // 23시가 아니라면 원래 시간 + 1
    }
  } else{
    minute += 1;     // 59분이 아니라면 원래 분 + 1
  }
} else{
  second += 1;       // 59초가 아니라면 원래 초 + 1
}
 
return '1초 뒤에 ' + hour + '시 ' + minute + '분 ' + second + '초 입니다'
} 

👩‍🏫 Reference

function addOneSecond(hour, minute, second) {
  if (second === 59) {
    minute += 1;
    second = 0;
  } else {
    second += 1;
  }

  if (minute === 60) {
    hour += 1;
    minute = 0;
  }

  if (hour === 24) {
    hour = 0;
  }

  return '1초 뒤에 ' + hour + '시 ' + minute + '분 ' + second + '초 입니다';
}

Check 👉🏾 59초->60초로 가는 순간이 아니면 min, hr는 특수 상황을 겪지 않는다. 그러니 second가 59일 때를 기준점으로 잡자!
Check 👉🏾 시, 분에 대한 if문은 초 if문의 첫번째 조건을 건너왔을 때만 실행된다. (아니라면 60, 24가 될 일이 없다)
Check 👉🏾 분과 시가 각각 1씩 넘겨받아 60, 24가 되는 특수 상황에 대한 조건문만 추가하면 된다. (특수 상황 아니면 그냥 넘어가도록)

좋은 웹페이지 즐겨찾기