🗃️javascript/코테 프레임 문제

3-4 가장 짧은 문자거리(x)[return문 작성 표시를 안해서 생긴 에러 고찰]

하얀성 2024. 4. 16. 15:16


<작성 답안>

 

코드 작성취지:

e 하나하나에 따른 거리를 구한 뒤에 계속 재귀적으로 배열 끼리 비교해서 가장 낮은 거리를 기록한 배열을 최종적으로 출력하는게 목표(틀린 접근)

function solution(s, t) {
  let originArr = s;

  function makeArr(str) {
    return [...str].reduce((acc, sub, i) => {
      acc.push(Math.abs(i - [...str].indexOf(t)));
      return acc;
    }, []);
  }
  function deleteSub(s) {
    let copy = [...s];
    copy.splice(s.indexOf(t), 1);
    return copy.join("");
  }
  function checkArrs(s) {
    if (s.indexOf(t) !== s.lastIndexOf(t)) {
      let prevArr = makeArr(originArr);
      let nextArr = makeArr(deleteSub(originArr));
      let checkedArr = prevArr.map((x, i) => {
        if (x > nextArr[i]) {
          x = nextArr[i];
        }
      });
      console.log(checkedArr);
      if (nextArr.indexOf(t) !== nextArr.lastIndexOf(t)) {
        return checkArrs();
      } else {
        return checkedArr;
      }
    }
  }
  if (originArr.indexOf(t) !== originArr.lastIndexOf(t)) {
    return checkArrs(originArr);
  } else {
    return makeArr(originArr);
  }
}
let str = "teachermode";
console.log(solution(str, "e"));

 

결과

 

원인 :

1. 내가 함수의 매개변수를 문자열로 받게했으면서 함수와 함수를 연계해줄 때, 매개변수를 배열로 준 점.

2. map 함수나 일반 함수에서 return 값을 다 주지 않았음. 함수 안에 if, else로 조건문을 줬음에도 따로 return문을 통해 줘야함. 


<오로지 코드 출력을 위한 수정(답 아님).>

function solution(s, t) {
  let originArr = s;

  function makeArr(str) {
    return [...str].reduce((acc, sub, i) => {
      acc.push(Math.abs(i - [...str].indexOf(t)));
      return acc;
    }, []);
  }
  function deleteSub(s) {
    let copy = [...s];
    copy.splice(s.indexOf(t), 1);
    return copy.join("");
  }
  function checkArrs(s) {
    if (s.indexOf(t) !== s.lastIndexOf(t)) {
      let prevArr = makeArr(originArr);
      let nextArr = makeArr(deleteSub(originArr));
      let checkedArr = prevArr.map((x, i) => {
        return x > nextArr[i] ? nextArr[i] : x;                    //수정내역
      });
      if (nextArr.indexOf(t) !== nextArr.lastIndexOf(t)) {
        return checkArrs(deleteSub(s));
      } else {
        return checkedArr;
      }
    }
    return makeArr(s); // 수정 내역
  }
  if (originArr.indexOf(t) !== originArr.lastIndexOf(t)) {
    return checkArrs(originArr);
  } else {
    return makeArr(originArr);
  }
}
let str = "teachermode";
console.log(solution(str, "e"));

 

 

더미 코드이지만 이 정도 양의 함수를 내가 운용해보고 짜보니까 의외로 예전보다 어렵지는 않은 느낌.

(4~5시간 짜던게 2시간 걸리고 정확도도 이 정도면 많이 올라갔고, 무엇보다 함수간의 흐름 이해력이 많이 상승함.)

 


 

<정답>

위에 너무 어렵게 잡았다. 

그냥 각 계속 변수마다 값을 더하고 push 해주면서 e를 만나면 값을 초기화 해주면 된다.

이걸 앞 뒤로 각각 해줘서 더 작은 값으로 값을 재할당해주면 끝.

(허탈하다)

function solution(s, t){
  let answer=[];
  let p=1000;
  for(let x of s){
      if(x===t){
          p=0;
          answer.push(p);
      }
      else{
          p++;
          answer.push(p);
      }
  }
  p=1000;
  for(let i=s.length-1; i>=0; i--){
      if(s[i]===t) p=0;
      else{
          p++;
          answer[i]=Math.min(answer[i], p);
      }
  }
  return answer;
}

let str="teachermode";
console.log(solution(str, 'e'));