본문 바로가기

공부/자바 OOP

5월 22일 - 배열 2+연습문제

1차원 배열 - 배열 표현 []

정수 배열 ~.~

배열은 열거의 형태로 줄 수 있음

element : 배열의 요소

index : 배열의 순서, 색인

su . : .눌러서 목록이 나오면 뒤에 붙은 걸 하묜 하나의 객체가 됨 ex) su .length; //배열 요소의 갯수

 

연습문제 1 -배열요소

int [] su= {-3, 7, 0, -8, 6};
int size=su.length ;
System.out.println("su배열 요소의 갯수 : "+size);

for (int idx=0; idx<size; idx++){
	System.out.print(su[idx]+" ");
}//for end
		
System.out.println();

출력결과
su배열 요소의 갯수 : 5
-3 7 0 -8 6 

문제 1)  su배열 요소의 전체 합을 구하시오

//내가
int hap=0;
	for (int idx=0; idx<size; idx++){
		hap = su[idx] + hap;		     //su의 0부터 idx순서값이 증가하는것을 su[idx]로 표현
    }//for
		
System.out.println("su배열 요소의 전체 합은 "+hap);

출력결과
su배열 요소의 전체 합은 2

//쌤
int hap1=0;
    for (int idx=0; idx<size; idx++){ //idx<=size 하면 익셉션이 발생 이것 역시 오류 
		 hap1 = hap1 + su[idx];
	}//for
		
System.out.println("su배열 요소의 전체 합은 "+hap1);

출력결과
su배열 요소의 전체 합은 2

오류 검출 - idx<=size , idx와 size가 같다고 했을 때 익셉션이 발생했음

                이유는 나중에 찾아볼 것,,

문제 2) 음수의 갯수를 구하시오

//내 풀이
int em=0;
	for (int idx=0; idx<size; idx++){
		if(su[idx]<0){
			em++;
		}//if
	}//for
		
System.out.println("음수의 갯수는 "+em);

출력결과
음수의 갯수는 2

//선생님 풀이
int count=0;
	for (int idx=0; idx<size; idx++){
		if(su[idx]<0){
			count = count +1;
		}//if
	}//for
		
System.out.println("음수의 갯수는 "+count);
        
출력결과
음수의 갯수는 2

->음수의 갯수 구하는건 이제 익숙해져야 한다 

 

문제 3) su[0]요소의 등수를 구하시오
-점수가 높은 것을 1등 처리
-등수에 대한 알고리즘을 알고있어야함

if(su[0]<su[1]) r=1+1

if(su[0]<su[2]) r=2+1

if(su[0]<su[3]) r=3+1

if(su[0]<su[4]) 

 

점수가 [0]보다 크면 [0]의 등수는 하나씩 밀려남

int r=1;
	for (int idx=0; idx<size; idx++){
		if(su[0]<su[idx]){
			r++;
		}
	}//for
		
System.out.println("su[0]요소의 등수는 "+r);

출력결과
su[0]요소의 등수는 4

문제 4) 최소값, 최대값을 각각 구하시오
//최대값 7 최소값 -8
//max, min변수를 0으로 줄 시엔, 최대최소값이 음수에 걸릴수 없다 .

최대값 max를 0으로 줬을 때, 만약 문제의 변수들이 다 음수면 최대값은 설정해준 max의 0값을 출력하므로 

문제의 변수를 비교할 수 없다.

고로 최대값, 최소값을 설정했을 땐, 0이 아닌 문제의 변수 중 아무거나 넣어서 비교하기

 

int max=su[0];
int min=su[0];
		
for (int idx=0; idx<size; idx++){
	if(max<su[idx]){
	   max=su[idx];
	}//if
    if(min>su[idx]){
       min=su[idx];
	}//if
}//for
		
System.out.println("최대값은 "+max);
System.out.println("최소값은 "+min);

출력결과
최대값은 7
최소값은 -8

