Code Kata

강지원·2021년 10월 23일
0
post-thumbnail

이번 문제는 단 하나의 조건을 풀지 못하고 끝마쳤던 문제였다.

1. 문제

strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.

예를 들어 strs = ['start', 'stair', 'step'] return은 'st'

strs = ['start', 'wework', 'today'] return은 ''

2. 최종 코드

const getPrefix = strs => {
 
  let strings = strs[0];

if(strs.length === 0){
  return '';
}

  for(let i=0; i<strs.length; i++){
    for(let j=0; j<strings.length; j++){
      
      if(strs[i][j] !== strings[j]) {
        strings = strs[i].slice(0,j);
        }
      }
    }
  return strings;
  }

getPrefix(['start', 'stair', 'step']);

3. 풀이 과정

1단계. 코드 설계 및 시작

배열의 첫 데이터와 다음 배열의 데이터를 비교해서
데이터가 일치하지 않으면, 일치하는 부분까지만 데이터를 뽑아내겠다
이런 방식으로 작전을 짜고 코드를 괴롭히러 갔다.

const getPrefix = strs => {
 
    // const strings = strs[0];
  let strings = strs[0];

if(strs.length === 0){
  return '';
}
}

처음부터 실수를 했는데, 배열의 첫 데이터를 지정해 줄 때,
const를 사용해줬더니 오류가 발생했다.
그리고 let으로 바꿔서 다시 사용했더니 오류가 사라졌다.

배열의 데이터는 항상 바뀔 수 있는 데이터인데,
const로 고정시켜 놓으면 오류가 날 만도 하다.

배열에 데이터가 없는 경우도 있겠다 싶어
if로 데이터가 없는 경우를 작성해줬다.

2단계. 데이터가 일치하지 않을 때

const getPrefix = strs => {
 
    // const strings = strs[0];
  let strings = strs[0];

if(strs.length === 0){
  return '';
}

for(let i = 0; i < strs.length; i++) {
  for(let j = 0; j < strings.length; j++) {
  if(strs[i][j] !== strings) {
  
       }
     }
   }
}

배열의 데이터를 하나씩 비교하기 위해선 반복문을 사용하는 것이
효과적이라고 판단했다. 그래서 사용한 것이 이중 for문.
이중 for문을 사용해준 이유가 있는데,

배열 모양을 요렇게 👉 [ ][ ] 사용해서 배열 안의 데이터에 접근 가능

하기 때문이다.

(이걸 이제 알았다. 우연찮게 알게 되었는데 역시,
이번에도 최초 발견자는 내가 아니었구요.)

strs[i][j]는 배열의 글자 하나씩에 접근 가능하고,
strings는 배열의 첫 데이터를 가리키게 설정해줘서
배열의 첫 단어와 다음에 올 단어가 같지 않다면 이라는
조건을 맞춰줬다.

const getPrefix = strs => {
 
    // const strings = strs[0];
  let strings = strs[0];

if(strs.length === 0){
  return '';
}

for(let i = 0; i < strs.length; i++) {
  for(let j = 0; j < strings.length; j++) {
  
  if(strs[i][j] !== strings) {
     strings = strs[i].slice(0,j);
       }
     }
   }
  return strings
}

조건이 맞다면 slice를 이용해 잘라낸 단어로 첫 단어를 만들어주고
배열의 첫 단어인 strings를 리턴해줬다.

3단계. 코드 수정

조건이 맞지 않아 코드가 통과되지 않았다.
어떤 부분에서 실수를 했을까 둘러보다 깨달았다.

조건을 줄 때, 단어 하나 하나를 비교해줬어야 했는데
내가 작성한 코드는 단어 !== 글자를 의미했으니
코드가 통과되지 않은 것이 당연했다.

strings의 글자 하나하나를 보기 위해서 for문의 j를 이용해줬다.

(strings 자체가 이미 단어를 가리키고 있으니,
단어 안을 순회하는 for문의 j를 사용해줘
글자 !== 글자 조건을 만들어준 것이다.)

const getPrefix = strs => {
 
    // const strings = strs[0];
  let strings = strs[0];

if(strs.length === 0){
  return '';
}

for(let i = 0; i < strs.length; i++) {
  for(let j = 0; j < strings.length; j++) {
  
  if(strs[i][j] !== strings[j]) {
     strings = strs[i].slice(0,j);
       }
     }
   }
  return strings
}

그리고 코드 통과를 요청해봤더니 해결되었다.

profile
'Why' better than 'Yes'

0개의 댓글

관련 채용 정보