์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ์„น์…˜4. HashMap, TreeSet (ํ•ด์‰ฌ, ์ •๋ ฌ์ง€์› Set) : ๋ชจ๋“  ์•„๋‚˜๊ทธ๋žจ ์ฐพ๊ธฐ

2023. 10. 24. 13:31ใ†์ธํ”„๋Ÿฐ/์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„

728x90

 

https://hyejin.tistory.com/1229

 

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ์„น์…˜4. HashMap, TreeSet (ํ•ด์‰ฌ, ์ •๋ ฌ์ง€์› Set) : ๋งค์ถœ์•ก์˜ ์ข…๋ฅ˜

https://hyejin.tistory.com/1228 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ์„น์…˜4. HashMap, TreeSet (ํ•ด์‰ฌ, ์ •๋ ฌ์ง€์› Set) : ์•„๋‚˜๊ทธ๋žจ https://hyejin.tistory.com/1227 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ์„น์…˜4. HashMap, TreeSet (ํ•ด์‰ฌ, ์ •

hyejin.tistory.com

-> ์ด์ „ ๋ฌธ์ œ ํ’€์ด 

 

 

4. ๋ชจ๋“  ์•„๋‚˜๊ทธ๋žจ ์ฐพ๊ธฐ 

์„ค๋ช…

S๋ฌธ์ž์—ด์—์„œ T๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ด ๋˜๋Š” S์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์•„๋‚˜๊ทธ๋žจ ํŒ๋ณ„์‹œ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„๋ฌธ์ž์—ด์€ ์—ฐ์†๋œ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ž…๋ ฅ

์ฒซ ์ค„์— ์ฒซ ๋ฒˆ์งธ S๋ฌธ์ž์—ด์ด ์ž…๋ ฅ๋˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ค„์— T๋ฌธ์ž์—ด์ด ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.

S๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 10,000์„ ๋„˜์ง€ ์•Š์œผ๋ฉฐ, T๋ฌธ์ž์—ด์€ S๋ฌธ์ž์—ด๋ณด๋‹ค ๊ธธ์ด๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ถœ๋ ฅ

S๋‹จ์–ด์— T๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ด ๋˜๋Š” ๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ ์ž…๋ ฅ 1 

bacaAacba
abc

 

์˜ˆ์‹œ ์ถœ๋ ฅ 1

3

 

ํžŒํŠธ

์ถœ๋ ฅ์„ค๋ช…: {bac}, {acb}, {cba} 3๊ฐœ์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์ด "abc"๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด 1

public int solution(String s, String t)
{
   int answer = 0;
   HashMap<Character, Integer> map = new HashMap<>();
   HashMap<Character, Integer> map2 = new HashMap<>();
   char[] chars = s.toCharArray();
   
   for (int i = 0; i< t.length() - 1 ; i++)
   {
      map.put(chars[i], map.getOrDefault(chars[i], 0) + 1);
   }
   
   for (char c : t.toCharArray())
   {
      map2.put(c, map2.getOrDefault(c, 0) + 1);
   }
   
   
   int lt = 0;
   for (int i = t.length() -1; i< chars.length; i++)
   {
      int cnt = 0;
      map.put(chars[i], map.getOrDefault(chars[i], 0) + 1);
      for (char c : t.toCharArray())
      {
         if (map.containsKey(c)) {
            if (map.get(c) == map2.get(c)) {
               cnt++;
            } else {
               break;
            }
         } else
         {
            break;
         }
      }
      if (cnt == t.length())
      {
         answer++;
      }
      
      map.put(chars[lt], map.get(chars[lt]) - 1);
      if (map.get(chars[lt]) == 0) {
         map.remove(chars[lt]);
      }
      lt++;
   }
   
   
   return answer;
}

๐Ÿ‘ฉ‍๐Ÿ’ป : ์ด ๋ฌธ์ œ๋Š” ์ €๋ฒˆ ๋ฌธ์ œ ํ’€์ด๋ž‘ ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ฒŒ ํ’€๋ฉด ๋œ๋‹ค. 

๋จผ์ € String s์˜ ๋ฌธ์ž ๋ฐฐ์—ด์„ ํ†ตํ•ด map์— ๋ฌธ์ž๋ฅผ key๋กœ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐœ์ˆ˜๋ฅผ value๋กœ ๋‹ด์•„์ค€๋‹ค. (์ฒซ ์„ธํŒ…์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— t  ๋ฌธ์ž์—ด ๊ธธ์ด -1 ๊นŒ์ง€๋งŒ map์— ์šฐ์„  ๋„ฃ์–ด์ค€๋‹ค. -> ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ Sliding Window ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ) 

๋‹ค์Œ map2 ์—๋Š”  String t ๋ฌธ์ž ๋ฐฐ์—ด์„ ๋‹ด์•„์ค€๋‹ค. 

 

