Algorithm/JUNGOL

[정올] 618 : 구조체 - 자가진단6 (*)

Gyuri 2022. 1. 10. 01:13

문제

5명의 이름과 키, 몸무게를 입력받아 이름순으로 정렬하여 출력하고, 

몸무게가 무거운 순으로 정렬하여 출력하는 프로그램을 작성하시오. 

몸무게는 소수점이하 1자리까지 출력한다.

 

 

입력 예

Lee 150 35.6
Kim 155 28.9
Sin 148 32.7
Jung 160 41.2
Park 165 38.7

출력 예

name
Jung 160 41.2
Kim 155 28.9
Lee 150 35.6
Park 165 38.7
Sin 148 32.7

weight 
Jung 160 41.2 
Park 165 38.7 
Lee 150 35.6 
Sin 148 32.7 
Kim 155 28.9

 

코드

import java.util.*;

class School {
    String name;
    int height;
    float weight;
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        School s[] = new School[5];
        for(int i=0; i<s.length; i++) {
            s[i] = new School();
        }

        // 각 학생의 이름, 키 입력받기
        for(int i=0; i<5; i++) {
            s[i].name = sc.next();
            s[i].height = sc.nextInt();
            s[i].weight = sc.nextFloat();
        }

        // 이름순으로 정렬
        for(int i=0; i<5; i++) {
            for(int j=0; j<4-i; j++) {
                if(s[j].name.charAt(0) > s[j+1].name.charAt(0)) {
                    School temp = s[j+1];
                    s[j+1] = s[j];
                    s[j] = temp;
                }
            }
        }
        System.out.println("name");
        for(int k=0; k<5; k++) {
            System.out.printf("%s %d %.1f\n", s[k].name, s[k].height, s[k].weight);
        }
        System.out.println();

        // 키 순으로 정렬
        for(int i=0; i<5; i++) {
            for(int j=0; j<4-i; j++) {
                if(s[j].weight < s[j+1].weight) {
                    School temp = s[j+1];
                    s[j+1] = s[j];
                    s[j] = temp;
                }
            }
        }

        System.out.println("weight");
        for(int k=0; k<5; k++) {
            System.out.printf("%s %d %.1f\n", s[k].name, s[k].height, s[k].weight);
        }
    }
}

 이름순으로 정렬하는 부분을 처음에 아래와 같이 짰는데, 이렇게 코드를 짜게 되면 이름순대로 정렬은 되지만 엉뚱한 학생의 몸무게와 키가 저장되게 된다.

이름만 버블정렬로 정렬한 코드이기 때문에 몸무게와 키는 그대로 저장돼있다.

for(int i=0; i<5; i++) {
            for(int j=0; j<4-i; j++) {
                String temp = "";
                if(s[j].name.charAt(0) > s[j+1].name.charAt(0)) {
                    temp = s[j+1].name;
                    s[j+1].name = s[j].name;
                    s[j].name = temp;
            }
       }
}

 

따라서, temp 자체를 String 형으로 저장하는 것이 아니라 School로 선언을 하고

for(int i=0; i<5; i++) {
    for(int j=0; j<4-i; j++) {
        if(s[j].name.charAt(0) > s[j+1].name.charAt(0)) {
            School temp = s[j+1];
            s[j+1] = s[j];
            s[j] = temp;
        }
    }
}

이와 같이 이름 뿐만 아니라 배열 전체를 정렬시켜줘야 한다.

몸무게 순으로 정렬 또한 마찬가지로 이렇게 정렬시켜주면, 몸무게가 큰 사람 순서로 배열이 정렬되면서 해당 몸무게를 가진 학생의 이름과 키도 함께 정렬된다.