-3, -7, -1, -2, -6

if(max<su[0])

if(max<su[1])

if(max<su[2])

if(max<su[3])

if(max<su[4])

 

if(-3<-7)

if(-3<-3)

if(-3<-2) max ; -2

if(-3<-1) max ; -1

if(-3<-6)

->max값이 계속 변하면서, 마지막 변한 max값을 출력

 

문제 5) su배열의 각 요소의 등수를 구하시오

int[] rank={1, 1, 1, 1, 1};

for (int a=0; a<size; a++){
	for(int b=0; b<size;b++){
	    if(su[a]<su[b]){          //su배열의 등수 비교
			rank[a]=rank[a]+1; //rank[a]++
		}//if 	
	}//for			
}//for
		
for (int idx=0; idx<size; idx++){
	System.out.println(su[idx]+"은 "+rank[idx]+"등수");
}//for

출력결과
-3은 1등수
-7은 3등수
-10은 5등수
-8은 4등수
-6은 2등수

->분석

if(su[0]<su[0]) 

if(su[0]<su[1]) 

if(su[0]<su[2]) 

if(su[0]<su[3]) 

if(su[0]<su[4]) 

 

if(su[1]<su[0]) 

if(su[1]<su[1]) 

if(su[1]<su[2]) 

if(su[1]<su[3]) 

if(su[1]<su[4])

 

연습문제 2 - 성적프로그램

String[] name={"호랑말코","원숭이","나무늘보","개미핥기","치타"};
int[] kor={100,20,85,55,95};
int[] eng={100,40,80,65,90};
int[] mat={100,35,75,70,35};
int[] aver=new int[5];
int[] rank={1,1,1,1,1};
int size=name.length ;

문제 1) 평균을 구하시오

문제 2) 등수를 구하시오 (평균값을 기준으로)

//문제 1) 평균을 구하시오
for(int idx=0; idx<size; idx++){
	aver[idx]=(kor[idx]+eng[idx]+mat[idx])/3;
		System.out.println(name[idx]+" 평균: "+aver[idx]);
}//for end
		
출력결과
호랑말코 평균: 100
원숭이 평균: 31
나무늘보 평균: 80
개미핥기 평균: 63
치타 평균: 73

//문제 2) 등수를 구하시오 (평균값을 기준으로)
for(int a=0;a<size;a++){
	for(int b=0;b<size;b++){
		if(aver[a]<aver[b]){
			rank[a]++;
		}//if
	}//for end
}//for end
		
//출력하기
for(int idx=0;idx<size;idx++){
	System.out.print(name[idx]+" ");
	System.out.print(kor[idx]+" ");
	System.out.print(eng[idx]+" ");
	System.out.print(mat[idx]+" ");
	System.out.print(aver[idx]+" ");
	System.out.print(rank[idx]+" ");
			
	System.out.println();
}//for end

출력결과
호랑말코 100 100 100 100 1 
원숭이 20 40 35 31 5 
나무늘보 85 80 75 80 2 
개미핥기 55 65 70 63 4 
치타 95 90 35 73 3 

문제 1) 과락(평균70점을 기준으로 한과목 40이하시)->합격, 재시험, 불합격

//내 풀이
if(aver[idx]>=70){
	if(kor[idx]<40||eng[idx]<40||mat[idx]<40){
		System.out.print("재시험");			
	}else{
		System.out.print("합격");
	}
}//if
if(aver[idx]<70){
	System.out.print("불합격");			
}//if

//선생님 풀이			
if(aver[idx]>=70){
	if(kor[idx]<40||eng[idx]<40||mat[idx]<40){
		System.out.print("/ 재시험 /");			
	}else{
		System.out.print("/ 합격 /");
	}
}else{
	System.out.print("/ 불합격 /");			
}//if
			

문제 2) 평균 10점당 * 개씩

//내 풀이
for(int a=1; a<=10;a++){
	if(aver[idx]>=a*10){	
		System.out.print("@");
	}
}//for
			 
