본문 바로가기
Backend

05월 22일 수 | OOP 07 - JAVA의 배열

by 구라미 2019. 5. 22.

7. 자바의 배열

배열이란

배열이란 동일한 자료형 값의 집합이다.

배열도 변수이다.

1차원배열, 2차원배열이 있다. 

 

배열의 형식

타입[] 배열명;  int[] subject;

타입 배열명[]; int subject[];

*타입지정자 뒤나 배열명 뒤에 []가 추가되는 것을 제외하고는 변수명과 동일한 이름 규칙을 적용받는다.

타입 지정자 뒤에 []를 지정하는 첫 번째 형식을 많이 사용한다.

 

배열선언과 생성을 동시에 함

int[] subject =  new int[10];

 

배열을 선언과 생성을 분리함

int[] subject;

subject = new int[10];

 

배열의 선언, 생성, 초기값 할당을 동시에 함

int[] subject = new int[]{100,200,300};

 

1차원배열: 열 구성

2차원배열: 행과 열 구성

열 ,칸 -> column

행, 줄 -> row

배열은 new 연산자로 메모리를 할당한 후 사용한다.

 

배열은 자료구조이다.

 

1치원 배열연습

. <- 으로 패키지 구분

정수배열로 연습문제를 많이 풀어보기

어떤 값을 어떤 타입을 배열로 저장

배열은 1개 이상의 값을 저장 

열거형태로 한꺼번에 값을 저장할 수 있다.

 

배열의 요소를 엘리먼트라고 한다.
순서(목차)를 인덱스라고 한다.

 

배열이 된 su는 이제 변수보다는 객체라고 할 수 있는 상태가 되었다.

su. <- 배열명 다음에 .을 눌렀을 때 이용할 수 있는 객체기능들이 나온다. 

 

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

 

hap=hap+su[0]

hap=hap+su[1]

hap=hap+su[2]

hap=hap+su[3]

hap=hap+su[4]

로 순서대로 누적하는 것이다.

[인덱스] 의 규칙성을 발견하여 코드를 짜주는 것이다.

 

내 풀이 (1번, 2번을 함께 만들었다.)

int total =0;
int minCount = 0;		
		
for (int idx=0; idx<size; idx++){
	total = total+su[idx];
}
System.out.println(total);
		
for (int idx=0; idx<size; idx++){
	if(su[idx]<0){
	minCount = minCount+1;}
}
System.out.println(minCount);

 

■  선생님 답안  

//연습문제 1) su배열 요소의 전체 합을 구하시오
int hap=0;
 for(int idx=0; idx<size; idx++){
   hap = hap + su[idx];
}System.out.println(hap);

//결과값은 : 2

▶ 풀이절차

1. su배열의 전체 합계를 담아줄 hap을 선언하고 0으로 초기화한다.

2. for문의 조건을 ( 변수 idx의 초기값 0, 변수 idx의 범위는 전체 배열의 길이(갯수)를 담은 size 미만, idx를 증가)

3. 그리고 변수 hap에 hap과 배열 su의 요소의 번호의 합을 담는다.

4. for문의 조건을 만족할 때까지만 반복한다.

5. 변수 hap을 출력한다.

6. 결과값은 2

 

 

 

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

■  선생님 답안  

int count = 0;
  for(int idx=0; idx<size; idx++){ //열거형이므로 순서로 접근해야한다.
  if(su[idx]<0){
    count = count + 1;
  }
}System.out.println(count);

//결과값은: 2

▶ 풀이절차

1. su배열의 전체 합계를 담아줄 count를 선언하고 0으로 초기화한다.

2. for문의 조건을 ( 변수 idx의 초기값 0, 변수 idx의 범위는 전체 배열의 길이(갯수)를 담은 size 미만, idx를 증가)

3. for문안에 if문을 만들어 조건에 맞는 것만 반복하게 한다.

4. if문의 조건을 ( 배열 su의 [idx] < 0 ) // 배열su의 많은 su[idx] 중 0보다 작은 것만

5. 변수 count에 count에 1을 더한 값을 담는다.

6. for문의 조건을 만족할 때까지만 반복한다.

7. 변수 count를 출력한다.

8. 결과값은 2

 

연습문제 3) su[0] 요소의 등수를 구하시오

등수에 대한 알고리즘 -> 오름차순, 내림차순

숫자가 큰 순서대로 정렬

숫자가 작은 순서대로 정렬

