μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€_2023

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] Lv1. κ°€μž₯ κ°€κΉŒμš΄ 같은 κΈ€μž

초보보 ν˜œμ§„ 2023. 2. 7. 13:56
728x90

문제 μ„€λͺ…

λ¬Έμžμ—΄ sκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, s의 각 μœ„μΉ˜λ§ˆλ‹€ μžμ‹ λ³΄λ‹€ μ•žμ— λ‚˜μ™”μœΌλ©΄μ„œ, μžμ‹ κ³Ό κ°€μž₯ κ°€κΉŒμš΄ 곳에 μžˆλŠ” 같은 κΈ€μžκ°€ μ–΄λ”” μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, s="banana"라고 ν•  λ•Œ,  각 κΈ€μžλ“€μ„ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ 읽어 λ‚˜κ°€λ©΄μ„œ λ‹€μŒκ³Ό 같이 μ§„ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • bλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— 같은 κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— 같은 κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • n은 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— 같은 κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μžμ‹ λ³΄λ‹€ 두 μΉΈ μ•žμ— aκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • n도 μžμ‹ λ³΄λ‹€ 두 μΉΈ μ•žμ— n이 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μžμ‹ λ³΄λ‹€ 두 μΉΈ, λ„€ μΉΈ μ•žμ— aκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 쀑 κ°€κΉŒμš΄ 것은 두 μΉΈ μ•žμ΄κ³ , μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ΅œμ’… 결과물은 [-1, -1, -1, 2, 2, 2]κ°€ λ©λ‹ˆλ‹€.

λ¬Έμžμ—΄ s이 μ£Όμ–΄μ§ˆ λ•Œ, μœ„μ™€ 같이 μ •μ˜λœ 연산을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜ solution을 μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­
  • 1 ≤ s의 길이 ≤ 10,000
    • s은 μ˜μ–΄ μ†Œλ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예
s                                                                   result
"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
μ§€λ¬Έκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2
μ„€λͺ… μƒλž΅

 

 

λ‚˜μ˜ 풀이

public int[] solution(String s) {
   int[] answer = new int[s.length()];
   
   HashMap<String, Integer> map = new HashMap<>();
   String[] split = s.split("");
   
   for (int i = 0; i< split.length; i++)
   {
      Integer integer = map.get(split[i]);
      if (integer == null) {
         answer[i] = -1;
      }else {
         answer[i] = i - integer;
      }
      map.put(split[i], i);
   }
   return answer;
}

λ‚˜λŠ” μš°μ„  HashMap에닀가 key κ°’μœΌλ‘œ μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ„ μͺΌκ°  값을 λ‹΄κ³ , κ·Έ λ¬Έμžμ—΄μ˜ μœ„μΉ˜λ₯Ό λ‹΄μ•„μ„œ 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€. 

 

μš°μ„  λ¬Έμžμ—΄μ„ μͺΌκ°œμ£Όκ³ , λ§Œμ•½ mapμ—μ„œ key 둜 κΊΌλƒˆμ„ λ•Œ integer κ°€ null이면 첫번째 κΈ€μžλΌλŠ” 뜻이기 λ•Œλ¬Έμ— answer λ°°μ—΄μ—λŠ” -1을 λ„£μ–΄μ£Όκ³ ,

 

λ§Œμ•½ null 이 μ•„λ‹ˆλΌλ©΄ 첫번째 κΈ€μžκ°€ μ•„λ‹ˆλΌλŠ” 뜻이기 λ•Œλ¬Έμ— answer에 μͺΌκ°  λ¬Έμžμ—΄μ˜ μœ„μΉ˜μΈ i와 mapμ—μ„œ κΊΌλ‚Έ μœ„μΉ˜ iλ₯Ό λΊ€ 값을 넣어쀬닀. 

 

그리고 λ§Œμ•½ banana처럼 aκ°€ λ‘λ²ˆμ§Έ, 4λ²ˆμ§Έμ— μœ„μΉ˜ν•˜κ³  μžˆλŠ” 경우λ₯Ό μœ„ν•΄μ„œ mapμ—λŠ” λ§ˆμ§€λ§‰ 값을 넣어주도둝 ν–ˆλ‹€. 

 

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

public int[] otherSolution(String s)
{
   int[] answer = new int[s.length()];
   
   HashMap<Character, Integer> map = new HashMap<>();
   for (int i =0; i< s.length(); i++)
   {
      char c = s.charAt(i);
      answer[i] = i - map.getOrDefault(c, i + 1);
      map.put(c, i);
   }
   
   return answer;
}

λ‚˜λž‘ 방식 HashMap을 μ‚¬μš©ν•΄μ„œ λΉ„μŠ·ν•˜κ²Œ ν–ˆλŠ”λ° Characterλ₯Ό μ‚¬μš©ν•΄μ„œ ν‘Ό 풀이가 μžˆμ–΄μ„œ κ°€μ Έμ™”λ‹€. 

그리고 λ‚˜λŠ” getOrDefaultλ₯Ό κΈ°μ–΅ λͺ»ν•΄μ„œ λΆ„κΈ°μ²˜λ¦¬λ‘œ ν–ˆλŠ”λ°... 이걸 μ•Œμ•˜λ”λΌλ©΄ 더 κ°„λ‹¨ν•˜κ²Œ ν’€ 수 μžˆμ—ˆμ„ 것이닀 γ… γ…  

 

 

πŸ‘Ύ getOrDefault (key, DefaultValue) 

: μ°ΎλŠ” ν‚€κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ μ°ΎλŠ” ν‚€μ˜ 값을 λ°˜ν™˜ν•˜κ³  μ—†λ‹€λ©΄ κΈ°λ³Έ 값을 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ 

key - 값을 가져와야 ν•˜λŠ” μš”μ†Œμ˜ ν‚€ 

defaultValue - μ§€μ •λœ ν‚€λ‘œ λ§€ν•‘λœ 값이 μ—†λŠ” 경우 λ°˜ν™˜λ˜μ–΄μ•Ό ν•˜λŠ” κΈ°λ³Έκ°’ 

 

getOrDefaultλ₯Ό μ‚¬μš©ν•΄μ„œ c λ¬Έμžμ—΄μ΄ 있으면 κ·Έ λ¬Έμžμ—΄ μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•˜κ³  i - 1 값을 answer에 λ„£μ–΄μ£Όμ§€λ§Œ, 

λ§Œμ•½ μ—†λ‹€λ©΄ i+1 값을 λ°˜ν™˜ν•˜κ³  κ·Έ 값을 i와 λΉΌμ€€λ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90