java 100예제 #9

배열의 빈도

(선거, 의견 투표 등)

ar[ target [ i ] ] ++ ;

public static void main(String[] args) {

		int[] target = {1,3,3,2,1,1,3,0,1,2};
		//숫자 종류가 4개임. > 그만큼 방 ar
		
		int[] ar = new int[4];
		//int 배열 선언하면 자동으로 0으로 초기화
		
		for(int i =0;i<target.length;i++ ) {
			ar[target[i]] ++;
			//target배열내 숫자가 ar의 인덱스와 동일하면 ar배열 요소값을 1씩 증가
        }
		for(int i : ar)System.out.println(i);
	}

짝수만 while, continue를 사용하여 구현하기(1~30)

public static void main(String[] args) {

		int number = 1;
		
		while(number<=30) {
			if(number%2!= 0){
            			number++; 
            			continue;
                        }
			System.out.print(number + " ");
			number++;
		}	
	}

짝수만 중첩 반복문을 사용하여 구현하기(1~30)

public static void main(String[] args) {

		for(int i = 0; i<=2; i++) {
			for(int j = 0  ; j<=9  ;j++) {
				int out = i*10 + j;
				if(out %2 !=0) continue;
				
				System.out.print(out + "   ");
			}
			System.out.println();
		}	
	}

continue label : label이 선언된 곳으로 이동한다.

public static void main(String[] args) {
		
     		//label
		outerloop:
		
		for(int i = 0 ; i<=3 ; i++) {
			for(int j = 0  ; j<=9  ; i++) {
				
				int out = i*10 + j;
				
				if(out %2 !=0) {
					if(j==1) {
						System.out.println();
						continue outerloop;
					}
				}
				System.out.print(out + "  ");
			}
		}	
}

2차원 배열로 5X5 출력하기

		int r= 5, c= 5;
		//행과 열
		
		char[][] ar = new char[][] {
			{'@', '@', '@','@','@'},
			{'@', '@', '@','@','@'},
			{'@', '@', 'A','@','@'},
			{'@', '@', '@','@','@'},
			{'@', '@', '@','@','@'}
		};
		
		
		for(int i = 0 ; i< r ; i++) {
			for(int j = 0 ; j <c; j++) {
				System.out.print(ar[i][j]+"  ");
			}
			System.out.println();
		}
		

배열의 빈도수, 반복문을 이용한 최대, 과반수 구하기

Solution를 이용한 구현

class Solution{
	int max = 0;
	
	public void sMethod(int[] n, int[] num){
		for(int i = 0 ; i< num.length ; i++) {
			n[num[i]-1] ++;
		}
		
		for(int i = 0 ; i < n.length ; i++) {
			int g = i+1;
			if(n[i] >= n [max])
				max = i;
			System.out.println(g+"번 후보 --> "+ n[i] +"표");
		}
		
		System.out.println("가장 많은 득표 수 --> "+ n[max]+"표 이고, 후보자는 "+(max+1)+"번 후보자 입니다.");
		
		
		//과반수 체크 _ 실수 필요! 
		if(n[max] >= (num.length)/ ( double ) 2 )
			System.out.println("당선 ! ");
		else
			System.out.println("과반수 실패! 미당선");
		
	}
}

public class ex5 {
	public static void main(String[] args) {
		
		Solution s = new Solution();
		
		int[] n = new int[3]; //ar
		
		int[] num = {1,1,2,2,3,3,3,3,2,3}; //vote_box
		

		s.sMethod(n,num);
	}
}

반복문없이 배열의 최대, 최소

import java.util.Arrays;

public class ex5 {
	public static void main(String[] args) {
		int[] vote_box = {1,2,3,33,12,5};
		
		Arrays.sort(vote_box);
        
		System.out.println("최대 : "+vote_box[vote_box.length-1]);
       		 System.out.println("최소 : "+vote_box[0]);
		System.out.println("내림차순의 배열 모두 출력 : "+Arrays.toString(vote_box));
	}
}

Object

(제네릭(Generic)의 필요성)

메소드에 어떤 타입의 필드가 와도 사용하려면 Object을 이용한다.
편하지만 단점 ..

1. return 하여 사용할때 형변환이 필요할지도?

객체명.getClass( ).getName( )
객체가 속하는 클래스의 정보 출력

class Sample{
	//필드
	private Object a;
	
	//생성자
	Sample(Object x){this.a= x;	}
	
	//메소드
	public Object getA(){return a;}
	
	void printInfo() {
		System.out.println(a.getClass().getName());
	}
}


public class ex5 {
	public static void main(String[] args) {
		
		Sample s1 = new Sample("안녕?");
		System.out.println(s1.getA());
		
		Sample s2 = new Sample(100);
		System.out.println(s2.getA());
		
		Sample s3 = new Sample(new Object());
		
		
		s1.printInfo(); //String
		s2.printInfo(); //int
		s3.printInfo(); //Object
		
		
		String str =(String) s1.getA();
		//형변환 귀찮을걸?
	}
}

2. 컴파일은 해도 실행 단계에서 ClassCast 오류 발생할지도?
들어있는 값이랑 다른 엉뚱한 타입으로 선언+형변환 했다면
--> 컴파일(javac)에서는 에러가 안 나오고 실행(java)단계에서 오류.

class Person{
	public Object obj;
	Person(Object obj){this.obj = obj;}
	//만약 Object대신 Student이여도 가능하다.
}

class Student{
	public int grade;
	Student(int grade){this.grade = grade;}
}


public class ex5 {
	public static void main(String[] args) {
    
		Person p1= new Person("안녕");
		System.out.println(p1.obj);
		
		
		// int a = (int)p1.obj; ==> ClassCast 오류
	}
}

이런 단점을 해결하기 위해서 새로운 문법 "제너릭"을 사용한다.

좋은 웹페이지 즐겨찾기