오늘은 자바스크립트 스터디 2일차! 먼저 시작하고 계셨던 대킴🐻님의 진도에 맞춰 조금 빡쎈 문제로 난이도를 높였다. 레벨 1은 문제 없었는데 레벨 2에서 이정도 되니까 문제의 흐름을 직접 구현하는 것보나 어느 정도 짱구🧠를 굴리고 "설계" 후 들어간다면 더 쉽게 풀 수 있는 문제들도 있었다.
그래서 오늘 가장 우선순위로 배운 점, 문제 풀기 전에 한 번 더 생각해보기...!👊
오늘은 새로 배운 메서드나 알고리즘 보다는 소감문에 가깝다. 호호
뉴스클러스터링 문제에서 배열 두 개의 합집합, 교집합의 수를 구해서 jaccard 유사도를 구하는 문제가 있었다.
나는 배열을 돌면서 합집합을 구하는 함수, 교집합을 구하는 함수를 만들고, 그 길이를 구해서 나눠주었다. 그 나눠준 값이 있다면 문제에서 요구한 65536를 곱해주고 소수점 아래로는 parseInt()
로 버려주고, 아니라면 그냥 65536를 반환한다.
🧨 여기서 문제 1. 이렇게 푸니 테스트 케이스에서 자꾸 2개가 🤷♀️실패🤷♀️하는 것이다! 왜지? 왜 심지어 딱 2개만 이냐구~~~!!!
대킴🐻님과 함께 쭈우욱 보다보니 로직은 전혀 문제될 게 없었다! 그래서 대킴님과 로직상 딱 하나 다른, 교집합에서 합집합을 나누기 전에 합집합(분모)이 0이 아닐 때에만 처리를 해주니 잘 돌아가는 것 아닌가!
왜 먼저 나눠주고 처리하면 안됐던 걸까?🤔 아무리 고민해봐도 답이 나오지 않는다... 나눠주고 처리하면 안될 경우는 오직 infinity
가 나오는 경우인데, 그건 분자(교집합)가 0이 아닌 자연수이고 분모(합집합)가 0일 때이다. 그런데 그게 가능한 경우가 있나...? 내 머리로는 예외케이스가 전혀 떠오르지 않아서 이건 여기저기 자바스크립트 고수들에게 물어보고 답을 구해야할 것 같다.
🧨 문제는 아니지만 깨달은 것 1. 휴지🐧의 코드를 보면서 교집합, 합집합의 개수를 구하고 그 값으로 유사도를 구하는 것이기 때문에, 굳이 교집합, 합집합의 배열을 어렵게 구하지 않았어도 됐었다. 배열을 돌면서 includes()
, indexof()
, splice()
무한반복! 알고리즘 공부는 처음이지만 혹시나 만약 이게 시간이 중요한 문제였다면... 내 로직으로는 시간초과가 나올 수도 있겠구나라는 생각이 들었다. 그래서 한 번 더 생각하고 풀어야지~! 라는 결심을 하게 되었다.
프린터도 뉴스 클러스터링 문제와 마찬가지로 꼭! 배열을 그렇게 자르고 붙이지 않아도 된다는 것을 알았다. 흠 대킴님🐻의 코드가 신기했는데, 오늘 바빠서 먼저 가셔서 추가적인 설명은 나중에 듣기로 했다.
내 코드는 문제에서 요구하는대로 주어진 배열을 계속 돌면서 가장 중요도가 높은 숫자가 아니면 push()
, shift()
를 해주면서 앞에서 떼고, 뒤에다 붙여주는 걸 반복했다. (배열의 길이가 없어질 때까지!!)
근데 대킴님이 오늘 설명해주시기를, 큰 수만 찾아서 빼주면 그 반복을 줄여줄 수 있다고 설명해주셨다. 주어진 인덱스의 위치를 조정하는 건 나랑 로직이 똑같아서, 약간의 생각만 전환해주면 이렇게 효율적인 코드를 짤 수 있구나 생각했다!
뉴스 클러스터링 문제를 풀면서 진짜 많이 성장한 것 같다. 사실 문제를 똑바로 읽었거나 수학적인 배경이 있었다면 분모가 0일 때의 처리를 분명히 해주고 넘어갔을텐데!!! 아쉬움도 있지만 그래도 계속 끝까지 저 예외사항이 뭘까 궁금한 내 자신... 이런 궁금증과 함께라면 멀리멀리 성장할 수 있을거야... 암 그렇고말고.😂
아직 2일차밖에 안됐는데도 엄청 많이 배워가는 것 같다. 다른 팀원들의 코드도 너무 신기하고! 문제가 어려워질수록 푸는 방식도 다양해져서 너무 재밌다. 메서드를 사용해 깔끔하게 짜는 휴지🐧, 시간 복잡도를 항상 고려하는 대킴🐻님 다들 너무너무 멋지다!
자바스크립트 고수(수정🍒)이가 내 벨로그를 보고 뉴스클러스터링 문제의 예외사항을 찾아주었다. 바로 유효한 인자 두 개가 들온다면! "abcd", "efgh" 이렇게 들어오게 된다면, 0을 반환해야 한다. 하지만 내 로직에서는 교집합/공집합이 false이면 그냥 냅다 65536를 반환하게 된다.🥲 지금 다시 보면 그렇게 어려운 문제가 아닌데 내 알고리즘에만 갖혀서 다양한 케이스를 생각하지 못한 것 같다. 역시 오늘의 교훈은 한 번 더 생각하자 ‼️
💖 매일 발전하는 자배님 멋져요 💖