본문 바로가기
항해99/실전 WIL | TIL

[TIL-002] 알고리즘 - 신규 아이디 추천(2021 KAKAO BLIND RECUITMENT)

by junvely 2023. 4. 12.

Today목표 : 4/11일 Challenger's Challenge 5개 문제  풀기 ✅


알게된 점,

1. 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.다음은 카카오 아이디의 규칙입니다.
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

문제 사항

코드 실행을 하면 모든 테스트 케이스를 통과하는데 채점 시에는 5개 정도 실패가 나왔다.... 예외 사항이 있나 싶어 테스트 케이스를 추가해 보면서 찾아봤지만 다 통과 되어 디버깅하는게 너무 어려웠는데, 다른 분의 도움을 받아 같이 디버깅 해 보다 문제점을 찾게 되었다. 다른 분의 통과 코드를 비교하여 하나씩 수정 하면서 디버깅 하다보니 6단계를 수정하고 나서야 문제점을 찾을 수 있었다.

6. 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
if (arr.length >= 16) {
      arr.splice(15, arr.length%15);
    }

여기서 나는 15자 이후로는 잘라서 없애 주기 위해, 15자에서 부터 ~ 마지막 문자열 % 15의 나머지만큼을 제거해 주었다.이렇게 하면 나머지가 15자일 때 까지는 문제없이 제거되지만, 문제는 문자열 길이가 길어서 나머지가 15를 초과하게 될 경우, 예를들어 16자 이상일 경우는 16 % 15 = 1이기 때문에 1개의 문자만큼만 제거된다.... 

따라서 위 코드를 다음과 같이 수정하였더니 실패했던 테스트 케이스들을 통과할 수 있었다.

if (arr.length >= 16) {
      arr.splice(15, arr.length);
    }

안전하게 문자열의 길이만큼 제거해 주니 문제없이 통과되는 것을 볼 수 있었다. 항상 코드를 작성할 때에는 예외 사항, 특히 주어지는 데이터의 값이나 길이가 클 경우를 항상 미리 대비하고 예측하여 코드를 짤 필요성이 있다는 것을 깨달았다.

 

💡다른 분의 코드를 보며 깨달은 점

문자 또는 배열의 특정 값을 삭제하는 법 => 문자열에서 .을 삭제하는 코드에서 차이점이 있었다.

for문으로 배열의 요소를 순회하여 특정 값인 배열의 요소를 splice() 함수를 사용하여 삭제한다.

삭제 후, i--; 코드를 작성한 이유는 splice() 함수가 실행 후 배열의 요소가 즉시 삭제되고 배열의 길이가 변경되기 때문에 다시 삭제된 인덱스부터 순회할 수 있도록 한다.

var arr = [1, 2, 3, 4, 5, 5, 6, 7, 8, 5, 9, 0];

for(var i = 0; i < arr.length; i++){ 
  if (arr[i] === 5) { 
    arr.splice(i, 1); 
    i--; 
  }
}

console.log(arr);
// [1, 2, 3, 4, 6, 7, 8, 9, 0];

나는 이 부분을 함수로 만들었다. for문으로 문자가 연속되는지 확인하고, 연속된다면 함수를 한번 더 재귀하도록 만들어 연속된 문자가 여러개이더라도 더 이상 연속되지 않을 때 까지 for문을 반복하도록 만들었다. 하지만 이렇게 되면 중첩이 발생한 인덱스 부분까지 for문이 한번 더 돌아야 하므로 시간복잡도를 줄이기 위해 다음부터는 인덱스를 i--하는 코드로 개선시키면 더 좋을 것 같다.

const removeDots = () => {
      for (let i = 0; i < arr.length; i++) {
        if (arr[i] === "." && arr[i] === arr[i + 1]) {
          arr.splice(i, 1);
          removeDots()
        }
      }
}

 

 

2. 동기부여 개발자 특강

특강 내용 정리

1. 메타인지 : 내가 무엇을 모르고, 무엇을 아는지 분명하게 알아야 한다.

