[LeetCode] 1512. Number Of Good Pairs

Updated:

Number Of Good Pairs

λ°°μ—΄ μ•ˆμ— 같은 숫자둜 이루어진 짝의 개수λ₯Ό λ°˜ν™˜ ν•˜λŠ” λ¬Έμ œμ΄λ‹€.


이 쀑 포문을 μ‚¬μš©ν•˜λ©΄ ν’€ 수 μžˆλ‹€. ν•˜μ§€λ§Œ 포문을 ν•œ 번만 μ‚¬μš©ν•΄μ„œλ„ ν’€ 수 μžˆλŠ”λ° μˆ˜ν•™μ μœΌλ‘œ μƒκ°ν•˜λŠ”κ²Œ μ°Έ λŒ€λ‹¨ν•œ 것 κ°™λ‹€.

import collections
from typing import List


class Solution:
	def numIdenticalPairs(self, nums: List[int]) -> int:
		pair_num = 0
		for i in range(len(nums)):
			for j in range(i + 1, len(nums)):
				if nums[i] == nums[j]:
					pair_num += 1
		return pair_num

		# d = collections.defaultdict(int)
		# for i in nums:
		# 	d[i] += 1
		# return sum(k * (k - 1) // 2 for k in d.values())

		# d = dict()
		# for i in nums:
		# 	try:
		# 		d[i] += 1
		# 	except KeyError:
		# 		d[i] = 1
		# return sum(k * (k - 1) // 2 for k in d.values())

collection 의 defaultdict λ₯Ό μ‚¬μš©ν•˜λ©΄ ν‚€κ°€ μ—†λŠ” 경우 미리 μ •ν•΄ λ‘” 값을 λ°˜ν™˜ν•œλ‹€.

μœ„μ—μ„œλŠ” defaultdict(int) 둜 ν•΄λ‘μ—ˆκΈ° λ•Œλ¬Έμ— ν‚€κ°€ μ—†λŠ” 경우 0 을 λ°˜ν™˜ν•œλ‹€.

포문을 ν•œ 번만 μ‚¬μš©ν•˜λŠ” 경우 μ΄λ ‡κ²Œ dict λ₯Ό λ§Œλ“€μ–΄ nums μ—μ„œ 주어진 각 숫자의 개수λ₯Ό μ„Όλ‹€.

그리고 κ·Έ μˆ«μžλ§ˆλ‹€ λ§Œλ“€ 수 μžˆλŠ” 짝의 수λ₯Ό κ³„μ‚°ν•œλ‹€. k * (k - 1) μ—μ„œ 2 λ₯Ό λ‚˜λˆ„μ–΄ μ€€ μ΄μœ λŠ” (i, j) , (j, i) 의 쀑볡을 μ œμ™Έν•˜κΈ° μœ„ν•¨μ΄λ‹€.

이 λ¬Έμ œμ—μ„  이쀑포문과 단일포문을 μ‚¬μš© ν•œ 경우 속도가 4ms 밖에 차이가 λ‚˜μ§€λŠ” μ•Šμ§€λ§Œ μ–΄λ–»κ²Œλ“  λ³΅μž‘λ„λ₯Ό μ€„μ΄λŠ”κ²Œ 제일 μ€‘μš”ν•˜λ‹€ !!!

μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ 그것을 μˆ˜ν•™μ μœΌλ‘œ λ°”κΏ€ 수 μžˆλŠ” λŠ₯λ ₯이 제일 λΆ€λŸ½λ‹€..


더 μΆ”κ°€λ‘œ 검색을 ν•΄λ³΄μ•˜λŠ”λ° collection 에 리슀트 μ›μ†Œ 개수λ₯Ό μ„Έμ£ΌλŠ” ν•¨μˆ˜κ°€ μžˆμ—ˆλ‹€. Counter() λ₯Ό μ‚¬μš© ν•˜λ©΄ λœλ‹€.

import collections


class Solution:
	def numIdenticalPairs(self, nums: List[int]) -> int:

		d = collections.Counter(nums)
		return sum(k * (k - 1) // 2 for k in d.values())

μœ„μ—μ„œ κ΅¬ν˜„ν–ˆλ˜ Counter() ν•¨μˆ˜κ°€ 이미 λ‚΄μž₯λ˜μ–΄ μžˆμ—ˆλ‹€. 이 μ½”λ“œλ‘œ μ œμΆœμ„ ν•˜λ©΄ λ©”λͺ¨λ¦¬ μ‚¬μš©μ€ λΉ„μŠ·ν•˜μ§€λ§Œ λŸ°νƒ€μž„μ΄ 24ms κ°€ λœλ‹€.


Categories:

Updated:

Leave a comment