부트캠프/TIL

코드스테이츠 프론트엔드 부트캠프 43기 Day 3 - Date 객체, for ... of, 최댓값 찾기 등

하이고니 2022. 12. 20. 11:00

- 단축키

 

한 번 쓴 줄을 그대로 밑에 복사해서 쓰고 싶을 때

option + shift + 아래 방향키

 

이미 작성한 줄을 이동시키고 싶을 때

option + 아래 방향키

 

한 번에 주석으로 만들어버리기 -> command + K + C

주석 풀기 -> command + K + U

 

if 문 하나를 빠져나왔단 건 이미 그 위에 것에 해당되지 않는다는 뜻!

 

- if 조건문

 

findShortestOfThreeWords

 

문제

 

차례대로 문자열 3개를 입력받아, 가장 짧은 문자열을 리턴해야 합니다.

 

입력

 

인자 1 : word1

  • string 타입의 문자열
  • word1.length는 10 이하

 

인자 2 : word2

  • string 타입의 문자열
  • word2.length는 10 이하

 

인자 3 : word3

  • string 타입의 문자열
  • word3.length는 10 이하

 

출력

  • string 타입을 리턴해야 합니다.

 

주의 사항

  • 동일한 길이의 문자열 중에서는 처음 입력받은 문자열을 리턴해야 합니다.

 

입출력 예시

 

let output = findShortestOfThreeWords('a', 'two', 'three');
console.log(output); // --> 'a'

output = findShortestOfThreeWords('c', 'b', 'a');
console.log(output); // --> 'c'

 

작성한 코드 1

 

let one = word1.length;
  let two = word2.length;
  let three = word3.length;
  let minWord = Math.min(word1.length, word2.length, word3.length);

  if (minWord === one) {
    return word1;
  } else if (minWord === two) {
    if (two === one) {
      return word1;
    } else {
      return word2;
    }
  } else if (minWord === three) {
    if (three === one) {
      return word1;
    } else if (three === two) {
      return word2;
    } else {
      return word3;
    }
  }
}

 

내가 쓴 코드에서는 첫 번째 if 문을 빠져나온 후에

두 번째 if 문에서 다시 two === one 을 비교한다.

 

근데 첫 번째 if 문, 즉 minWord === one 을 빠져나왔다는 뜻은

minWord !== one 을 의미하기에, 굳이 two === one 을 비교할 필요가 없다.

 

아래는 정리된 코드다.

 

 

작성한 코드 2

 

function findShortestOfThreeWords(word1, word2, word3) {

  let one = word1.length;
  let two = word2.length;
  let three = word3.length;
  let min = Math.min(wordOne, wordTwo, wordThree);

  if (min === one) {
    return word1;
  } else if (min === two) {
    return word2;
  } else {
    return word3;
  }
}

 

훨씬 깔끔해졌다.

 

- Date 객체

 

문제

 

시, 분, 초를 입력받아 1초를 더한 결과값을 특정 형태의 메시지로 리턴해야 합니다.

 

입력

 

인자 1 : hour

  • number 타입의 정수 (0 <= hour && hour < 24)

 

인자 2 : minute

  • number 타입의 정수 (0 <= minute && minute < 60)

 

인자 3 : second

  • number 타입의 정수 (0 <= second && second < 60)

 

출력

  • string 타입을 리턴해야 합니다.
  • 1초 뒤에 {hour}시 {minute}분 {second}초 입니다 형식으로 리턴해야 합니다.

 

입출력 예시

 

let output = addOneSecond(14, 17, 59);
console.log(output); // --> '1초 뒤에 14시 18분 0초 입니다'

output = addOneSecond(1, 59, 59);
console.log(output); // --> '1초 뒤에 2시 0분 0초 입니다'

output = addOneSecond(3, 24, 29);
console.log(output); // --> '1초 뒤에 3시 24분 30초가 입니다'

output = addOneSecond(23, 59, 59);
console.log(output); // --> '1초 뒤에 0시 0분 0초 입니다'

 

위 문제를 if else 문으로도 풀 수는 있다.

 

방법은

23시 59분 59초인 경우,

59분 59초인 경우,

59초인 경우 로 나눠서 푸는 것이다.

 

하지만 Date 객체를 이용한다면 훨씬 편하다.

 

작성한 코드

 

function addOneSecond(hour, minute, second) {
  // 1. date 객체 선언한다.
  // 2. date 객체의 시, 분, 초 값을 설정한다. 이 때 초는 1 더한다.
  // 4. 시, 분, 초 를 리턴한다.

  const time = new Date(); // 현재 날짜와 시각
  
  time.setHours(hour, minute, second + 1); // .setHours 는 date 객체의 메소드임. 이렇게만 쓰면 원하는 시각으로 변경된다.

  return `1초 뒤에 ${time.getHours()}시 ${time.getMinutes()}분 ${time.getSeconds()}초 입니다`;  


}

 

- for ... of 문

 

문제

 

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

 

입력

 

인자 1 : str

  • string 타입의 문자열

 

인자 2 : letter

  • string 타입의 문자
  • letter.length는 1

 

출력

  • number 타입을 리턴해야 합니다.

 

주의 사항

  • 반복문(for)문을 사용해야 합니다.
  • 빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.

 

입출력 예시

 

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

 

작성한 코드

 

