
[์ธํ๋ฐ ์น์
5] ๋ชจ๋ ์๋๊ทธ๋จ ์ฐพ๊ธฐ (Javascript)
์ ๋ฃ ๊ฐ์์ธ ๊ด๊ณ๋ก ๋ฌธ์ ์ค๋ช
์ ์๋ตํฉ๋๋ค.
โ๏ธIdea Sketch
2021-06-25
1. ๋ถ๋ถ๋ฌธ์์ด์ ์ผ์ผ์ด str.substring()์ผ๋ก ์๋ผ๋ด์ผํ๋? ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๋?
2. ๋ฌธ์์ด T๋ฅผ hash๋ก ์ ํ
3. 2๋ฒ๊ณผ ๋์์ ๋ฌธ์์ด S๋ฅผ ๋ฌธ์์ด T์ ๊ธธ์ด๋งํผ๋ง hash๋ก ์ ํ
| for (let i=0; i<len; i++) { |
| hashS.set(strS[i], (hashS.get(strS[i]) || 0) + 1); |
| hashT.set(strT[i], (hashT.get(strT[i]) || 0) + 1); |
| } |
์ฃผ์
์ด๊ธฐ๊ฐ hashS๊ฐ hashT์ ์ผ์นํ๋์ง ํ์ธํด์ผ ํจ
3. ๊ทธ ๋ค์ ๋ถ๋ถ๋ฌธ์์ด ๊ตฌํ๊ธฐ (hashS ์
๋ฐ์ดํธ)
- ๋ฐฉ๋ฒ 1. left, right ๋ณ์๋ฅผ ์ฌ์ฉํด hash.set(val, -1), hash.set(val, +1)
- ๋ฐฉ๋ฒ 2. ๋ณ์ i ํ๋๋ง ์ฌ์ฉํ์ฌ i๋ฒ์งธ ๋ฌธ์, i-len ์ฐ์ฐ
| hashS.set(strS[i], (hashS.get(strS[i]) || 0) + 1); |
| hashS.set(strS[i-len], hashS.get(strS[i]) - 1); |
5. hashS์ hashT์ ์ผ์น์ฌ๋ถ ํ์ธ
- true/false์ ๋ฐ๋ผ cnt++๋ฅผ ํ๊ธฐ ์ํด, isEquel() ํจ์ ์ ์
| function isEquel(hashS, hashT) { |
| for (let [key, val] of hashT) { |
| if (val !== hashS.get(key)) return false; |
| } |
| return true; |
| } |
| |
| if (isEquel(hashS, hashT)) cnt++; |
โ๏ธ์์ค์ฝ๋
2021-06-25
| function isEquel(hashS, hashT) { |
| for (let [key, val] of hashT) { |
| if (val !== hashS.get(key)) return false; |
| } |
| return true; |
| } |
| |
| function solution(strS, strT) { |
| let cnt = 0; |
| let hashS = new Map(), hashT = new Map(); |
| |
| let len = strT.length; |
| for (let i=0; i<len; i++) { |
| hashS.set(strS[i], (hashS.get(strS[i]) || 0) + 1); |
| hashT.set(strT[i], (hashT.get(strT[i]) || 0) + 1); |
| } |
| |
| if (isEquel(hashS, hashT)) cnt++; |
| |
| for (let i=len; i<strS.length; i++) { |
| hashS.set(strS[i], (hashS.get(strS[i]) || 0) + 1); |
| hashS.set(strS[i-len], hashS.get(strS[i-len]) - 1); |
| if(isEquel(hashS, hashT)) cnt++; |
| } |
| |
| return cnt; |
| } |