옆에있는 숫자와 비교했을 때 나보다 작으면 +1

등수에 대한 개념이 아직 없는것 같다.

 

내 풀이

int grade = 1;
for (int idx=0; idx<size; idx++){
	if (su[0]<su[idx]){
		grade = grade-1;			
	}
	else if (su[0]<su[idx]){
		grade = grade+1;		
	}
		
} System.out.print(grade);

 

등수란?

나보다 점수가 높으면 등수가 밀려나는 개념

 

if(su[0]<su[1]) -3<7  //2

if(su[0]<su[2]) -3<0  //3

if(su[0]<su[3]) -3<-8 //3

if(su[0]<su[4]) -3<6  //4

의 반복이다.

어제 달팽이 문제와 비슷한 착각을 한 것 같다.

else if가 넣을 필요가 없는 것이었음.

조건을 만족할 때만 누적되면 되는 것이었다.

 

■  선생님 답안  

int r = 0;
for (int idx=0; idx<size; idx++){
	if (su[0]<su[idx]){
		r = r+1;			
	}			
} System.out.print(r);

//결과값: 4

▶ 풀이절차

1. su[0]의 등수가 들어갈 변수 r을 선언하고 0으로 초기화한다.

2. for문의 조건을 ( 변수 idx의 초기값 0, 변수 idx의 범위는 전체 배열의 길이(갯수)를 담은 size 미만, idx를 증가)

3. for문안에 if문을 만들어 조건에 맞는 것만 반복하게 한다.

4. if문의 조건을 ( 등수를 구할 su[0] < 배열 su의 [idx] ) // su[0]는 배열su의 많은 su[idx]들 보다 작을 때만

5. 변수 r에 r에 1을 더한 값을 담는다.

6. for문의 조건을 만족할 때까지만 반복한다.

7. 변수 r를 출력한다.

8. 결과값은 4

 

연습문제 4) 최대값, 최소값을 각각 구하시오

위 문제의 개념이 있어야 풀수있음.

음의 정수, 양의 정수 주의

어떤 수가 들어가도 정확히 결과가 나오게.

내 풀이 // 다른 사이트를 참고하였다.

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

 

■  선생님 답안  

현재수와 다음 수를 비교한 후 조건을 만족하면 그 값을 가져옴

그 값을 그 다음수와 비교한 후 조건을 만족하면 그 값을 가져옴 (값을 가져온다는 값을 할당(=) 한다는 것이다.)

 

int max = 0; 

//요소의 0번째를 집어넣어야한다. 왜냐면 전부 음수일 때 비교하면 0이 가장 커서 결과값이 0이 나와버림
int min = 0;

 

int max = su[0];

int min = su[0];

의 형태가 되어야 한다.

 

만약, su의 요소가

-3, -7, -2, -1, -6 이라면

if(max<su[0])

if(max<su[1])

if(max<su[2])

if(max<su[3])

if(max<su[4])

즉,

if(-3<-3)

if(-3<-7)

if(-3<-2) 이때 max=-2로 변한 값이 담김

if(-2<-1) 이때 max=-1로 변한 값이 담김

if(-1<-6)

 

반복문을 통해 값들을 계속 비교하고 값을 할당하여 최대값, 최소값을 찾는 것이다.

else가 들어가면 둘 중 하나라는 뜻이 됨.

//연습문제 4) 최대값, 최소값을 각각 구하시오
int max = su[0]; //요소의 0번째를 집어넣어야한다. 왜냐면 전부 음수일 때 비교하면 0이 가장커서 0이 나와버림
int min = su[0];
  for(int idx=0; idx<size; idx++){
    if(max<su[idx]){
	max = su[idx];
	}
			
	if(min>su[idx]){
	min = su[idx];
	}
}
		
System.out.println(max);
System.out.println(min);

//결과값: 최대는 7, 최소는 -8

= 가 할당(변수라는 그릇에 값을 담는 것)이라는 것을 항상 기억하기

 

▶ 풀이절차

1. 최대값이 들어갈 변수 max와 최소값이 들어갈 변수 min을 선언하고 0으로 초기화한다.

2. for문의 조건을 ( 변수 idx의 초기값 0, 변수 idx의 범위는 전체 배열의 길이(갯수)를 담은 size 미만, idx를 증가)

3. for문안에 if문을 두 개 만들어 조건에 맞는 것만 반복하게 한다.

4. 첫번째 if문의 조건을 ( 최대값 max < 배열 su의 [idx] ) 