//선생님 풀이	
for(int star=1; star<=aver[idx]/10;star++){
	System.out.print("*");
}//for

문제 3) 평균 95점 이상 장학생

if(aver[idx]>=95){
	System.out.print(" / 장학생");
}//if

 

출력결과
호랑말코 - 100 , 100 , 100 , 100 / 1등 / 합격 /********** / 장학생
원숭이 - 20 , 40 , 35 , 31 / 5등 / 불합격 /***
나무늘보 - 85 , 80 , 75 , 80 / 2등 / 합격 /********
개미핥기 - 55 , 65 , 70 , 63 / 4등 / 불합격 /******
치타 - 95 , 90 , 35 , 73 / 3등 / 재시험 /*******

 

2차원 배열

 

-1차원은 열만 존재했다면, 2차원은 행(→)과 열(↓)로 구성되어 있다

        kor[0][0]                   kor[1][0]                   kor[2][0]                 

40 50 60
10 20 30

        kor[0][1]                   kor[0][1]                   kor[0][1]         

 

예제) 2차원 배열

int[][] kor=new int[2][3]; //2행 3열
kor[0][0]=10;
kor[0][1]=20;
kor[0][2]=30;
		
kor[1][0]=40;
kor[1][1]=50;
kor[1][2]=60;
		
System.out.println(kor[0][0]);
System.out.println(kor[0][1]);
System.out.println(kor[0][2]);
		
System.out.println(kor[1][0]);
System.out.println(kor[1][1]);
System.out.println(kor[1][2]);

출력결과
10
20
30
40
50
60

예제) 2차원 배열 -열과 행의 갯수 세기

int[][] eng={
		     {10,20,30} ,    //보기 쉽게 나눠서 내려서 적어준다
			 {40,50,60}      //행과 열의 구분을 쉽게 하기 위해
			};//2행 3열
		
//행의 갯수
System.out.println(eng.length ); //2
		
//[0]행의 열의 갯수
System.out.println(eng[0].length ); //3

//[1]행의 열의 갯수
System.out.println(eng[1].length ); //3

for(int a=0; a<=1; a++){
	for(int b=0;b<=2;b++){
		System.out.println(eng[a][b]);
	}//
}//for
		

2차원 배열의 열과 행 갯수세기

행의 갯수를 기준으로 열의 갯수를 센다. 

eng.length 는 행의 갯수

열의 갯수를 구할 때엔 배열 eng[0]의 해당하는 행을 불러 그 행의 열의 갯수를 세면 된다. ex) eng[1].length

 

예제) 2차원 배열 - 배열 출력하기

int[][] mat={
			{10,20},
			{30,40,50,60},
			{70,80}
		     };		
int row=mat.length ; //3
		
for(int a=0; a<row; a++){
	int col=mat[a].length ;
		for(int b=0; b<col;b++){
			System.out.print(mat[a][b]+" ");
		}
	System.out.println();
}//for end

출력결과
10 20 
30 40 50 60 
70 80 

각 행의 열의 갯수가 달라도 무방하다.

 

연습문제 1 -모음의 갯수를 구하시오

char[][] ch = {
			{'H','a','p','p','y'},
		        {'A','p','p','l','e'},
			{'S','o','l','d','e','s','k'}
		       };
int row=ch.length ;
//내 풀이
int mo=0;
		
for(int a=0;a<row;a++){
	int col=ch[a].length ;
	for(int b=0; b<col;b++){
    if(ch[a][b]=='A'||ch[a][b]=='a'||ch[a][b]=='e'||ch[a][b]=='i'||ch[a][b]=='o'||ch[a][b]=='u'){
			mo++;
			System.out.println(mo);
		}//if				
	}//for
}//for end

출력결과
1
2
3
4
5

//선생님 풀이
int moem=0;
		
for (int a=0; a<row; a++){
	int col1=ch[a].length ;
	for(int b=0;b<col1;b++){
		char c=ch[a][b]; // 각 요소값 가져오기
		if(c>='A' && c<='X'){ //대문자인지?
			c=(char)(c+32); //대문자이면 소문자로 바꿈
		}//if
		switch(c){
			case 'a' :
			case 'e' :
			case 'i' :
			case 'o' :
			case 'u' : moem++;
		}//switch end
	}//for end
}//for
		
System.out.println("모음의 갯수는 "+moem+"개");

출력결과
모음의 갯수는 5

내 풀이

: 난 모음만 따로 if로 적어줘서 빼냈는데, 이건 잘못된 생각인거 같다. 모음이라고 소문자만 있는 건 아닌데,,ㅎ

모음도 대소문자 다 존재한다. 고로 만약 저걸 적어주려면 10개 다 적어야하는데 그런 노가다는 아닌거같고.. 

  

선생님 풀이

: switch-case사용, 이 문제는 대소문자가 섞여져 있으므로 10개의 케이스를 다 적어주는 번거로움보단 

대문자를 모두 소문자로 바꾸어 소문자 5개의 케이스만 적어 비교!

 

연습문제 2 | 요일 구하는 프로그램 (이후엔 calender class를 이용하기)

 

구하는 순서

년, 월, 일을 치면 무슨 요일인지 나오는 프로그램 
    윤년 생각해야하고, 월별 일수 
    서기 1년~서기 2019년=총날수=365*2019=736935
    총날수%7-> 0일 ,1월, 2화, 3수, 4목, 5금, 6토 
    
    1) 서기1년 ~ 서기 2018년
       ->2018년도까지 계산한다 , 왜냐 구하려는 날이 2019년 5월이므로
       윤년 +=366
       평년 +=365
       -> 몇번 반복하는지 2019/4
    2) 1월 ~ 4월 ->배열
       1,3,5,7,8,10,12월 +=31
       2,4,6,8,11월        +=30
       2월                    +=29 윤년
       2월                    +=28 평년
    3) day
        +=22

int[] mon={31,28,31,30,31,30,31,31,30,31,30,31};

5월 -> mon[0]~mon[3] , mon정렬에 보면 0부터 순서가 시작해 0월부터 3월인데 보기 쉽게 

int[] mon={0,31,28,31,30,31,30,31,31,30,31,30,31};

0을 추가해서 5월 -> mon[1]~mon[4]

int cyear=2019, cmonth=5, cdate=22;

//1) 년 수에 대한 총 날수 구하기 (1~2018년까지)
int hap=0;
for(int y=1;y<cyear;y++){
	if(y%4==0 && y%100!=0 || y%400==0){
		hap=hap+366;
	}else{
		hap=hap+365;
	}//if end
}//for end

-------2019년 1월1일부터 5월 22일까지의 요일 구하기
//2) 월 
int[] mon={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(cyear%4==0 && cyear%100!=0 || cyear%400==0){ 
		//여기서 year의 대상은 문제에서 구하려는 달력의 cyear2019 이기때문에
		//cyear로 써야함
	mon[2]=29; //윤달일 경우
	}//if end
		
for (int m=1; m<cmonth; m++){
	hap=hap+mon[m];
}//for

//3) 일 
hap = hap + cdate;

//4) 요일 출력하기
System.out.println("총날수 : "+hap+"일");
		
switch(hap%7){
	case 0 : System.out.println("오늘은 일요일"); break;
	case 1 : System.out.println("오늘은 월요일"); break;
	case 2 : System.out.println("오늘은 화요일"); break;
	case 3 : System.out.println("오늘은 수요일"); break;
	case 4 : System.out.println("오늘은 목요일"); break;
	case 5 : System.out.println("오늘은 금요일"); break;
	case 6 : System.out.println("오늘은 토요일"); break;
}//switch end

출력결과
총날수 : 737201일
오늘은 수요일