[TIL] 항해99 9일차
알고리즘 주
오늘 주된 내용은 아마 hash, 정규표현식이 될 것 같다!
ㅠㅠ 근데 오늘 문제 풀다가 너무 멘붕... 나만 못하는 것 같고, 너무 들입다 풀어서 시간은 오래걸리는데 비효율적이고.... ㅠㅠ
그냥 많이 풀어보는 게 답이겠지?
자료구조 공부하고 많이 많이 풀어봐보자! 1시간 이상 안되면 무조건 답 보기도!
1. Hash
해석하자면 사람 이름 값을 key로 두고 그 value에 1을 더하는 식으로 구현한 문제이다. (나중에 for를 한 번 더 돌면서 -1 하면서 1이 남아있는 key값이 완주못한 선수인 것)
나중에 써먹기 좋겠다라는 건 알겠는데, hash가 무엇인지는 사실 잘 모르겠다.
그래서 hash에 대해 좀 알아봐야겠다.
1) Hash의 정의
해시 함수는 임의의 길이를 가지는 임의의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 이때 이 함수가 뱉어내는 결과물을 해시(Hash)라고 부른다.
해싱을 해서 보내기 때문에 해싱만 보고 인자로 어떤 값을 받았는지 추측하기 힘들다는 특징이 있다.
[참고 및 출처] https://evan-moon.github.io/2019/06/25/hashtable-with-js/
- 해시테이블
해시 테이블은 해시 함수를 활용해서 키 값에 인덱스를 배정하고, 인덱스의 값에 데이터를 넣는 자료 구조를 말합니다. 그리고 해시란, 키와 값이 한 쌍으로 구성된 데이터를 말합니다
출처: https://overcome-the-limits.tistory.com/entry/자료구조-해시테이블-with-JavaScript [Plus Ultra]
지금 봤는데.. 너무 어려운 것 같은데.... 코드로 이해하는 것이 더 빠를 것 같다. 일단 문제에서도 키 값에 인덱스 저장하고 value에 데이터 넣는 식으로 풀어는 보긴 했다.
hash를 사용하는 문제 (완주하지 못한 선수)
function solutionHash(participant, completion) {
let hashed = []
participant.forEach((entry) => {
// 사람 이름을 key 값으로 배열에 저장한다.
// 그리고 그 사람이름이 만약에 배열에 이미 있으면 1을 더해주고
// 아니면 그냥 1
// 그러면 사람 모두가 1이상의 수를 가지게 된다 (동명이인이면 2이상)
hashed[entry] = hashed[entry] ? hashed[entry] + 1 : 1
})
// completion을 돌면서
// hashed key값을 돌면서 1씩 빼준다(완주했다는 것을 의미)
completion.forEach((entry) => {
hashed[entry] = hashed[entry] - 1
})
// 만약 1이 안빠졌으면(2에서 1이 되었든 1인데 안사라졌든)
// 그 사람이 완주 못한 것!
for (let key in hashed) {
if (hashed[key] >= 1) return key
}
}
내일이나 목요일에 자료구조 강의를 조금 들어봐야겠다.
2. 정규 표현식
정규표현식이란 문자열을 검색하고 대체하는 데에 사용 가능한 일종의 형식 언어(패턴)이다. 문자 검색부터 이메일, 패스워드 검사 등의 복잡한 문자 일치 기능 등을 정규식 패턴으로 빠르게 수행할 수 있다.
... 가독성은 진짜 떨어지긴 한다..ㅠㅠ 웬만하면 코드 보면 이해할 수 있을 정도는 될텐데.. 이건 진짜 모르겠어서 계속 공부를 해야할 것 같다고 생각했다.
정규표현식은 크게 다음과 같은 역할을 수행한다.
1. 문자 검색(search)
2. 문자 대체(replace)
3. 문자 추출(extract)
자바스크립트는 정규표현식이 직접 빌드되어 지원하는 것이 장점.
정규식 테스트 해보는 사이트가 있다고 한다.
표현을 적어도 안될 수 있기 때문에 항상 확인이 필요하니..
https://regex101.com/
1) 정규식 생성
// new RegExg(표현식, 플래그) // 생성자 함수 방식
const regexp2 = /^abc/gi;
// /표현식/플래그 // 리터럴 방식
2) 플래그
플래그 g는 ‘모든 문자를 검색하겠다’라는 의미로 사용되었습니다.
따라서 g가 없는 표현식은 하나의(최초의) 검색 결과만 반환했고 g가 있는 표현식은 모든 검색 결과를 배열로 반환했습니다.
일단 구성은 이 정도이고, 계속 사용해보면서 보아야 할 것 같다.
문제에서 많이 나왔던 것이 .replace()인 듯 하다.
3. 배열 복사
예전에 검색해보다가 지나쳤던 용어들인 것 같다. 얉은 복사와 깊은 복사!
뭔 이상한 내용이지 했던 것 같은데 이제 이해를 미룰 수 없으니 공부해보기로 했다!
- 얉은 복사 (shallow copy)
사본을 따로 만들지 않고 원본을 참조하는 방식으로 복사(사실 복사가 아닌 것)
- string type은 복사 하고 복사본을 수정해도 원본은 변하지 않는다.
let str1 = 'original' let str2 = str1
str2 = 'copied'
를 하여도 str1의 내용은 바뀌지 않는 것.
하지만
- array는 얘기가 달라진다.
let arr1 = [1,2,3]
let arr2 = arr1
arr2[0] = 0
하면, arr1 또한 변경된다. arr2로 복사할 때 복사한 것이 아니라 참조값만 복사되었기 때문!! 변경되는 부분의 메모리는 같은 곳을 가리키고 있기 때문에 원본값도 바뀌게 되는 것이다.
2. 깊은 복사 (deep copy)
따라서 원본과 사본을 따로 나누는 완전한 복사가 필요하다.
- 배열의 깊은 복사
Array.prototype.slice() 사용하면 새로운 배열을 반환해준다.
[참고 및 출처] https://bbaktaeho-95.tistory.com/37
#### 4. 문자열 관련
1. Set 함수 (중복된 값 제거)
[...new Set(array)]
array에서 중복된 값들을 제거해준다. 이 함수도 알아두면 아주 좋을 것 같다.!!
Author And Source
이 문제에 관하여([TIL] 항해99 9일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jisu129/TIL-항해99-9일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)