//max라는 변수 그릇에 조건을 만족하는 배열su의 요소들만 담는 것이다.

계속 값이 변경될 수도 있음.

4-1. 조건을 만족하는 요소만 max에 su[idx]값을 담는다.

5. 두번째 if문의 조건을 ( 최소값 min > 배열 su의 [idx] )

5-1. 조건을 만족하는 요소만 min에 su[idx]값을 담는다.

6. for문의 조건을 만족할 때까지만 반복한다.

7. 변수 max와 min을 출력한다.

8. 결과값은 최대는 7, 최소는 -8

 

 

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

 

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])

 

■  선생님 답안  

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]){
     rank[a] = rank[a]+1;  //rank[a]++
   }
			
   }
			
}
		
for(int idx=0; idx<size; idx++){
	System.out.println(su[idx]+":"+rank[idx]+"등수");
}

//결과값:
//-3:4등수
//7:1등수
//0:3등수
//-8:5등수
//6:2등수

▶ 풀이절차

1. 등수를 담을 정수 배열 rank의 요소들을 모두 1으로 초기화한다. //등수를 담아야하니까 초기값이 1이다.

2. for문의 조건을 ( 변수 a의 초기값 0, 변수 a의 범위는 전체 배열의 길이(갯수)를 담은 size 미만, a를 증가)

3. for문안에 for문을 만든다 ( 변수 b의 초기값 0, 변수 b의 범위는 전체 배열의 길이(갯수)를 담은 size 미만,

b를 증가) 조건에 맞는 것만 반복하게 한다.

3-1. if문의 조건을 (배열 su의 [a] < 배열 su의 [b])

3-2. 위 조건을 만족할 때 정수 배열 rank의 [a] rank[a]+1을 더해준다. 

//예) 배열의 요소가 12345일 때,

1 12345 -> 비교해서 지금 rank[a]의 초기값은 1이니까

그 초기값에 1<1,  1<2 성립 +1, 1<3 성립 +1, 1<4 성립 +1, 1<5 성립 +1 이런 흐름대로 진행.

그래서 1의 등수는 5등이다. 1의 등수 판별이 완료되었을 때 가장 바깥 for문의

2를 판별하기 시작한다...

 

4. 첫번째 for문 > 두번째 for문이 그 안의 if문 조건을 만족하는 반복을 마칠 때까지 > 다시 첫번째 for문

5. 위와 같이 반복을 마친 후 배열su의 요소(요소안의 숫자)  +  rank[idx]에 저장된 등수 + "등수"

 

 


배열 연습문제

 

성적프로그램 완성하기. 

		//성적프로그램 완성하기.
		String[] name ={"설리","김승환","지상","설수진","손석희"};
		int[] kor = {100,20,85,55,95};
		int[] eng = {100,40,80,65,90};
		int[] mat = {100,35,75,70,35};
		int[] avg = new int[5];
		int[] rank = {1,1,1,1,1};
		int size=name.length;
		
		//평균을 구하시오
		for(int idx=0; idx<size; idx++){
			avg[idx]=(kor[idx]+eng[idx]+mat[idx])/3;
			System.out.println(avg[idx]);
		}					
		
		//등수를 구하시오 (평균값을 기준으로)
		for(int a=0; a<size; a++){
			for(int b=0; b<size; b++){
				if(avg[a] < avg[b]){
					rank[a] = rank[a]+1;
				}
			}
		}
		
		//출력하기
		for(int idx=0; idx<size; idx++){
			System.out.println(name[idx]+" ");
			System.out.println(kor[idx]+" ");
			System.out.println(eng[idx]+" ");
			System.out.println(mat[idx]+" ");
			System.out.println(avg[idx]+" ");
			System.out.println(rank[idx]+" ");
			
		}

 

연습문제 1) 과락(평균을 기준으로 평균이 70점이상이더라도 개별과목이 한과목이라도 40미만 일시) 합격, 재시험, 불합격 출력하기

연습문제 2) 평균이 10점당 ★를 1개씩 (평균 100은 ★*10개, 평균 40은 ★*4개)

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

내 풀이

// 성적프로그램 완성하기.
String[] name = { "설리", "김승환", "지상", "설수진", "손석희" };
int[] kor = { 100, 20, 85, 55, 95 };
int[] eng = { 100, 40, 80, 65, 90 };
int[] mat = { 100, 35, 75, 70, 35 };
int[] avg = new int[5];
int[] rank = { 1, 1, 1, 1, 1 };
int size = name.length;