항상 내가 모르는 것과 아는 것을 분명하게 알고, 구분하여 학습하고 알게된 점을 정확히 깨닫도록 하자 => TIL의 중요성

 

2. 번아웃이 오지 않는 방법

번아웃이 오는 시기가 언제인가? => 오늘 할일을 감당할 수 없을 때 찾아온다.

즉, 무엇을 뭐부터 해야할지 모를 때, 감당할 수 없을 만큼의 양을 소화해야 할 때를 말한다.

이를 대비하기 위해, 내일 무리하지 않도록 오늘의 할일은 반드시 오늘 마무리 하고, 내일을 대비하여 오늘 미리 해내도록 하자.

내일 할 일이 내가 감당할 수 있는 정도라면 멘탈적으로 번아웃이 오는 것을 방지할 수 있다.

 

3. 열심히, 잘 하는 사람보다 더 잘 학습하는 법 : 이 악물고 악에바쳐 피곤함과 귀찮음을 이겨내기..!

 

4. 일론머스크가 신입을 뽑는 기준

살아온 과정 => 겪어온 문제들 => 선택과 결정에 대한 이유 => 어떻게 해결했는지를 묻는다.

진짜 해결한 사람은 '자신이 겪은 문제'를 정확히, 구체적으로, 분명히 파악하고 있다. 해결한 방법 또한 정확히 알고 있다.

해결한 척 하는 사람은 자신이 겪은 문제나 해결방법을 분명히 설명하지 못한다.

 => TIL의 중요성 : 메타인지로 자기가 무엇을 알고있는지, 모르는지를 파악하기 위해 요구사항/문제사항을 나누어 작성하고 자신에 대해 회고, 복습, 기억하는 반복작용을 하도록 한다.

 

5. 신입이 회사에 잘 적응하는 방법

1) 질문은 적정성을 찾아(메타인지) 적극적이고 과감하게하기(실수를 두려워하지 않기)

2) 기록하는 습관을 들이기(TIL, 같은 질문과 실수를 반복하지 않기)

3) 겸손한 태도와 커뮤니케이션 능력

 

6. 우수한 개발자가 되기 : 기능보다 서비스집중하기, 나무를 보기보다는 숲을 보는 개발자가 되자.

=> 버튼의 기능을 구현하는 개발자는 연봉을 받지만, 서비스의 관점에서 사이드 이펙트나, 버그, 사용자의 경험 등을 고려하는 개발자는 보너스를 받는다..

 

7. 프론트엔드도 알고리즘을 해야할까?

=> 프론트엔드라고 해서 알고리즘이 필요없는건 아니다. 프론트 역시도 시간적 자원(사용자 경험성)과 공간 자원(브라우저)의 한계성에서 벗어날 수 없다. 결국 이런 한정된 자원 내에서 가장 효율적이고 빠른 알고리즘을 선택하여 렌더링을 최적화 시키기 위해서는 알고리즘이 필수적이라고 할 수 있다.

 

느낀점

1. TIL을 쓰는 목적과 중요성을 깨달았다 => 메타인지를 반드시 기억하고, 내가 무엇을 모르는지를 분명히 알고 학습하도록 하자. 이것을 알고 반복하여 학습하고 복습하고 기억할 때, 학습에서 가장 큰 차이를 가져올 것 같다. => 문제 해결 능력을 키우는 방법

2. 번아웃이 오지 않는 방법은 항상 그때 그때 미루지 않고 미리 오늘 할일을 하는 것에서 부터 시작된다. 모르는 것이 많다는 것은 나쁜게 아니다. 내가 무엇을 모르는지 분명하게 알고 있다는 것이다.

3. 기능 구현에 집중하기 보다는 서비스에 집중하자는 말이 크게 와닿았다. 나무를 보지 말고 숲을 보자.

4. 마지막으로 오늘의 TIL을 미루지 않고 무사히 작성한 나를 칭찬한다.