알고리즘 문제 풀이 28

[TIL] JavaScript 알고리즘 100일 챌린지 29번째 도전 🥹

드디어 풀지 못한 문제가..! 그 동안은 어찌저찌 풀기라도 했는데 이 문제는 풀지 못했다!!!!! 두 문자열이 주어졌을때, 한 문자열을 옆으로 밀어서 다른 문자열을 만들 수 있는지 판별하는 메소드를 작성하는 문제였다. 반복문도 사용해보고 sort도 사용해보고 slice로 잘라도 보고 이런 저런 방법을 시도해 봤지만 뭔가 아닌것 같은데.. 싶었다. 결국 풀이 영상을 보니, 두 문자열 중 하나를 이어 붙여서 다른 문자열이 그 안에 있는지 찾는 방법이 있었다. 뭔가를 밀어서 다른걸 만들어라! 라는 문제를 만나면 이렇게 하나로 이어 붙이는 방법이 있을 것 같다. (이렇게 하니까 입시 공부 같다...) https://youtu.be/HwpF73JJC8s

[TIL] JavaScript 알고리즘 100일 챌린지 28번째 도전

알파벳이 담긴 배열과 단어들이 담긴 배열이 주어졌을때, 각 알파벳을 하나씩 모두 갖고 있는 단어가 있으면 1 없으면 2를 리턴하는 문제였다. 어떤 문자열의 구성에 관한 문제라면 정규식을 이용하는 것이 제일 간결하다고 생각한다. 그래서 이리저리 검색해서 나는 아래처럼 풀었다. 1. 각 알파벳 하나씩 모두 있는지 검사하는 정규식 작성 2. 단어들의 배열에다가 find 메소드로 정규식의 test를 통과하는 것이 있는지 확인 3. 있으면 1리턴, 없으면 2 리턴 근데 아래 영상을 보니 sort로 훨씬 간단하게 풀었다. function solution(spell, dic) { const found = dic.some(vocab => [...vocab].sort().toString() === spell.sort()..

[TIL] JavaScript 알고리즘 100일 챌린지 26번째 도전

숫자 배열이 주어졌을때 각 숫자의 크기 순서가 담긴 배열을 리턴하는 것이다. 만약 [1, 72, 10] 이 주어졌다면 [3, 1, 2] 를 리턴해야 한다. 나는 아래와 같이 풀었다 1) 주어진 배열을 slice 로 얕은 복사 후, sort로 큰 순서대로 정렬 2) 정렬한 배열을 반복문 돌면서 크기 순위를 객체에 기록 3) 본래 주어진 배열을 map 돌면서 2번의 객체에서 각 요소의 크기 순위를 찾아 담은 배열을 리턴 이렇게 해도 맞긴 하지만 좀 더 간단하게 푸는 방법이 있었다. 주어진 배열을 slice 후 정렬하는 것까진 똑같다. 그 후에 주어진 배열을 map을 돌면서 정렬된 배열에서 각 요소가 몇 번째 index에 있는지 indexOf를 사용해 찾은 다음 거기에 1을 더해서 리턴하는 방법이다. http..

[TIL] Javascript 알고리즘 100일 챌린지 25번째 도전

문자열과 숫자가 주어지면 숫자 만큼 문자열을 쪼개서 배열에 넣은 뒤 리턴하는 문제였다 slice와 for 문을 사용해서 풀었는데 처음에 조금 헤매서 문제 난이도에 비해 시간이 오래 걸렸다. 아래 풀이 영상에서는 정규표현식을 사용했다. 정규표현식을 특정 문자를 찾아 뭔가를 할 때 주로 사용하다 보니 이번 문제를 풀 때 떠올리지 못했다. 생각해보니 전화번호 xxx-xxxx-xxxx 나 카드번호 xxxx-.. 입력 인풋을 만들때 비슷한 정규표현식을 사용했었다! return str.match(new RegExp(`.{1, ${n}}`, 'g')) https://youtu.be/_hyCyqOVH-8

[TIL] 🤞Javascript 알고리즘 100일 챌린지 24번째 도전

문자열이 주어졌을때, 그 문자열 중에 한 번만 등장하는 문자들을 알파벳 순서대로 정렬된 문자열로 만들어 리턴하는 문제였다. 나는 frequency map 밖에 생각나지 않아서 아래처럼 풀었다. 반복문을 돌아야할 것 같아서 object 대신 map을 사용했다. 풀이를 보니 좀 더 간단한 두 가지 방법이 있었다. 하나는 split 활용하여 쪼갰을때 몇 개로 쪼개지는지에 따라 판별하는 방법(2개로 쪼개지면 한 번만 등장하는 문자이고 그 이상으로 쪼개지면 한 번 이상 등장하는 문자), 나머지 하나는 match 와 정규표현식을 사용하는 방법이었다. 나도 처음에 정규표현식을 떠올렸는데 거기서 더 나아가진 못했다. 이 문제는 꼭 다시 풀어봐야겠다. https://youtu.be/BgVt8YYrn7c