// 평균을 구하시오
for (int idx = 0; idx < size; idx++) {
	avg[idx] = (kor[idx] + eng[idx] + mat[idx]) / 3;
	System.out.println(avg[idx]);
}

// 등수를 구하시오 (평균값을 기준으로)
for (int a = 0; a < size; a++) {
	for (int b = 0; b < size; b++) {
		if (avg[a] < avg[b]) {
			rank[a] = rank[a] + 1;
		}
	}
}

// 출력하기
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(avg[idx] + " ");
	System.out.print(rank[idx] + "등" + " ");
	System.out.println();
}

System.out.println();

// 연습문제 1) 과락(평균 70이상, 과목 하나라도 40미만) 합격, 재시험, 불합격
// 출력하기
for (int idx = 0; idx < size; idx++) {
	if (avg[idx] >= 70) {
		if (avg[idx] >= 95) {
			System.out.print("☆장학생☆ "); // 연습문제 3) 평균 95점이상 장학생
		}
		if (kor[idx] < 40 || eng[idx] < 40 || mat[idx] < 40) {
			System.out.println(name[idx] + ":" + " 과락으로 재시험입니다.");
		} else {
			System.out.println(name[idx] + ":" + " 합격입니다.");
			}
		} else {
			System.out.println(name[idx] + ":" + " 불합격입니다.");
		}

// 연습문제 2) 평균이 10점당 ★를 1개씩 (평균 100은 ★*10개, 평균 40은 ★*4개)

for (int a = 1; a <= 10; a++) {
	if (avg[idx] >= a * 10) //70 
			System.out.print("★");
	}//for문 end
			
System.out.println();
System.out.println();
}//for문 end

 

■  선생님 답안  

		//성적프로그램 완성하기.
		String[] name ={"설리","김승환","지상","설수진","손석희"};
		int[] kor = {100,20,85,55,95};
		int[] eng = {100,40,80,65,90};
		int[] mat = {100,35,75,70,35};
		int[] avg = new int[5];
		int[] rank = {1,1,1,1,1};
		int size=name.length;
		
		//평균을 구하시오
		for(int idx=0; idx<size; idx++){
			avg[idx]=(kor[idx]+eng[idx]+mat[idx])/3;
			System.out.println(avg[idx]);
		}					
		
		//등수를 구하시오 (평균값을 기준으로)
		for(int a=0; a<size; a++){
			for(int b=0; b<size; b++){
				if(avg[a] < avg[b]){
					rank[a] = rank[a]+1;
				}
			}
		}
		
		//출력하기
		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(avg[idx]+" ");
			System.out.print(rank[idx]+"등"+" ");
			
			System.out.println();
			
		}
		
		for(int idx=0; idx<size; idx++){
			if(avg[idx]>=70){
				if(kor[idx]<40 || eng[idx]<40 || mat[idx]<40 ){
					System.out.print(name[idx]+"재시험");		
				} else {
					System.out.print(name[idx]+"합격");
				}
			}else {
				System.out.print(name[idx]+"불합격");			
			}//합,불,과락 판별
			
			for(int star=1; star<=avg[idx]/10; star++){
				System.out.print("★");
			}
			
			if(avg[idx]>=95){
				System.out.println("장학생");
			}
			
			
		}

 

 

2차원 배열

2차원 배열은 행과 열로 구성되어있다.

2차원 배열을 사용하는 이유 C에서 문자열 구현할 때 복잡하다 Java로 왔을 때 복잡함을 제거하고 클래스를 사용하도록 만듦.

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
  

▶ 풀이절차

1. [][]을 두번 선언하고 2행 3열의 새로운 2차원 배열이 생겼다.

2. n행 n열에 순서대로 값을 넣어준다.

3. 좌표를 찍듯 0행~ ..0열~.. 을 출력하면 그 안에 담은 결과 값이 출력된다.

 

2차원배열에서 행과 열의 갯수 찾기.

//2차원 배열에서 length는 행의 갯수이다.
System.out.println(eng.length); //2

//열의 갯수는 행을 잡아준 후 length 아래는 0행의 열 갯수이다.
System.out.println(eng[0].length); //3

//아래는 1행의 열 갯수이다.
System.out.println(eng[1].length); //3

 

2차원배열을 for문으로 출력하기.

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

▶ 풀이절차

1. for문으로 a(행)을 1씩 증가하며 반복하는데

