[CodeKata] Day5 & Day6

yoonee·2021년 10월 27일
0

JavaScript

목록 보기
7/8

strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.
예를 들어 strs = ['start', 'stair', 'step'] return은 'st'
strs = ['start', 'wework', 'today'] return은 ''

const getPrefix = strs => {
  let prefix = strs[0];// ➊ 비교할 대상을 정한다.
  
  if(strs.length === 0){ // ➌ strs가 아예 없을때 ''를 반환.
    prefix = '';
  }
  
  for(let i = 1; i < strs.length; i++){// ➋ 비교할 대상을 제외한것을 비교함.
    while(strs[i].indexOf(prefix) == -1){
      prefix = prefix.substring(0,prefix.length-1)
    }
  }return prefix;
}
  • ➋ 번에서 prefix가 str[i]에 없다면,
    prefix에서 substring()메서드를 통하여 한글자씩잘라주며,계속해서 비교해준다.
    prefix에는 하나씩 잘린 값이 계속 담겨지면서 공통된 단어만 남기게 된다.

  • ➌ 번은 사실 안써줘도 될거같다고 생각했는데, 만약에 인자에 빈 배열이 담기게된다면,
    문제에서 원하는 ''가 아닌 , undefined 가 출력되는것을 알 수 있었다.

여기서 왜 while문 위에 if문을 넣어줬는지 의문이어서
while문이 끝나고 리턴된 다음에 넣어줬더니
똑같이 undefined 가 출력되었다.
내 생각에 if문을 아래에 쓰게되면 또 리턴을 해줘야 하는데,
이미 위에서 해줬기 때문에 안먹히는것 같다..
저번 문제에서도 리턴을 어디다 해줘야 하는지 잘 인지를 못했었는데
한번 더 생각해 볼 수 있었다..

로마자에서 숫자로 바꾸기
1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
로마 숫자를 숫자로 표기하면 다음과 같습니다.

로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다.
III = 3 XII = 12 XXVII = 27 입니다.
그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
뒤의 숫자에서 앞의 숫자를 빼주면 됩니다. 9는 IX입니다.
I는 V와 X앞에 와서 4, 9 X는 L, C앞에 와서 40, 90 C는 D, M앞에 와서 400, 900

function romanToNum(s) {
  let num ={ // 객체로 만들어 key와 value 값으로 
    I:1,     // 접근하기 편하게 만들어 줌.
    V:5,
    X:10,
    L:50,
    C:100,
    D:500,
    M:1000
  }
  
  let sum = 0; // 임의로 담을 값을 0으로 정해 줌.
  
  for(let i=0;i<s.length;i++){
    if(num[s[i]] < num[s[i+1]]){
      sum -= num[s[i]]; // ➊ -1
    }else{
      sum += num[s[i]]; // ➋ +5 => 4 
    }
  }return sum;
}

romanToNum('IV') // 4
  • 객체로 접근하여, value값을 받아내었고, value의[i]와 다음[i]값의 크기를 비교해준다.
  • ➊ 인자가 'IV' 일때, if문에서 뒤에 값의 크기가 크기때문에 -1을 sum에 넣어준다.
  • ➋ 다시 for문에서 s[1]번째는 뒤에 없기때문에 비교를 하지 않고 else로 넘어가 sum에 +5를 담아준다.

여기서 인자가 'IIIV' 라면, sum에 -3이 담기고,
s[3]번째 돌때 else로 넘어가 +5가 되어 2가 리턴이 되어야한다고 생각하는데,
왜 6이 리턴이 되는건지 의문이다..
리턴값만 보고 생각이 든건, 딱 앞뒤로만 비교해줘서 6이나오는거같은데
for문에서 s[1]을 돌때, 도대체 어떻게 넘어가는걸까...?

0개의 댓글