<작성 답안>
코드 작성취지:
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'));
'🗃️javascript > 코테 프레임 문제' 카테고리의 다른 글
4-1 자릿수의 합(x) [for문의 안쓰기 위해 발버둥 치는 중] (0) | 2024.04.17 |
---|---|
3-5 문자열 압축(△) (0) | 2024.04.16 |
3-3 숫자만 추출(x)[splice 활용: 원본의 변화는 임시 변수에 담아 재할당] (0) | 2024.04.16 |
3-2 유효한 팰린드롬(x) [특수문자만 제거해서 대소문자 남기기] (0) | 2024.04.16 |
3-1 회문 문자열(x)[배열비교는 참조끼리의 비교라 false를 return함] (0) | 2024.04.15 |