[23.10.27] TIL

yy·2023년 10월 26일

개발일지

목록 보기
13/122
post-thumbnail

오늘 할 일

  • (완료) 노드 기초 1주차 강의듣기
  • (완료) 스터디 그룹 이야기 나누기 => 노션 제출
  • (완료) 알고리즘 문제 풀기
  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...

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글