게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
최빈값 알고리즘과 2차원 배열의 문제...
게시물ID : programmer_1221짧은주소 복사하기
작성자 : 애널써커.
추천 : 0
조회수 : 4435회
댓글수 : 1개
등록시간 : 2014/02/14 08:33:12
import java.util.Collections;
import java.util.Scanner;
import java.util.Arrays;
import java.util.List;

public class Code {


public static void main(String[] args) 
{
int num1, num2, num3, num4, num5, sum, avg, max, min;
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter the first number:");
num1 = keyboard.nextInt();
System.out.println("Enter the seond number:");
num2 = keyboard.nextInt();
System.out.println("Enter the third number:");
num3 = keyboard.nextInt();
System.out.println("Enter the fourth number:");
num4 = keyboard.nextInt();
System.out.println("Enter the fifth number:");
num5 = keyboard.nextInt();
keyboard.close();
int[] num = new int[5]; // array named num is declared with 5 variables
num[0] = num1;
num[1] = num2;
num[2] = num3;
num[3] = num4;
num[4] = num5;
Arrays.sort(num);
int n1 = num[0];
int n2 = num[1];
int n3 = num[2];
int n4 = num[3];
int n5 = num[4];
List<Integer> index1 = Arrays.asList( n1, n2, n3, n4, n5);
int occurrences1 = Collections.frequency(index1, n1);
   
    List<Integer> index2 = Arrays.asList( n1, n2, n3, n4, n5);
int occurrences2 = Collections.frequency(index2, n2);
       
    List<Integer> index3 = Arrays.asList( n1, n2, n3, n4, n5);
int occurrences3 = Collections.frequency(index3, n3);
       
List<Integer> index4 = Arrays.asList( n1, n2, n3, n4, n5);
int occurrences4 = Collections.frequency(index4, n4);
       
List<Integer> index5 = Arrays.asList( n1, n2, n3, n4, n5);
int occurrences5 = Collections.frequency(index5, n5);
       
  int [][] nums = new int [5][2];
  nums [0][0] = n1;
nums [1][0] = n2;
nums [2][0] = n3;
nums [3][0] = n4;
nums [4][0] = n5;
    nums [0][1] = occurrences1;
    nums [1][1] = occurrences2;
    nums [2][1] = occurrences3;
    nums [3][1] = occurrences4;
    nums [4][1] = occurrences5;
    int maxOccurrences = Math.max(Math.max(Math.max(Math.max(occurrences1, occurrences2),occurrences3),occurrences4),occurrences5);
   
    for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    if (nums[i][j] == maxOccurrences) {
    int mode = nums [i][j-1];
    System.out.println("Mode: " + mode);
    }
  }
    }
   
    sum = (int)(num1 + num2 + num3 + num4 + num5);
avg = (int)(sum/5);
max = Math.max(Math.max(Math.max(Math.max(num1, num2),num3),num4),num5);
min = Math.min(Math.min(Math.min(Math.min(num1, num2),num3),num4),num5);

System.out.println(" ");
System.out.println("Sum:" + sum);
System.out.println("Avg:" + avg);
System.out.println("Max:" + max);
System.out.println("Min:" + min);
System.out.println("Median:" + num[2]);
}
}




제가 짠 코드인데요... 갓 시작한 학생이라 아직 자바 2차원 배열이나 루프개념이나 이해가 안가는 부분이 있습니다.
20~30시간정도 mode (최빈값; 가장 빈도가 많은 값)을 찾는 알고리즘을 만들기 위해서 끊임 없이 stack overflow를
뒤졌는데도 해답이 안나와서 여쭙습니다.

빨간색으로 되어져있는 부분이 최빈값을 찾아내는 알고리즘인데요.
최빈값을 구하기는 했으나 문제되는 부분이 많이 있습니다..ㅠㅠ

빨간 부분의 구조가 어떻게 되어있냐면,
프로그램 사용자가 5가지의 숫자를 어떤 순서로던지 입력을 합니다. (예: 12, 16, 18, 12, 16)
이렇게 입력이 된 숫자를 num이란 배열로 num[0]~num[4] 까지 최소값에서 최대값으로 정렬을 시켜주구요.
ArrayList index1 에서 index5에 occurrences1~occurrences5 변수에 각 5가지의 숫자에 해당되는 빈수를 저장합니다.
다시 num[0] ~ num[4]를 n1~n5 라는 변수에 저장을 시킵니다.
n1~n5 변수를 nums라는 2차원배열의 첫번째 열에 차례대로 (최소값~최대값 순서로) 저장을 시켜주구요. (예: nums[0][0] = n1, nums[1][0] = n2)
그리고 n1~n5변수의 빈수 (occurrences1~occurrences5)를 2차배열 두번째 열에 저장을 시켜주구요. (해당되는 변수의 오른쪽 열)
그리고 occurrences1~occurrences5 변수중 가장 큰 값을 가진 변수를 maxOccurrences라는 변수에 저장합니다.
그리고 그 maxOccurrences라는 변수에 저장되어져 있는 값을 
맨 아래의 루프에 표시된것 처럼 nums [][] 2차원 배열에서 값을 찾은뒤 해당 되는 값이 존재하는 곳의 주소를 기억해서
그 주소 (nums[i][j])를 토대로 왼쪽에 있는 숫자 (nums[i][j-1]) 를 최빈값(mode) 로 출력해주는데요.

위 코드대로 돌렸을 시에 문제는 아래와 같습니다...
1. 5가지의 숫자를 1,2,1,3,5라고 가정했을시 maxOccurrences는 2입니다. 2의 주소 두번째 열에서만 검색해야하는데 첫번째 열도 검색을 해버려서
   만약에 최대빈수 = 유저가 입력한 값이 될시, 에러가 떠서 실행이 안됩니다..ㅠㅠ

2. maxOccurrences를 불러올때, 1번과 같은 에러가 만약에 없을 시, 첫번째 행에서 중복값이 있을 경우에 하나의 값만 불러오면 되는데, 중복값을 모      두 불러옵니다.ㅠㅠ
예->   
 유저가 넣은 값 빈도수 
 2
 1  2
 2  2
 2  2
 3  1
최빈값 출력시: 1
     1
                             2
                             2



위 두가지 문제점을 고칠수 있는 방법이 없을까요?
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호