[TIL] Javascript 알고리즘 100일 챌린지 23번째 도전

정수 배열과 어떤 정수가 주어지면 그 배열에서 정수와 가장 가까운(차이가 적게 나는) 숫자를 찾아 리턴하는 문제였다. 요소를 하나씩 보면서 주어진 정수에서 뺀 다음에 Math.abs 를 사용해서 절대값으로 바꾼 다음 변수를 하나 만들어서 그 뺀 값을 기록해 두었다. 이미 있던 값보다 더 적은 값이 나오면 교체해주고. 나는 minus 변수를 처음 선언할때 문제에서 주어진 배열, 정수의 범위를 보고 999를 할당했던건데 Math.infinity 를 사용하면 가장 큰 숫자를 얻을 수 있다. 그리고 뺀 값이 같은 요소가 여러 개면 그 중 작은 것을 리턴해야 하기 때문에 아래처럼 if 문을 두었는데, 주어진 배열을 sort 먼저 해주면 if를 사용하지 않아도 된다. 다만 sort로 배열을 한번 봐주고, 반복문으로..

[TIL] Javascript 알고리즘 100일 챌린지 22번째 도전

세 개의 파라미터 i, j, k가 주어진다. i는 시작 숫자, j는 끝 숫자이다. 시작 숫자부터 끝 숫자까지 매 숫자에서 k 라는 숫자가 몇 번이나 등장 하는지 빈도 수의 총합을 리턴해야 한다. 나는 만약에 이 문제를 컴퓨터가 아닌 내가 풀어야 한다면 어떻게 할 지 고민해봤다. 나라면 시작 숫자, 끝 숫자 사이에 있는 숫자들을 일렬로 쫙 늘어놓은 다음에 k라는 숫자가 몇 번이나 등장하는지 세어나갈 것 같다. 아래 코드처럼 말이다. 그런데 split할때 그냥 빈 문자열 말고 k를 넣으면 k를 기준으로 배열로 쪼개지는데 그 배열의 요소 갯수가 결국 k가 등장하는 갯수가 된다. 굳이 filter로 한번 더 배열을 훑을 필요가 없게 된다. ! https://youtu.be/H_EYEPqvUhs

[TIL] Javascript 알고리즘 100일 챌린지 21번째 도전

주어진 숫자와 같거나 가장 가까운 팩토리얼의 값을 구하는 문제였다. 팩토리얼에 약해서 이 문제는 풀지 못했다 그리고 팩토리얼도 for 반복문으로만 생각하고 있었는데 while을 사용하면 좀 더 깔끔하게 코드를 작성할 수 있다. 해결 방법은 숫자를 하나씩 올려가면서 주어진 숫자보다 큰지 작은지 확인하면서 가장 가까운 팩토리얼을 찾는 것이 핵심이었다. https://youtu.be/SBsSM_Ckipo

[TIL] Javascript 알고리즘 100일 챌린지 20번째 도전

두 가지 문자열이 주어졌을때 서로 anagram인지 판별하는 문제다. 문자열의 각 문자 순서만 다르고 문자 구성은 같은것을 anagram이라고 한다. olleh와 hello 처럼.. 1. split, sort, join 으로 각 문자열을 정렬해주고 두 문자열이 같은지 확인 2. 해쉬맵을 이용하여 첫번째 문자열에 등장하는 문자의 빈도수를 기록한뒤 두 번째 문자열에서 각 문자를 하나씩 보면서 해쉬맵에서 찾을때마다 빈도수를 1씩 뺀다. 만약 해쉬맵에 없는 문자가 등장하거나 해쉬맵에 있어도 빈도수가 이미 0이면 anagram이 아니게 된다. function splitSortAndJoin(str) { return str.split('').sort().join(''); } function solution(befor..

[TIL] JavaScript 알고리즘 100일 챌린지 19번째 도전

주어진 문자열에서 중복되는 문자를 제거한 문자열을 리턴하는 문제였다. 자바스크립트에서 중복 제거! 하면 Set을 떠올리면 된다. (무슨 수능 강의 같다...) 그리고 indexOf와 와 반복문에서 사용할 수 있는 index를 비교하는 방법도 있고 object에 문자의 출현 갯수를 저장해서 사용하는 방법도 있다. 그러니까 코드로 보자면 아래처럼 세 가지 방법이 있겠다. 1. Set 2. indexOf와 index 비교해서 filter로 털어내기 3. frequency map 출현빈도 이렇게 알고리즘 문제라고 하는 것들을 풀다 보면 옛날에 수능 문제 푸는것 같은 느낌이 들 때가 많다 일단 해야해서, 안 하는것보단 나으니까 풀긴 푸는데 이걸 어디에 써먹을까 하는 느낌. 개발자는 비즈니스 문제를 풀어내는 사람들..