function countCharacter(str, letter) {

  // let string = 0;

  // for (let i = 0;i < str.length; i++) {
  //   if (str[i] === letter) {
  //     string += 1;
  //   }
  // }

  let count = 0;
  for (const char of str) { // for ... of 문   for 의 시작과 끝을 정하지 않고 전체를 알아서 돌아준다
      char === letter && (count += 1); // A && B   A면 B 실행
  }

  return count;
}

 

일반 for 문으로 돌려도 되긴 한다. 

하지만 for ... of 문을 활용하면 코드를 조금 더 간결하게 작성할 수 있다.

 

for (let A of B) {
	
}

 

A 라는 이름을 가진 변수가 B 를 한 글자 한 글자 돌면서 { } 안의 명령을 수행한다.

 

- 최댓값 찾기

 

문제

 

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

입력

 

인자 1 : str

  • string 타입의 숫자 문자열

 

출력

  • string 타입을 리턴해야 합니다.

 

주의 사항

  • 반복문(for)문을 사용해야 합니다.
  • str.split 사용은 금지됩니다.
  • 빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.

 

입출력 예시

 

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

output = getMaxNumberFromString('4321');
console.log(output); // --> '4'
function getMaxNumberFromString(str) {
  // 가장 큰 수를 저장할 변수를 선언
  // 반복문으로 숫자 문자열을 돌면서 변수와 비교 후 더 크면 변수에 할당된 값을 교체

  if (str === '') {
    return '0';
  }

  let max = Number.MIN_SAFE_INTEGER; // 표현할 수 있는 숫자 중 가장 낮은 값 할당. 안전함. 최대값을 구할 때 쓰면 좋다. 굿

  for (const num of str) {
    +num > max && (max = +num);  // num 이 문자열로 되어있기 때문에 +num 을 통해 숫자로 변경해준다.
  }

  return String(max); // 수를 문자열로 바꾸려면 1. String() 괄호 안에 변수를 넣어라
                      // 2. 변수 + ''; 이렇게 하면 된당
                      // 3. `` 백틱 안에 변수 집어넣으면 된다
}

 

- 선형형 프로그래밍

 

문제

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

 

입력

 

인자 1 : str

  • string 타입의 문자열

 

인자 2 : from

  • string 타입의 문자
  • from.length는 1

 

인자 3 : to

  • string 타입의 문자
  • to.length는 1

 

출력

  • string 타입을 리턴해야 합니다.

 

입출력 예시

 

let output = replaceAll('loop', 'o', 'e');
console.log(output); // --> 'leep'
function replaceAll(str, from, to) {
  let changedWord = '';

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



function replaceAll(str, from, to) {
  
  return str
    .split('')
    .map((char) => char === from ? to : char)
    .join('');
 
  // split 빈 문자열을 기준으로 쪼갠다 === 한 글자씩 쪼갠다 ex) loop => l o o p
  // map 쪼개진 걸 하나씩 돈다 for of 랑 비슷. 돌면서 원하는 방식대로 바꿀 수 있다.
  // char => 한 글자 한 글자 라고 생각하면 됨. map 안에서 바로 변수 지정한 느낌
  // char 이 만약 from 과 같다면 to 로 바꾸고 아니면 기존 char 그대로 둔다.
  // split 으로 한 글자씩 쪼갰던 걸 join (기준) 으로 합친다. ex) .join('-') => l-o-o-p
  
  // 명령형 프로그래밍 : for 문. 복잡해지면 복잡해질수록 이해하기 힘들다. 디테일한 기술에 포커싱되어 있음.
  // 선형형 프로그래밍 : 위와 같은 방식. 하는 일들이 다 적혀 있어서 이해가 쉽다. 무엇을 해야하는지 (실무에서 많이 씀)
}

 

위 코드는 내가 작성한 것이고, 밑 코드는 페어 분이 작성하신 것이다.

내가 작성한 코드는 i 가 str 을 한 바퀴 돌면서,

 

str[i] 가 from 과 같을 때는 to 로 교체하고

str[i] 가 from 과 다를 때는 str[i] 인 채로 둔다

 

라는 명령을 수행한다. 페어 분이 작성한 코드는 

 

str 을 한 글자 단위로 쪼개고                                                         .split('')    // 빈 문자열 단위로 쪼갠다는 건 한 글자씩 쪼갠다는 뜻

 

char 라는 놈이 쪼개진 것을 하나씩 보면서                                    .map((char) => char === from ? to : char)

자신과 from 이 같으면 to 로 바꿔주고 아니면 그대로 둔다.

 

그 과정이 끝난 후에는 사이에 아무 것도 두지 않고 합친다.             .join('');

 

페어 분이 작성한 방식을 '선형형 프로그래밍' 이라고 하는데. 수행되는 태스크가 쭉 보이기 때문에 그런 것 같다. 좀 더 직관적이고 실무에서 많이 쓰인다고 하니 잘 알아둬야겠다.

 

- 피드백

페어분께서 진행하시는 스터디에 참여하기로 했다. '자바스크립트 완벽 가이드' 라는 책을 함께 읽으며 공부하는 스터디다.
열심히 해봐야지.

 

결국 기본기가 가장 많이 쓰인다. 이해 안 되는 것들을 꼼꼼하게 체크하고 여러 번 반복해서 익히자!