ํฐ์คํ ๋ฆฌ ๋ทฐ
[2018 KAKAO BLIND RECRUITMENT 1์ฐจ]๋ด์ค ํด๋ฌ์คํฐ๋ง_JS Set๊ณผ Map ๊ฐ์ฒด์ ํ์ฉ
choi95 2021. 10. 11. 15:59๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ด์ค ํด๋ฌ์คํฐ๋ง
์ฌ๋ฌ ์ธ๋ก ์ฌ์์ ์์์ง๋ ๋ด์ค, ํนํ ์๋ณด์ฑ ๋ด์ค๋ฅผ ๋ณด๋ฉด ๋น์ท๋น์ทํ ์ ๋ชฉ์ ๊ธฐ์ฌ๊ฐ ๋ง์ ์ ์ ํ์ํ ๊ธฐ์ฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต๋ค. Daum ๋ด์ค์ ๊ฐ๋ฐ ์ ๋ฌด๋ฅผ ๋งก๊ฒ ๋ ์ ์ ์ฌ์ ํ๋ธ๋ ์ฌ์ฉ์๋ค์ด ํธ๋ฆฌํ๊ฒ ๋ค์ํ ๋ด์ค๋ฅผ ์ฐพ์๋ณผ ์ ์๋๋ก ๋ฌธ์ ์ ์ ๊ฐ์ ํ๋ ์ ๋ฌด๋ฅผ ๋งก๊ฒ ๋์๋ค.
๊ฐ๋ฐ์ ๋ฐฉํฅ์ ์ก๊ธฐ ์ํด ํ๋ธ๋ ์ฐ์ ์ต๊ทผ ํ์ ๊ฐ ๋๊ณ ์๋ "์นด์นด์ค ์ ์ ๊ฐ๋ฐ์ ๊ณต์ฑ" ๊ด๋ จ ๊ธฐ์ฌ๋ฅผ ๊ฒ์ํด๋ณด์๋ค.
- ์นด์นด์ค ์ฒซ ๊ณต์ฑ..'๋ธ๋ผ์ธ๋' ๋ฐฉ์ ์ฑ์ฉ
- ์นด์นด์ค, ํฉ๋ณ ํ ์ฒซ ๊ณต์ฑ.. ๋ธ๋ผ์ธ๋ ์ ํ์ผ๋ก ๊ฐ๋ฐ์ ์ฑ์ฉ
- ์นด์นด์ค, ๋ธ๋ผ์ธ๋ ์ ํ์ผ๋ก ์ ์ ๊ฐ๋ฐ์ ๊ณต์ฑ
- ์นด์นด์ค ๊ณต์ฑ, ์ ์ ๊ฐ๋ฐ์ ์ฝ๋ฉ ๋ฅ๋ ฅ๋ง ๋ณธ๋ค
- ์นด์นด์ค, ์ ์ ๊ณต์ฑ.. "์ฝ๋ฉ ์ค๋ ฅ๋ง ๋ณธ๋ค"
- ์นด์นด์ค "์ฝ๋ฉ ๋ฅ๋ ฅ๋ง์ผ๋ก 2018 ์ ์ ๊ฐ๋ฐ์ ๋ฝ๋๋ค"
๊ธฐ์ฌ์ ์ ๋ชฉ์ ๊ธฐ์ค์ผ๋ก "๋ธ๋ผ์ธ๋ ์ ํ"์ ์ฃผ๋ชฉํ๋ ๊ธฐ์ฌ์ "์ฝ๋ฉ ํ ์คํธ"์ ์ฃผ๋ชฉํ๋ ๊ธฐ์ฌ๋ก ๋๋๋ ๊ฑธ ๋ฐ๊ฒฌํ๋ค. ํ๋ธ๋ ์ด๋ค์ ๊ฐ๊ฐ ๋ฌถ์ด์ ๋ณด์ฌ์ฃผ๋ฉด ์นด์นด์ค ๊ณต์ฑ ๊ด๋ จ ๊ธฐ์ฌ๋ฅผ ์ฐพ์๋ณด๋ ์ฌ์ฉ์์๊ฒ ์ ์ฉํ ๋ฏ์ถ์๋ค.
์ ์ฌํ ๊ธฐ์ฌ๋ฅผ ๋ฌถ๋ ๊ธฐ์ค์ ์ ํ๊ธฐ ์ํด์ ๋ ผ๋ฌธ๊ณผ ์๋ฃ๋ฅผ ์กฐ์ฌํ๋ ํ๋ธ๋ "์์นด๋ ์ ์ฌ๋"๋ผ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋๋ค.
์์นด๋ ์ ์ฌ๋๋ ์งํฉ ๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ฒ์ฌํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก ์๋ ค์ ธ ์๋ค. ๋ ์งํฉ A, B ์ฌ์ด์ ์์นด๋ ์ ์ฌ๋ J(A, B)๋ ๋ ์งํฉ์ ๊ต์งํฉ ํฌ๊ธฐ๋ฅผ ๋ ์งํฉ์ ํฉ์งํฉ ํฌ๊ธฐ๋ก ๋๋ ๊ฐ์ผ๋ก ์ ์๋๋ค.
์๋ฅผ ๋ค์ด ์งํฉ A = {1, 2, 3}, ์งํฉ B = {2, 3, 4}๋ผ๊ณ ํ ๋, ๊ต์งํฉ A โฉ B = {2, 3}, ํฉ์งํฉ A โช B = {1, 2, 3, 4}์ด ๋๋ฏ๋ก, ์งํฉ A, B ์ฌ์ด์ ์์นด๋ ์ ์ฌ๋ J(A, B) = 2/4 = 0.5๊ฐ ๋๋ค. ์งํฉ A์ ์งํฉ B๊ฐ ๋ชจ๋ ๊ณต์งํฉ์ผ ๊ฒฝ์ฐ์๋ ๋๋์ ์ด ์ ์๋์ง ์์ผ๋ ๋ฐ๋ก J(A, B) = 1๋ก ์ ์ํ๋ค.
์์นด๋ ์ ์ฌ๋๋ ์์์ ์ค๋ณต์ ํ์ฉํ๋ ๋ค์ค์งํฉ์ ๋ํด์ ํ์ฅํ ์ ์๋ค. ๋ค์ค์งํฉ A๋ ์์ "1"์ 3๊ฐ ๊ฐ์ง๊ณ ์๊ณ , ๋ค์ค์งํฉ B๋ ์์ "1"์ 5๊ฐ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์. ์ด ๋ค์ค์งํฉ์ ๊ต์งํฉ A โฉ B๋ ์์ "1"์ min(3, 5)์ธ 3๊ฐ, ํฉ์งํฉ A โช B๋ ์์ "1"์ max(3, 5)์ธ 5๊ฐ ๊ฐ์ง๊ฒ ๋๋ค. ๋ค์ค์งํฉ A = {1, 1, 2, 2, 3}, ๋ค์ค์งํฉ B = {1, 2, 2, 4, 5}๋ผ๊ณ ํ๋ฉด, ๊ต์งํฉ A โฉ B = {1, 2, 2}, ํฉ์งํฉ A โช B = {1, 1, 2, 2, 3, 4, 5}๊ฐ ๋๋ฏ๋ก, ์์นด๋ ์ ์ฌ๋ J(A, B) = 3/7, ์ฝ 0.42๊ฐ ๋๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด ์ฌ์ด์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋๋ฐ ์ด์ฉํ ์ ์๋ค. ๋ฌธ์์ด "FRANCE"์ "FRENCH"๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ๋ ๊ธ์์ฉ ๋์ด์ ๋ค์ค์งํฉ์ ๋ง๋ค ์ ์๋ค. ๊ฐ๊ฐ {FR, RA, AN, NC, CE}, {FR, RE, EN, NC, CH}๊ฐ ๋๋ฉฐ, ๊ต์งํฉ์ {FR, NC}, ํฉ์งํฉ์ {FR, RA, AN, NC, CE, RE, EN, CH}๊ฐ ๋๋ฏ๋ก, ๋ ๋ฌธ์์ด ์ฌ์ด์ ์์นด๋ ์ ์ฌ๋ J("FRANCE", "FRENCH") = 2/8 = 0.25๊ฐ ๋๋ค.
์ ๋ ฅ ํ์
- ์ ๋ ฅ์ผ๋ก๋ str1๊ณผ str2์ ๋ ๋ฌธ์์ด์ด ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์์ด์ ๊ธธ์ด๋ 2 ์ด์, 1,000 ์ดํ์ด๋ค.
- ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ฌธ์์ด์ ๋ ๊ธ์์ฉ ๋์ด์ ๋ค์ค์งํฉ์ ์์๋ก ๋ง๋ ๋ค. ์ด๋ ์๋ฌธ์๋ก ๋ ๊ธ์ ์๋ง ์ ํจํ๊ณ , ๊ธฐํ ๊ณต๋ฐฑ์ด๋ ์ซ์, ํน์ ๋ฌธ์๊ฐ ๋ค์ด์๋ ๊ฒฝ์ฐ๋ ๊ทธ ๊ธ์ ์์ ๋ฒ๋ฆฐ๋ค. ์๋ฅผ ๋ค์ด "ab+"๊ฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ฉด, "ab"๋ง ๋ค์ค์งํฉ์ ์์๋ก ์ผ๊ณ , "b+"๋ ๋ฒ๋ฆฐ๋ค.
- ๋ค์ค์งํฉ ์์ ์ฌ์ด๋ฅผ ๋น๊ตํ ๋, ๋๋ฌธ์์ ์๋ฌธ์์ ์ฐจ์ด๋ ๋ฌด์ํ๋ค. "AB"์ "Ab", "ab"๋ ๊ฐ์ ์์๋ก ์ทจ๊ธํ๋ค.
์ถ๋ ฅ ํ์
์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ ๋ฌธ์์ด์ ์์นด๋ ์ ์ฌ๋๋ฅผ ์ถ๋ ฅํ๋ค. ์ ์ฌ๋ ๊ฐ์ 0์์ 1 ์ฌ์ด์ ์ค์์ด๋ฏ๋ก, ์ด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ฝ๋๋ก 65536์ ๊ณฑํ ํ์ ์์์ ์๋๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ ์๋ถ๋ง ์ถ๋ ฅํ๋ค.
์์ ์ ์ถ๋ ฅ
str1str2answer
FRANCE | french | 16384 |
handshake | shake hands | 65536 |
aa1+aa2 | AAAA12 | 43690 |
E=M*C^2 | e=m*c^2 | 65536 |
๋ฌธ์ ํ์ด
๋ค์ค์งํฉ์ ๋ํด์ ๊ณต์งํฉ๊ณผ ํฉ์งํฉ์ ๋ค์ด๊ฐ ์์์ ๊ฐฏ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์๋ณํ๊ธฐ ์ํด Hash Map์ ์ฌ์ฉํ์๋ค.
- ๋ง์ฝ์ ๊ต์งํฉ์ผ ๊ฒฝ์ฐ์๋ ๋ ์งํฉ์ ๊ณตํต ์์์ ๊ฐฏ์ ์ค ์ต์๊ฐ์ด ๋ค์ด๊ฐ์ผ ํจ
- ๋ง์ฝ์ ํฉ์งํฉ์ผ ๊ฒฝ์ฐ์๋ ๋ ์งํฉ์ ๊ณตํต ์์์ ๊ฐฏ์ ์ค ์ต๋๊ฐ์ด ๋ค์ด๊ฐ์ผ ํจ
- ๋ง์ฝ์ ๊ณต์งํฉ์ผ ๊ฒฝ์ฐ์๋ ์์์ ๊ฐ 1์ ๋์ ํด์ค์ผ ํจ
์ฝ๋
function solution(str1, str2) {
let answer = 0;
let regExp = /^[a-zA-Z]*$/; // ๊ณต๋ฐฑ ๋ฌธ์, ํน์ ๋ฌธ์, ์ซ์ ์๋ณ
let n = Math.max(str1.length, str2.length);
let sH1 = new Map();
let sH2 = new Map();
for(let i = 0; i < n; i++) { // ๋ ์์ผ๋ก ๋ฌถ๋ ์ฐ์ฐ
if(str1[i + 1]) {
let s1 = (str1[i] + str1[i + 1]).toUpperCase();
if(regExp.test(s1)) {
if(!sH1.has(s1)) sH1.set(s1, 1);
else sH1.set(s1, sH1.get(s1) + 1);
}
}
if(str2[i + 1]) {
let s2 = (str2[i] + str2[i + 1]).toUpperCase();
if(regExp.test(s2)) {
if(!sH2.has(s2)) sH2.set(s2, 1);
else sH2.set(s2, sH2.get(s2) + 1);
}
}
}
let vacant = 0;
let union = 0;
for(let [key, val] of sH2) {
if(sH1.has(key)) { // ๊ณตํต ์์์ผ ๊ฒฝ์ฐ
vacant += sH1.get(key); // ์ต์๊ฐ ๋์
union += val; // ์ต๋๊ฐ ๋์
} else union += val; // ๊ณตํต ์์๊ฐ ์๋ ๊ฒฝ์ฐ
}
for(let [key, val] of sH1) { // ๋จ์ ์์ ๊ฐ์ฐ
if(!sH2.has(key)) union++;
}
(vacant || union) === 0 ? answer = 65536 : answer = parseInt((vacant / union) * 65536);
return answer;
}
์ค๋ต
์์ ์ผ์ด์ค๋ ๋ชจ๋ ํต๊ณผํ์ง๋ง ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ๋๋ ธ์ ๊ฒฝ์ฐ์ ๋ช ๊ฐ์ ์ผ์ด์ค์์ ์ค๋ต์ผ๋ก ์ฒ๋ฆฌ๋์๋ค.
์๋ง๋ ๊ต์งํฉ๊ณผ ํฉ์งํฉ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ์์ด์ ๋๋ฝ๋ ์ฐ์ฐ ๊ณผ์ ์ด ์์๋ ๊ฒ ๊ฐ๋ค.์ฌ์ค ์ฝ๋๋ฅผ ๋ค ์ง๊ณ ๋ณด๋ ๋จ์ ์์๋ค์ ๊ฐฏ์๋ฅผ ํฉ์งํฉ์ ๊ฐ์ฐํด์ฃผ๊ธฐ ์ํด ๋ฐ๋ณต๋ฌธ์ ํ ๋ฒ ๋ ์ํํ์๋๋ฐ, ์ด ๋ถ๋ถ์ด ๋ก์ง ์ ๋ถํ์ํ ๋ฟ๋ง ์๋๋ผ ์ ํํ์ง ๋ชป ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
JavaScript ์์์ ์งํฉ์ ๊ตฌํํ๋ ๋ฐ์ ์์ด์ Set ๊ฐ์ฒด๋ฅผ ํ๋ฒ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ๋ค์ ํ์ด๋ณด์๊ณ ๋ชจ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํต๊ณผํ ์ ์์๋ค.
ํด๋น ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ์ ์์ด์ ๊ฐ์ฅ ์ค์ํ๋ ์ ์ ์ค๋ณต์ ํ์ฉ์น ์์ ์์ ์งํฉ์ ์ฌ์ ์ ๋จผ์ ๊ตฌํด๋์ ๋ค, ํด๋น ์งํฉ์ ์์ ๊ฐ๋ค์ ๊ธฐ์กด์ ๋ฐฐ์ด ๊ฐ๋ค๊ณผ ๋น๊ตํ๋ฉด์ ํฉ์งํฉ์ ๋ค์ด๊ฐ ์์์ ๊ฐฏ์์ ๊ต์งํฉ์ ๋ค์ด๊ฐ ์์์ ๊ฐฏ์๋ฅผ ์๋ณํ๋ ๊ณผ์ ์ด์๋ ๊ฒ ๊ฐ๋ค.
set
- Set ๊ฐ์ฒด๋ ES6์์ ๋ฑ์ฅํ ์ค๋ณต์ ์ ๊ฑฐํ ๊ฐ๋ค์ ์งํฉ
- ์ ์ธ ๋ฐฉ์: let mySet = new Set()
์ฝ๋
function solution(str1, str2) {
let answer = 0;
let regExp = /^[a-zA-Z]*$/;
let n = Math.max(str1.length, str2.length);
let arr1 = [];
let arr2 = [];
let sH1 = new Map();
let sH2 = new Map();
for(let i = 0; i < n; i++) {
if(str1[i + 1]) {
let s1 = (str1[i] + str1[i + 1]).toUpperCase();
if(regExp.test(s1)) {
arr1.push(s1);
if(!sH1.has(s1)) sH1.set(s1, 1);
else sH1.set(s1, sH1.get(s1) + 1);
}
}
if(str2[i + 1]) {
let s2 = (str2[i] + str2[i + 1]).toUpperCase();
if(regExp.test(s2)) {
arr2.push(s2);
if(!sH2.has(s2)) sH2.set(s2, 1);
else sH2.set(s2, sH2.get(s2) + 1);
}
}
}
let intersection = 0;
let union = 0;
let set = new Set(arr1.concat(arr2));
set.forEach(elem => {
let tmp1 = sH1.has(elem) ? sH1.get(elem) : 0; // ํด๋น ๊ฐ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ๊ณ ์๋ค๋ฉด ํด๋น ๊ฐ์ value๋ฅผ ํ ๋น
let tmp2 = sH2.has(elem) ? sH2.get(elem) : 0;
intersection += Math.min(tmp1, tmp2); // ๊ต์งํฉ์ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ ์ค ์์์ ์ต์ ๊ฐฏ์๊ฐ ํ ๋น๋์ด์ผ ํจ
union += Math.max(tmp1, tmp2); // ํฉ์งํฉ์ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ ์ค ์์์ ์ต๋ ๊ฐฏ์๊ฐ ํ ๋น๋์ด์ผ ํจ
})
!(intersection || union) ? answer = 65536 : answer = parseInt(intersection / union * 65536);
return answer;
}
'์๊ณ ๋ฆฌ์ฆ > ๊ธฐ์ถ ๋ฐ ๋ฐฑ์ค ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค_์๊ฐ ์ฝ๋ ์ฑ๋ฆฐ์ง]์ผ๊ฐ ๋ฌํฝ์ด (0) | 2021.10.30 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค_์ํด๋ฆฌ ์ฑ๋ฆฐ์ง 6์ฃผ์ฐจ] ๋ณต์ ์ ๋ ฌํ๊ธฐ (0) | 2021.10.16 |
[์๊ฐ ์ฝ๋ ์ฑ๋ฆฐ์ง ์์ฆ2]๊ดํธ ํ์ ํ๊ธฐ (0) | 2021.10.09 |
[2020 KAKAO BLIND RECRUITMENT]๋ฌธ์์ด ์์ถ_์ ๊ท ํํ์์ ๋ณ์ ํ ๋น (0) | 2021.09.02 |
[2018 KAKAO BLIND RECRUITMENT]๋น๋ฐ์ง๋ (0) | 2021.09.01 |