2. 그 안의 for문으로 b(열)을 1씩 증가하면서 반복한다.

3. 영어점수인 2차원배열 eng[a][b]를 출력된다.

 

 

 

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

 

내 풀이


char[][] ch = {
		{'H','a','p','p','y'},
		{'A','p','p','l','e'},
		{'s','o','l','d','e','s','k'}
								
		};
		int rowCh = ch.length;

//연습문제 1) 모음의 갯수를 구하시오.
		
		int mo=0;		
		for(int a=0; a<rowCh; a++){

			int col=ch[a].length;
			for(int b=0; b<col; b++){
				switch(ch[a][b]){
				case 'a':
				case 'e':
				case 'i':
				case 'o':
				case 'u':
				case 'A':
				case 'E':
				case 'I':
				case 'O':
				case 'U':mo++;
				
					}
				}
			}System.out.println(mo);

결과값: 5

▶ 풀이절차

column-열, row-행 (여태까지 완전 반대로 알고 있었네...column 디자인과, css에서도 사용되는 것 가로폭을 나누어줄때 썼음)

1. 조건의 2차원 배열은 총 3개의 행에 0,1의 열의 길이는 같고 마지막 열의 길이가 더 길다.

2. 행의 갯수를 넣어준 변수를 선언한다.

3. 갯수를 넣을 정수 변수 mo를 선언하고 0으로 초기화하였다.

4. for문으로 a<rowCh라는 조건으로 행을 증가하며 반복

4-1. 그 안에 열의 변수 col을 선언하여 배열 ch[a]요소(각 행별 요소)의 갯수를 넣어준다.

4-2. 그 안에 for문을 만들어 b<col의 조건으로 증가하며 반복한다.

5. 그 안에 스위치문으로 2차원배열 ch의[행][열]을 불러와 케이스의 모음들 중 조건에 맞는 것들만 mo에 축적시킨다.

 

■  선생님 답안  

int moCh = 0;	
		for(int a=0; a<row; a++){
			int col = ch[a].length;
			for(int b=0; b<col; b++){
				char c =ch[a][b];
				if(c>='A' && c<='Z'){
					c=(char)(c+32);
				}
				switch(c){
				case 'a':
				case 'e':
				case 'i':
				case 'o':
				case 'u':moCh++;
				}
			}
		}System.out.println(moCh);

대문자를 소문자로 바꿔서 case 수를 줄이는 코드를 작성하셨다.

결과값: 5

 

요일 구하는 프로그램 

		//연습문제 1) 요일 구하는 프로그램 //연습을 위한 문제 나중엔 달력 class 사용하기를 권장.
		
		int cYear=2019, cMonth=5 ,cDate=22;
		
		//전체 알고리즘
		//서기 1년 ~ 2019년 = 총 날수 2019*365 736935일
		//총 날수%7==0 일, ==1 월, ==2 화, ==3 수, ==4 목, ==5 금, ==6 토,
		//
		
		//1) 서기 1년 ~ 2019년 윤년+= 366 평년+=365
		int hap = 0;
		for (int a=1; a<cYear; a++){
			if(a%4==0 && a%100!=0 || a%400==0){
				hap = hap+366;
			}else {
				hap = hap+365;
			}
			
		}//for end
		
		//2018년까지의 날 수를 구했다. 2019년의 5월 22일까지의 날을 더해주어야함.
		//2) 달에 대한 개념. month 4가지 형태가 있다. 31,30,29,28
		//1월~4월
		//1, 3, 5, 7, 8, 10, 12월 +=31일
		//4, 6, 9, 11월 +=30일
		//2월 +=29일 윤년
		//2월 +=28일 평년
		//배열로 풀이
	
	
			int[] mon = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
			//mon의 0번째부터 3번째까
			//5월 hap += mon[0] ~ mon[3]
			//5월 hap += mon[1] ~ mon[4]
			if(cYear %4==0 && cYear%100!=0 || cYear%400==0){ //올해가 윤년인지 묻기
				mon[2] = 29;
			}
			
			for(int m=1; m<cMonth; m++){
				hap = hap + mon[m];
			}
			
			
			//3) Date
			hap =  hap + cDate;
			System.out.println(hap);
			
			//4) 요일 출력
			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;			
			}		
			
			//가장 작은단위의 합을 구해놓고 나누기 -> 지난 번 1년의 시 분 초 묻는 문제랑 비슷함.

개념 풀이해보기.

댓글