๋‹ค์Œ for๋ฌธ์„ ํ†ตํ•ด t๋ฌธ์ž์—ด ๊ธธ์ด - 1 ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด S์˜ ๊ธธ์ด๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ 

์šฐ์„  map์— chars[i]์˜ ๊ฐ’์„ key ๊ฐ’์œผ๋กœ getOrDefault๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ์—†์œผ๋ฉด 0 + 1 ์•„๋‹ˆ๋ฉด value + 1 ํ•˜๋„๋ก ํ•ด์ค€๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ์ผ๋‹จ t ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ map์— ๋„ฃ์–ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— t ๋ฌธ์ž์—ด๊ณผ ๋น„๊ต๋ฅผ ํ•ด์„œ ์•„๋‚˜๊ทธ๋žจ์ธ์ง€ ๋จผ์ € ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ 

for (char c : t.toCharArray())
{
   if (map.containsKey(c)) {
      if (map.get(c) == map2.get(c)) {
         cnt++;
      } else {
         break;
      }
   } else
   {
      break;
   }
}

๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ map์— c ๋ฌธ์ž๊ฐ€ key๋กœ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  map.get(c)์™€ map2.get(c)๊ฐ€ ๊ฐ™์œผ๋ฉด ์ž„์˜์˜ ๋ณ€์ˆ˜ cnt์˜ ๊ฐ’์„ +1 ์„ ํ•ด์ค€๋‹ค. key ๊ฐ€ ์—†๋‹ค๋Š” ๋ง์€ ์•„๋‚˜๊ทธ๋žจ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— break๋กœ ํ•ด๋‹น ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ ๋‚˜์˜ค๊ณ , map.get(c) ์™€ map2.get(c)๊ฐ€ ๊ฐ™์ง€ ์•Š์„ ๋•Œ๋„ key์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์•„๋‚˜๊ทธ๋žจ์ด ์•„๋‹ˆ๋‹ค. 

 

๋ฐ˜๋ณต๋ฌธ์„ ๋ชจ๋‘ ๋‹ค ๋Œ๊ณ  cnt์˜ ๊ฐ’์ด t๋ฌธ์ž์—ด์˜ ๊ธธ์ด์™€ ๊ฐ™์œผ๋ฉด answer์— +1 ์„ ํ•ด์ค€๋‹ค. ( ์•„๋‚˜๊ทธ๋žจ์ด๋ผ๋Š” ๋œป!) 

(key๊ฐ€ map์— ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ๊ฐœ์ˆ˜๋„ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ ! ) 

 

์ด๋ ‡๊ฒŒ answer์— +1 ํ•ด์ฃผ๊ณ  ๋‚˜๋ฉด ์ด์ œ ๋‹ค์Œ ๋ฌธ์ž๋กœ ๋„˜์–ด๊ฐ€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ „์˜ ๊ฐ’ (์ œ์ผ ์ฒซ๋ฒˆ์งธ ๊ฐ’)์€ ์ œ๊ฑฐํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

map.put(chars[lt], map.get(chars[lt]) - 1);
if (map.get(chars[lt]) == 0) {
   map.remove(chars[lt]);
}
lt++;

lt๋ฅผ ๊ธฐ์ค€์œผ๋กœ map์—์„œ ๊ฐ’์„ ๊บผ๋‚ด -1 ํ•ด์ฃผ๊ณ , ์ด ๊ฐ’์ด ๋งŒ์•ฝ 0 ์ด๋ฉด ์ด์ œ key ๊ฐ’๋„ remove ํ•ด์ค€๋‹ค. 

๊ทธ ๋‹ค์Œ lt ๋ฅผ +1 ํ•ด์ค€๋‹ค. (๊ทธ๋ž˜์•ผ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋กœ ์˜†์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ !!) 

 

 

๋‚˜๋Š” equals๋กœ HashMap์„ ๋น„๊ตํ•  ์ƒ๊ฐ์„ ๋ชปํ•ด์„œ ์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ key๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  get ํ•ด์„œ value๊ฐ’์„ ๋น„๊ตํ•ด์ค€ ๊ฒƒ์ด๋‹ค.. equals ์‚ฌ์šฉํ•˜๋ฉด 

for (char c : t.toCharArray())
{
   if (map.containsKey(c)) {
      if (map.get(c) == map2.get(c)) {
         cnt++;
      } else {
         break;
      }
   } else
   {
      break;
   }
}
if (cnt == t.length())
{
   answer++;
}

์ด ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.... ใ…Ž 

 

 

๋ฌธ์ œ ํ’€์ด 2

