Back to the Basics

[Js/node][Codestates] Coplit_문자열 & 반복문 Review 본문

Programming Languages/JavaScript & Node.js

[Js/node][Codestates] Coplit_문자열 & 반복문 Review

9Jaeng 2021. 6. 15. 23:45
728x90

Coplit 문자열, 반복문 Review

드디어 두 번째 코플릿을 진행하였다. 나는 문제를 풀 때 한 가지 방법이 아닌 다양한 방법을 생각해보고, 더 효율적인 방법이 있는지 고민하면서 푸는 편이다. 이번 pair도 나와 비슷한 성향이어서 잘 맞았던 것 같다. 지금은 빨리 문제를 푸는 것보다 다양한 방법을 시도해 보면서 문제를 풀기 때문에 이번 코플릿 문제도 다는 못 풀었던것 같다. 그래도 저번 코플릿을 했을 때 보다는 많이 풀었으니 좀 더 속도도 향상? 되었다고 해도 되지 않을까...ㅎ

저번 코플릿에서 미흡했던 점을 생각하며 , 이번 코플릿 에서는 나의 진행 방향과 코드를 Pair 가 이해할 수 있도록 차분하게 설명하려고 노력했다.
저번보단 설명하는 것과 수도 코드 작성이 좀 더 부드러워지긴 한 것 같다.

이 글의 목적은 코플릿 코드 리뷰이니 잡담은 그만하고 본론으로 들어가겠다.

문자열 - 06 : findShortestOfThreeWords

  • 문자열을 입력받아 가장 짧은 문자열을 리턴하는 문제
  • Input : 3 개의 문자열
  • Output : 문자열
  1. My Code
  2. 3개의 숫자 또는 문자의 길기 등을 크기 순으로 비교하는 문제는 보통 조건문을 사용하여 3개의 인자를 비교하는 형식으로 풀이가 많이 되어있다.
    나는 이 방법 이외의 방법 중 내장 메서드를 사용하는 방법으로 풀이를 하였다.
    먼저 최솟값을 찾아서 return해 주는 Math.min 메서드를 사용하여 새로운 변수에 할당하고, 각 문자열의 길이를 최솟값과 비교하는 방법이다.
// Math.min 메서드를 사용하여 가장 작은 문자열을 변수에 할당한다.
// 조건문을 사용하여 각 문자열의 길이 중 최소 길이와 같은 것을 리턴한다.
function findShortestOfThreeWords(word1, word2, word3) {
  // TODO: 여기에 코드를 작성합니다.
  let minNum=Math.min(word1.length,word2.length,word3.length);
  if(minNum===word1.length){
    return word1;
  }else if(minNum===word2.length){
    return word2;
  }else{
    return word3;
  }  
}
  1. Reference Code - 직접 비교
function findShortestOfThreeWords(word1,word2,word3){
    let shortestWord=word1;
    // 첫 번 째 글자가 2번째 글자보다 길 때
    if(word2.length>word2.length){
        shortestWord=word2;
        // word 2랑 word3을 비교
    if(word2.length>word3.length){
        shortestWord=word3;
    }
   } else{
    // word1과 word3을 비교
    if(word1.length>word3.length){
    shortestWord=word3;
    }
   }
return shortestWord;
}

문자열 - 17 - makeLasrSeenMsg

  • 접속시간을 입력받아 조건별로 다른 메세지 리턴하는 문제.
  • 미접속 시간이 1시간 보다 적으면 --> 분단위로 표기
  • 미접속 시간이 1시간보다 크로 24시간 보다 적으면 시간 단위로 표기
  • 미접속 시간이 24시간 보다 크다면 일 단위로 표기
  • 모두 내림처리아혀 표기
  • Input : name, period(접속 시간)
  • output : 조건에 따라 다른 메제시 출력

이 문제는 간단하고 reference cede도 나의 풀이와 결과는 비슷했지만 다른점이 있다면 조건문의 순서가 다르다. 하지만 바뀐 순서에 의해 비교연산을 하는
횟수는 더 줄어들었으므로, 만약 더 복잡한 코드였다면 비교연산을 덜 하는 Reference 코드가 훨식 빠르고 좋은 코드일 것이다.

Reference Code는 이전 코드리뷰에서 작성했던 [210606]_Coplit_변수와 자료형&조건문 Review 포스트에서 언급했던 " MECE(Mutually Exclusive, Collectively Exhaustive) 맥킨지 문제해결 기법 " 의 논리를 적용한 결과이다.

다중 조건문이 들어갈 때, 겹치는 범위가 있다면 가장 작은 범위의 조건을 우선순위로 작성한다.
Min( hour ( day () ) ) 에서 보면 day의 범위가 가장 작은 것을 알 수 있다.

