- (완료) 노드 기초 1주차 강의듣기
- (완료) 스터디 그룹 이야기 나누기 => 노션 제출
- (완료) 알고리즘 문제 풀기
https://school.programmers.co.kr/learn/courses/30/lessons/155652
우선 이렇게 접근했다.
1. s, skip를 아스키코드로 변경 => index만큼 이동
2. 아스키코드를 변경하되 소문자를 벗어나는 것 숫자 조절
3. arrS ~ arrSSkip 범위 안에 skip 번호가 있으면 count 배열에 하나씩 넣어4.count를 arrSSkip에서 빼서 아크시코드 -> 문자
차례차례 만들어보면
우선 입력받은 s,skip을 arr로 변경하고 map을 이용해 문자->배열->아스키코드 배열로 만들어줬다.
//1. s, skip를 아스키코드로 변경 => index만큼 이동
let arrS = s.split("").map((value) => value.charCodeAt()); //[ 97, 117, 107, 107, 115 ]
let arrSkip = skip.split("").map((value) => value.charCodeAt()); //[ 119, 98, 113, 100 ]
문제에 나와있는 것처럼 알파벳 소문자로만 이루어져있기때문에 아스키코드에서 소문자 범위를 확인했다. 97(a)~122(z)

그 외의 범위로 넘어갔을 때를 대비해 26을 빼줬는데 어차피 index값만큼 이동해야하니 겸사겸사 같이 처리해줬다.
//2. 아스키코드를 변경하되 소문자를 벗어나는 것 숫자 조절
let arrSSkip = arrS.map(val => val + index > 122 ? val + index - 26 : val + index); //[ 102, 122, 112, 112, 120 ]
(아스키코드로 이야기합시다.) arrS와 arrSSkip의 범위 안에 skip의 숫자가 들어가있으면 빼면 되는 것이기에 arrS와 assSSkip에 skip의 갯수가 얼마나 있는지가 알고싶었다. 그래서 count라는 배열을 만들어서 0으로 채워줬다.
그리고 반복문을 돌려서 그 안에서 arrSkip 배열의 숫자가 arrS와 arrSSkip 안에 있는지 확인하고 있다면 arrS와 arrSSkip과 동일한 인덱스 위치에 count에 1씩 추가하는 로직을 짰다.
나중에 count배열을 arrSSkip(입력받은 문자열 + 인덱스)에서 빼면 되는 일이었으니까!
//3. arrS ~ arrSSkip 범위 안에 skip 번호가 있으면 count 배열에 하나씩 넣어 // 여기서부터 문제
let count = new Array(arrS.length).fill(0);
for (let i = 0; i < arrS.length; i++) {
arrSkip.find(num => (arrS[i] <= num && num <= arrSSkip[i]) ? count[i] += 1 : 0);
};
근데 이상하게 여기서 count가 두개가 나와야하는 한개밖에 안나오는 현상이 발생했다.

왜그러냐 너.
당연한 로직이었다. 하나씩 돌면서 당연히 한개만 카운트 되니까!
그럼 메소드쓰지말고 간단하게 반복문과 조건문으로 표현해보자! 직관적으로!
let count = new Array(arrS.length).fill(0)
for (let i = 0; i < arrS.length; i++) {
for (let j = 0; j < arrSkip.length; j++) {
if (arrS[i] <= arrSkip[j] && arrSkip[j] <= arrSSkip[i]) {
count[i] += 1;
console.log(`${arrS[i]} <= ${arrSkip[j]} && ${arrSkip[j]} <= ${arrSSkip[i]}`)
}
};
};
console.log(count)
위와 같이 코드를 짜니 원하던 바가 나왔다!

arrSSkip에서 count를 빼려고 했는데 생각해보니까 count를 하고도 아스키코드 영문자를 벗어나는 경우가 발생하겠는거다.
아놔~ 그래서 범위에 미달하는건 26을 더해주고, 범위를 초과하는건 26을 빼줬다. 둘다 아니라면 그냥 반환하도록 조건문을 작성했다.
그랬더니...
// 4.count를 arrSSkip에서 빼서 아스키코드 -> 문자
let answer = ""
for (let i = 0; i < arrSSkip.length; i++) {
if ( 96 > arrSSkip[i]-count[i]) {
answer = String.fromCharCode(arrSSkip[i]-count[i]+26);
} else if ( arrSSkip[i]-count[i] > 122){
answer = String.fromCharCode(arrSSkip[i]-count[i]-26);
} else {
answer = String.fromCharCode(arrSSkip[i]-count[i]);
}
console.log(answer)
}

이상한 문자가 나와버렸다. y, p, p는 맞지만 맨 앞과 뒤의 d,w가 잘못나온것이었다.
예상값과의 차이를 비교해봤다.
104=> d(100): 차이 4, 121 => w(119): 차이 3
...차이가 날거면 동일하게 나던가. 왜 두개가 다른가. 어디서부터 잘 못 된것일까...
애초에 빼는게 아니라 더해주는거였다!!!! s에서 skip 문자가 있는 걸 빼고 나서 구해야한다는 그 말에 너무 파묻혀있었던거같다. 빼면 그만큼 더 뒤로 가야하는거였는데 말이다!
// 4.count를 arrSSkip에서 더해서 아스키코드 -> 문자
let answer = ""
for (let i = 0; i < arrSSkip.length; i++) {
console.log(`arrSSkip[i]-count[i]: ${arrSSkip[i]+count[i]}`)
if ( 96 > arrSSkip[i]+count[i]) {
answer = String.fromCharCode(arrSSkip[i]+count[i]+26);
} else if ( arrSSkip[i]+count[i] > 122){
answer = String.fromCharCode(arrSSkip[i]+count[i]-26);
} else {
answer = String.fromCharCode(arrSSkip[i]+count[i]);
}
console.log(answer)
}
더해줬더니 내가 원했던 답이 나왔다~!


오예~!

아놔 미치겄네.
to be continued...