본문 바로가기
study/CodingTest

그룹 알고리즘 w/파이썬

by 고기만두(개발자) 2023. 5. 29. 10:49
728x90
반응형

특정 키값에 해당하는 그룹화된 합계 리스트를 만든다

항목명 수량
RADIO 3
TV 1
RADIO 2
DVD 4

이런 식으로 중구난방으로 흩어진 값인데

항목명 수량
DVD 4
RADIO 5
TV 1

수량을 항목별로 더해서 합계를 내고, 정렬하고 싶다.

어차피 문자도 아스키 코드값 따라가니까 우리가 아는 그 사전 순서대로 정렬이 될거고,

정렬은 똑같이 진행하면 되는데

같은 상품명일 때 수량을 누적합계 내고

다음 항목과 다르거나, 마지막이면 저장.

#그룹 알고리즘: 특정 키값에 해당하는 그룹화된 합계 리스트 만들기
#[?] 컬렉션형태의 데이터를 특정 키값으로 그룹화

#테스트용 레코드클래스
class Record():
	def __init__(self, name, quantity):
		self.name = name #상품명
		self.quantity = quantity #수량


def main():
	#[1] input
	records = [Record("RADIO",3), Record("TV",1), Record("RADIO",2), Record("DVD",4)]
	groups = [] #출력데이터
	n = len(records)

	#[2] process : group algorithm - sort -> sum -> group
	#[a] sort
	for i in range (n-1):
		for j in range( i+1, n):
			if (records[i].name > records[j].name):
				temp = records[i]
				records[i] = records[j]
				records[j] = temp #swap

	#[b] group
	subtotal = 0 #소계 변수초기화
	for i in range(n):
		subtotal = subtotal + records[i].quantity #같은 상품명의 수량을 누적
		#다음 레코드가 없거나, 현재레코드와 다음레코드가 다르면 저장
		if (((i+1) == n) or (records[i].name != records[i+1].name)) :
			#한 그룹의 키값을 지정하고 소계를 구함
			groups.append(Record(records[i].name, subtotal))
			subtotal = 0 #소계 초기화



	#[3] output
	print("[1] 정렬된 원본데이터 : ")
	for r in records:
		print(f"{r.name.rjust(6)} - {r.quantity}")

	print("[2] 이름으로 그룹화된 데이터 : ")
	for g in groups:
		print(f"{g.name.rjust(6)} - {g.quantity}")

main()
반응형

그런데, 이건 항목이 RADIO TV DVD 요렇게 3개뿐인 걸 알고 있는 상황에서 가능한 로직일 것 같고

현업에서의 나라면 아마 각 항목별로 변수 다 따로 따서 저장했든지 하지 않았을까..

물론 나의 업무 환경에서는 이미 DB에 친 값을 읽어오는 경우가 더 많을 것 같지만

만약 이런 식으로 계산을 해야 한다면 ㅇㅇ..

728x90
반응형

'study > CodingTest' 카테고리의 다른 글

큰 수의 법칙 w/파이썬  (0) 2023.08.21
최빈값 알고리즘 w/파이썬  (0) 2023.05.28
병합 알고리즘 w/파이썬  (0) 2023.05.21
이진 검색 알고리즘 w/파이썬  (0) 2023.05.20
파이썬 반복문 누적합계  (0) 2023.03.20

댓글