본문 바로가기

DEVELOPMENT/JAVA

[JAVA] 연습문제 - 히스토그램(분포도) 만들기

문제

 

사용자에게 1 ~ 100 사이의 10개의 정수를 입력받고,

아래와 같이 각 정수의 범위에 해당하는 정수 개수를 출력하기

 1 ~ 10 : ****
11 ~ 20 : **
21 ~ 30 : *
31 ~ 40 : 
41 ~ 50 : **
51 ~ 60 :
61 ~ 70 :
71 ~ 80 :
81 ~ 90 :
91 ~ 100 : *

 

 

풀이순서

 

1. 범위 배열 생성

2. 반복해서 정수 입력받기

3. 입력받는 값이 1 ~ 100 사이와 아닌 경우 나누기

4. 입력받는 값의 범위에 해당하는 범위 배열에 * 더해주기

5. 히스토그램 출력 

 

 

 

전체코드

 

import java.util.Scanner;

public class Histogram2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] range = {"", "", "", "", "", "", "", "", "", ""};
        System.out.println("1 ~ 100 사이의 정수 10개 입력하세요.");

        for (int i = 1; i <= 10; i++) {
            System.out.print(i + "번째 정수 입력: ");
            int input = scan.nextInt();
            if (1 <= input && input <= 100) {
                int index = (input - 1) / 10;
                range[index] += "*";
            } else {
                System.out.println("1 ~ 100 사이의 정수를 입력하세요.");
                i--;
            }
        }
        for (int i = 0; i < range.length; i++) {
            System.out.println((i * 10 + 1) + " ~ " + (i * 10 + 10) + " : " + range[i]);
        }
    }
}

 

 

풀이과정

 

 

1. 범위 배열 생성

 1 ~ 10 : ****  => range[0]
11 ~ 20 : **    => range[1]
21 ~ 30 : *     => range[2]
31 ~ 40 :       => range[3]
41 ~ 50 : ***   => range[4]
...
91 ~ 100 : *    => range[9]
String[] range = {"", "", "", "", "", "", "", "", "", ""};

 

위와 같이 범위 값을 배열로 만들어준다.

range[] 배열에 *의 값을 저장하기 위해 String 타입의 변수 생성해주고,  ""으로 값을 초기화해준다.

String 타입의 배열 생성 후 따로 초기화해주지 않으면, String의 기본값인 null로 초기화된다.

 

 

2. 반복해서 정수 입력받기

3. 입력받는 값이 1 ~ 100 사이와 아닌 경우 나누기

4. 입력받는 값의 범위에 해당하는 범위 배열에 * 더해주기

for (int i = 1; i <= 10; i++) {
    System.out.print(i + "번째 정수 입력: ");
    int input = scan.nextInt();
    if (1 <= input && input <= 100) {
        int index = (input - 1) / 10; // 입력받은 정수의 값으로 range 배열의 Index 값 구하기
        range[index] += "*";
    } else {
        System.out.println("1 ~ 100 사이의 정수를 입력하세요.");
        i--;
    }
}

 

input 이라는 변수를 만들어주고, 스캐너로 입력받은 값을 input에 저장한다.

input 의 범위를 1 ~ 100 인 경우와 그렇지 않은 경우로 나누어 if문을 만들어준다.

 

(1) input의 범위가 1 ~ 100 인 경우

input의 값에 따라 해당하는 range[] 배열에 "*" 더해주기 위해서 해당하는 range[] 배열의 index 값을 구한다.

range[] 배열의 index 값을 저장할 index 라는 변수를 만들어준다.

 

index = (input - 1) / 10

1 ~ 10 사이의 정수를 받았을 때 range 배열의 index 값인 0, 

11 ~ 20 사이의 정수를 받았을 때 range 배열의 index 값인 1, 

21 ~ 30 사이의 정수를 받았을 때 range 배열의 index 값인 2..

이런 형식으로 입력받는 값을 이용해 range 배열의 index 값을 만들기 위해서 input 값에 -1을 해주고 10을 나누어준다. 

1 ~ 10 의 범위의 모든 값에 -1을 각각 해주면 범위가 0 ~ 9이 되고, 정수끼리의 연산의 특징을 이용해 /10을 해주면 0이 된다.

 

range[index] += "*"

index를 range 배열의 index 값으로 해서 range[index]에 저장된 값에 "*"을 더해준다.

 

 

(2) input의 범위가 1 ~ 100 이 아닌 경우

잘못입력한 값을 제외하고 10개의 정수를 입력받아야 하므로, i의 값을 1 빼줘서 정수를 한번 더 입력받을 수 있게 해준다.

 

 

5. 히스토그램 출력 

for (int i = 0; i < range.length; i++) {
    System.out.println((i * 10 + 1) + " ~ " + (i * 10 + 10) + " : " + range[i]);

 

range 배열의 index 값을 구하는 과정의 반대로 index 값을 이용해 범위를 구해준다. 

i = 0 일 때, 1과 10이라는 숫자를 출력하기 위해서 (i * 10 + 1), (i * 10 + 10) 이라는 식을 세워준다.