콘텐츠로 이동

미니 프로젝트 세트 5 모범답안: 날씨 관측소 리포트

완성 프로그램

import java.util.ArrayList;
import java.util.HashMap;

class WeatherStation {
    private ArrayList<String> dayOrder;
    private HashMap<String, Integer> readings;

    public WeatherStation() {
        dayOrder = new ArrayList<>();
        readings = new HashMap<>();
    }

    public void addReading(String day, int temperature) {
        dayOrder.add(day);
        readings.put(day, temperature);
    }

    public void printReport() {
        for (String day : dayOrder) {
            int temperature = readings.get(day);
            System.out.println(day + ": " + temperature + "C " + bar(temperature));
        }
    }

    public String bar(int temperature) {
        String result = "";

        for (int i = 0; i < temperature / 5; i++) {
            result += "#";
        }

        return result;
    }

    public double averageTemperature() {
        int total = 0;

        for (String day : dayOrder) {
            total += readings.get(day);
        }

        return (double) total / dayOrder.size();
    }

    public String hottestDay() {
        String bestDay = dayOrder.get(0);

        for (String day : dayOrder) {
            if (readings.get(day) > readings.get(bestDay)) {
                bestDay = day;
            }
        }

        return bestDay;
    }

    public int sunnyDays() {
        int count = 0;

        for (String day : dayOrder) {
            if (readings.get(day) >= 25) {
                count++;
            }
        }

        return count;
    }
}

public class Main {
    public static void main(String[] args) {
        WeatherStation station = new WeatherStation();

        station.addReading("Mon", 22);
        station.addReading("Tue", 26);
        station.addReading("Wed", 19);
        station.addReading("Thu", 26);
        station.addReading("Fri", 24);
        station.addReading("Sat", 31);
        station.addReading("Sun", 28);

        station.printReport();
        System.out.printf("Average temperature: %.2fC%n", station.averageTemperature());
        System.out.println("Hottest day: " + station.hottestDay());
        System.out.println("Sunny days: " + station.sunnyDays());
    }
}

출력

Mon: 22C ####
Tue: 26C #####
Wed: 19C ###
Thu: 26C #####
Fri: 24C ####
Sat: 31C ######
Sun: 28C #####
Average temperature: 25.14C
Hottest day: Sat
Sunny days: 4

핵심 포인트

  • dayOrder(ArrayList)는 기록 순서를 유지하고, readings(HashMap)는 요일 이름으로 빠르게 조회한다.
  • addReading이 두 컬렉션을 동시에 갱신해 항상 동기화를 유지한다.
  • bar 메서드는 정수 나눗셈을 활용한다. temperature / 5# 문자의 개수다.
  • hottestDay()는 첫 번째 날부터 시작하고 >를 사용해 기온이 같을 때 첫 번째 날을 유지한다.
  • 평균을 계산하기 전 double 형변환이 필요하다.