본문 바로가기
Dev/Java

12. 그룹 알고리즘 (Group Algorithm)

by vellahw 2022. 8. 8.
//[?] 컬렉션 형태의 데이터를 특정 키 값으로 크룹화
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class GroupAlgorithm2 {
    /**
     * 테스트용 레코드 클래스
     */
    public static class Record {
        private final String name; // 상품명
        private final int quantity; // (int: 상수) 수량
    
        public Record (String name, int quantity) {
            this.name = name;
            this.quantity = quantity;   // 초기화 
        }

        // name, quantity의 속성 만들기 => get
        public String getName() {
            return name;
        }

        public int getQuantity() {
            return quantity;
        }
    }

    //[0][1] 테스트용 데이터 채우기용 로컬 함수
    public static List<Record> getAll() {
        return Arrays.asList(
            new Record("Radio", 3),
            new Record("TV", 1),
            new Record("Radio", 2),
            new Record("DVD", 4)
        );
    }

    //[0][2] 컬렉션 데이터 출력용 로컬 함수
    public static void printData(String message, List<Record> data) {
        System.out.println(message);
        for (Record item : data) {
            System.out.println(String.format("%5s - %d", item.getName(), item.getQuantity()));
        }
    }

    public static void main(String[] args) {
        //[1] Input
        List<Record> records = getAll(); // 입력 데이터
        List<Record> groups = new ArrayList<Record>(); // 출력 데이터
        int N = records.size(); // 의사코드

        //[2] Process (SORT -> SUM -> GROUP)
        //[A] 그룹 정렬: SORT
        for (int i = 0; i < N - 1; i++) {
            for (int j = i + 1; j < N; j++) {
                if (records.get(i).getName().compareTo(records.get(j).getName()) > 0) {
                    Record t = records.get(i);
                    records.set(i, records.get(j));
                    records.set(j, t);
                }
            }
        }

        //[B] 그룹 소계: GROUP
        int subtotal = 0; // 소계
        for (int i = 0; i < N; i++) {
            subtotal += records.get(i).getQuantity(); // 같은 상품명의 판매량 누적 (SUM)
            if ((i + 1) == N || // 단락이면 아래 조건 무시
            (records.get(i).getName() != records.get(i + 1).getName())) {
                //[!] 다음 레코드가 없거나 현재 레코드와 다음 레코드가 다르면 저장
                Record r = new Record(records.get(i).getName(), subtotal);
                groups.add(r); // 하나의 그룹 저장

                subtotal = 0; // 하나의 그룹이 완료 되면 소계 초기화
            }
        }

        //[3] Output
        printData("[1] 정렬된 원본 데이터:", records);
        printData("[2] 이름으로 그룹화된 원본 데이터:", groups);
    }
}

출력: 

[1] 정렬된 원본 데이터:
  DVD - 4
Radio - 2
Radio - 3
   TV - 1
[2] 이름으로 그룹화된 원본 데이터:
  DVD - 4
Radio - 5
   TV - 1

'Dev > Java' 카테고리의 다른 글

<jsp:include> 액션 태그  (0) 2022.09.01
객체 지향 프로그래밍  (0) 2022.08.26
11. 최빈값 알고리즘(Mode Algorithm)  (0) 2022.08.08
10. 병합 알고리즘(Merge Algorithm)  (0) 2022.08.08
9. 검색 알고리즘(Search Algorithm)  (0) 2022.08.08

댓글