아래의 코드를 비교해보면 차이를 알 수 있다.

  1. My Code
    첫 번째 조건문 : minute
    두 번째 : hour
    세 번째 : day
    의 순서로 조건문을 작성하였다.
function makeLastSeenMsg(name, period) {
  // TODO: 여기에 코드를 작성합니다.
  //String 타입의 이름과 Number 탑입의 시간을 분단위로 입력받는다.
  // 만약 period가 60 미만일 경우 분단위로 출력한다.
  // 만약 60보다 크고 1440 미만일 경우 period를 60으로 나눈 몫을출력한다.
  // 1440보다 킁 경우 1440으로 나눈 몫을 리턴한다.
  if(period < 60){
    return `${name}: ${period}분 전에 접속함`
  }else if(period>=60 && period<1440){
    return `${name}: ${Math.floor(period/60)}시간 전에 접속함`
  }else{ 
    return `${name}: ${Math.floor(period/1440)}일 전에 접속함`
  }
}
  1. Reference Code
    첫 번째 조건문 : day
    두 번째 조건문 : hour
    세 번재 조건문 : minute
    순으로 작성하였다.
function makeLastSeenMsg(name, period) {
  // TODO: 여기에 코드를 작성합니다.
  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}분 전에 접속함`;
  }
}

My Code에선 두번 째 조건문에서 period가 60 보다 크거나 같고 (&&) 24시간 보다 작다는 조건을 총 3개의 비교연산자를 사용하였다.
Reference Code에선 day를 먼저 함으로써 period가 60보다 크거나 같을 조건만 사용하였다. (이미 24시간 보다 작을 조건은 else if 에서 걸러지기 때문) 조건문을 사용할 때는 꼭 가장 작은 범위를 먼저 놓는 습관을 들여야겠다.

반복문 - 03 isOdd

  • 압력받은 수가 홀수인지 판별
  • 0을 짝수로 간주한다.
  • Input : Integer
  • Output : Boolean

이 문제는 Pair가 Nevigator일 때 풀었던 문제이고, 조금 독특한 방법으로 풀이를 했기 때문에 비교해 보았다.
나 또한 다른 방법으로 풀었으니 Pair의 Code와 My code, Reference를 비교해 보겠다.

  1. Pair Code

입력된 수의 절대값 만큼 반복을 하고 , True와 False를 변수에 할당하는 코드를 반복한다.
홀수이면 True가 마지막에 리턴이 되고 짝수일 경우 False가 리턴이 되는 구조이다.
코드는 아래와 같다.

function isOdd(num) {
  // TODO: 여기에 코드를 작성합니다.
  // 수를 입력받습니다.
  // 반복문을 사용하여 홀수면True를 짝수면 False를 리턴합니다.
  let i=0;
  let absNum=Math.abs(num);
  let isOddTemp=true;

  while(i<=absNum){
    if(isOddTemp===true){
      isOddTemp=false;
    }else{
      isOddTemp=true;

    }
    i++;
  }
  return isOddTemp;  

}
  1. My code

음수이든 양수이든 결국 맨 마지막 숫자는 1,3,5,7,9 중에 하나일 것 이므로, 반복문을 돌려 입력 인자의 일의 자리 수가 1,3,4,5,9 중 하나와 같다면 true를 return하는 코드를 생각하였다.

function isOdd(num){
let i=1;
let lastLetter=0
let temp_leng=0
    while(i<10){
lastLetter=String(num).slice(-1)


    if(Number(lastLetter)===i){
        return true;
    }
i+=2;
}
return false;
}
  1. Reference Code
function isOdd(num) {
  if (num < 0) {
    num = -num;
  }

  while (num >= 0) {
    if (num === 0) {
      return false;
    } else if (num === 1) {
      return true;
    }

    num = num - 2;
  }
}

위의 새 가지 경우 모두 알아두면 좋은 방법이라고 생각한다.
첫 번재 방법은 홀수일 때와 짝수일 때의 차이를 이용한 방법(이라고 생각) 이고, 두 번째 방법은 홀수가 될 조건을 이용한 방법이다.
세 번째 방법 또한 짝수롸 홀수일 때의 차이를 이용한 방법(인것 같다.) 이다.
즉 어떠한 문제를 풀 때 중요한 것은, 구해야 하는 변수(정답)에 영향을 끼치는 인자(point)를 찾는 것이 더 효율적이게 코드를 작성하는 방법인 것 같다.

반복문 - 17- isPrime && 18번은 다음 포스팅에서 좀 길게 리뷰를 하겠다.

728x90
Comments