JavaScript/JS_Algorithm

[인프런 - JS 알고리즘 문제풀이]아나그램 갯수문제(Hashing과 연관)

느리지만 꾸준하게 2021. 8. 5. 17:14

Hash

  • 어떤 크기가 정해진 키를(데이터) 고정된 크기의 값(value)로 변화시켜서 저장하는 것
  • 키에 대한 hash 값을 사용해서 값 저장하고 key value 갯수에 따라서 동적으로 크기가 증가하는 associate array
  • hash value를 구하는 과정을 hasing이라함. 이 Algorithm을 hash function이라고 함.
  • hash value 자체를 index로 사용해서 average time complexity가 O(1)로 굉장히 빠름 

Hash function

  • 원래 값이나 키를 색인하는데 사용되고, 그 값이 관련된 데이터가 검색될 때마다 사용된다.
  • 데이터의 효율적 관리를 목적. 임의의 길이 데이터를 고정된 길이의 데이터로 매핑하는 함수.
  • 계산이 단순하고 중복없이 해시값을 만들어 줄 수 있는 함수가 좋음(충돌이 일어나지 않을 수록 좋다.)
  • string을 받고 숫자를 반환하는 함수 (string에 대해 숫자를 mapping으로 할당)

hash function

Hashing

  • key 값에 직접 산술적인 연산 적용하고 항목이 저장되어 있는 테이블의 주소 계산해서 항목에 접근
  • mapping하는 과정 말한다.
  • hash table을 이용해서 searching

hashing procedure

hashing하는 과정

 

 

Hash table

해쉬함수를 사용하여 해시값으로 매핑하고 해시값을 색인(index) 또는 주소 삼아서 값(value)을 키와 함께 저장하는 자료구조

hash table

 

장점

  • 해시 충돌(hash collision) 발생 가능성이 있긴 하지만, 데이터를 적은 자원으로 관리할 수 있어서 유용하다.
  • 클라우드, 하드디크스에 존재하는 데이터(key)들은 무한에 가깝고 이것들은 몇 개의 해쉬값으로 매핑하면서 작은 크기의 캐시메모리로도 프로세스를 관리 할 수 있다.
  • index에 hash value를 사용하므로 데이터를 살피지 않아도 검색과 삽입/삭제를 빠르게 수행가능
  • index은 간단한 함수로 작동하므로 매우 효율적
  • 항상 동일한 hash value를 return하고 해당 색인만 알면 hash table의 크기에 상관없이 데이터에 빠르게 접근 가능
  • Data access시(Deletion, Insertion, Searching)시 time complexity는 O(1)을 지향함.

 

인프런 

s = bacaAacba

t = abc

abc의 구성이 bacaAacba안에서 존재할까 라는 문제이다.

lt rt가 순차적으로 진행되면서 SH(해쉬테이블)에 요소개수를 적고

 

tH(해쉬테이블)에 a b c 각 요소가 1개씩 들어있으니까 sH 해쉬테이블과 비교하면서 요소종류와 개수가 같으면 카운트 해준다.

<html>

<head>
	<meta charset="UTF-8">
	<title>출력결과</title>
</head>

<body>
	<script>
		function compareMaps(map1, map2) {
			// 아나그램이면 키의 사이즈가 같아야 한다.
			if (map1.size !== map2.size) return false;
			for (let [key, val] of map1) {
				// map2에는 없다면
				// key의 벨류값이 다르면
				// key값의 벨류값이 몇인가 가져오는 것
				if (!map2.has(key) || map2.get(key) !== val) return false;
			}
			return true;
		}
function solution(s, t) {
			let answer = 0;
			// 두 개를 만든다.
			let tH = new Map();
			let sH = new Map();
			// x라는게 있으면 x값에다가 + 1해서 카운팅해라
			for (let x of t) {
				if (tH.has(x)) tH.set(x, tH.get(x) + 1);
				else tH.set(x, 1);
			}
// t개수 하나 적게 돌면서 세팅
			let len = t.length - 1;
			for (let i = 0; i < len; i++) {
				if (sH.has(s[i])) sH.set(s[i], sH.get(s[i]) + 1);
				else sH.set(s[i], 1);
			}
// lt를 0으로 해주고 for문이 투포인터하면서 슬라이딩 윈도우까지 밀고 가는 것
			// 슬라이딩 윈도우는 rt끝나면 끝난다.
			let lt = 0;
			for (let rt = len; rt < s.length; rt++) {
				if (sH.has(s[rt])) sH.set(s[rt], sH.get(s[rt]) + 1);
				else sH.set(s[rt], 1);
				if (compareMaps(sH, tH)) answer++;
				// 빼고 추가 비교(if lt => if rt => copareMaps)
				sH.set(s[lt], sH.get(s[lt]) - 1)
				if (sH.get(s[lt]) === 0) sH.delete(s[lt]);
				lt++;
			}
			return answer;
		
        }

		let a = "bacaAacba";
		let b = "abc";
		console.log(solution(a, b));
	</script>
</body>

</html>

 

 

 

<출처 : 자바스크립트 알고리즘 문제풀이(코딩테스트 대비): 김태원>

참고:

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard

 

자바스크립트 알고리즘 문제풀이(코딩테스트 대비) - 인프런 | 강의

자바스크립트(JavaScript)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 재미있게 풀 수 있는 기초 단계 문제부터 고급 알고리즘까지 단계별로 차근차근 배우도록 설계된 강좌입니다., 개발

www.inflearn.com

https://coding-sojin2.tistory.com/entry/%ED%95%B4%EC%8B%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-hash-algorithm

 

해시 알고리즘 (hash algorithm)

오늘은 해시에 대해서 알아보도록 하겠습니다. Hash 임의의 크기를 가진 데이터(Key)를 고정된 크기의 데이터(Value)로 변화시켜 저장하는 것 키에 대한 해시 값을 사용하여 값을 저장하고 키-값 쌍

coding-sojin2.tistory.com

https://jahyun-dev.github.io/posts/cryptocurrency-1/

 

암호화폐 스터디 1 : Hash Function - DEV LOG

 

jahyun-dev.github.io

https://power-overwhelming.tistory.com/42

 

[자료구조/알고리즘] 해시(Hash) 란?

Hash 개념 임의의 크기를 가진 데이터(Key)를 고정된 크기의 데이터(Value)로 변화시켜 저장하는 것 키에 대한 해시값을 사용하여 값을 저장하고 키-값 쌍의 갯수에 따라 동적으로 크기가 증가하는 a

power-overwhelming.tistory.com