public int solution2(String a, String b)
{
   int answer = 0;
   HashMap<Character, Integer> am = new HashMap<>();
   HashMap<Character, Integer> bm = new HashMap<>();
   
   for (char c : b.toCharArray())
   {
      bm.put(c, bm.getOrDefault(c, 0) + 1);
   }
   int L = b.length() - 1;
   for (int i = 0; i < L; i++)
   {
      am.put(a.charAt(i), am.getOrDefault(a.charAt(i), 0) + 1);
   }
   
   int lt = 0;
   for (int rt = L; rt < a.length(); rt++)
   {
      am.put(a.charAt(rt), am.getOrDefault(a.charAt(rt), 0) + 1);
      
      if (am.equals(bm))
      {
         answer++;
      }
      am.put(a.charAt(lt), am.get(a.charAt(lt)) - 1);
      
      if (am.get(a.charAt(lt)) == 0) {
         am.remove(a.charAt(lt));
      }
      lt++;
   }
   
   
   
   
   return answer;
}

๐Ÿ‘พ : ๊ฐ•์‚ฌ๋‹˜๋„ ๋‚˜์™€ ํ’€์ด ๋ฐฉ์‹์€ ๋™์ผํ•œ๋ฐ ์—ฌ๊ธฐ์„œ ๊ฐ•์‚ฌ๋‹˜์€ HashMap์˜ equals๋ฅผ ์‚ฌ์šฉํ•ด์„œ am๊ณผ bm์„ ๋น„๊ตํ•ด์คฌ๋‹ค. 

am์€ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด a์˜ ๋Œ€ํ•ด ๋ฌธ์ž ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์„œ b ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜ -1 ์ „๊นŒ์ง€๋งŒ Map์˜ Key, ๊ทธ๋ฆฌ๊ณ  value (key ์˜ ๊ฐœ์ˆ˜)๋ฅผ ์ €์žฅํ•ด์คฌ๋‹ค. (์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋กœ ์˜†์œผ๋กœ ์ ์  ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๊ฐˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ!) 

bm์€ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด b์˜ ๋ฌธ์ž ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ Map์˜ Key, ๊ทธ๋ฆฌ๊ณ  value (key ์˜ ๊ฐœ์ˆ˜)๋ฅผ ์ €์žฅํ•ด์คฌ๋‹ค. 

HashMap<Character, Integer> am = new HashMap<>();
HashMap<Character, Integer> bm = new HashMap<>();

for (char c : b.toCharArray())
{
   bm.put(c, bm.getOrDefault(c, 0) + 1);
}
int L = b.length() - 1;
for (int i = 0; i < L; i++)
{
   am.put(a.charAt(i), am.getOrDefault(a.charAt(i), 0) + 1);
}

 

๊ทธ ๋‹ค์Œ์—๋Š” ์ด์ œ lt, rt ๋ฅผ ์ด์šฉํ•ด์„œ 

๋จผ์ € for๋ฌธ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ rt๋Š” a ๋ฌธ์ž์—ด ๊ธธ์ด๊นŒ์ง€ ์ญ‰์ญ‰ ์˜†์œผ๋กœ ํ•œ์นธ์”ฉ ๋„˜์–ด๊ฐ„๋‹ค. 

am์— put์„ a.charAt(rt) ๋ฅผ key ๊ฐ’์œผ๋กœ ํ•˜๋Š” value๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ value์— +1 ์•„๋‹ˆ๋ฉด 0 +1 ํ•ด์ค€๋‹ค. 

 

๋‹ค์Œ am๊ณผ bm ์„ eqauls๋กœ ๋น„๊ตํ•ด์„œ ๋‘˜์ด ๊ฐ™๋‹ค๋ฉด ์•„๋‚˜๊ทธ๋žจ์ด๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— answer + 1 ํ•ด์ค€๋‹ค. 

am.put(a.charAt(rt), am.getOrDefault(a.charAt(rt), 0) + 1);

if (am.equals(bm))
{
   answer++;
}

 

๊ทธ ๋‹ค์Œ ์ด์ œ rt ๊ฐ€ ์˜†์œผ๋กœ ๊ฐ€๊ธฐ์ „์— lt์˜ ๊ฐ’์„ ๋นผ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— map.get(a.charAt(lt))์˜ value ๊ฐ’์„ ๊ตฌํ•ด์„œ -1 ํ•ด์ค€๋‹ค. 

๊ทธ ๋‹ค์Œ ์ด key ๊ฐ’์˜ value๊ฐ€ 0 ์ด๋ฉด ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์œˆ๋„์šฐ์—์„œ ์—†๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— am ์—์„œ remove ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ lt ๊ฐ’์„ +1 ์ฆ๊ฐ€ ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

 

๐Ÿ˜ต ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋Š” ์ฐจ๊ทผ ์ฐจ๊ทผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ๋ ‡๊ฒŒ ์—„์ฒญ ์–ด๋ ค์šด ๋‚œ์ด๋„์˜ ๋ฌธ์ œ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค. 

lt ,  rt ์™€ ํ•จ๊ป˜ ํ•˜๋‚˜์”ฉ ์˜†์œผ๋กœ ๋ฐ€๋ฉด์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ๋น„๊ตํ•˜๊ณ  ์‚ญ์ œํ•˜๊ณ  ์ด ๊ณผ์ •์„ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค ! 

 

 

 

 

 

 

 

 

728x90