[JAVA] 연습문제 및 배열
오늘은 연습문제들을 풀었다.
처음 하자니 어려운것들도 있었지만, 풀다보니 재밌었고, 열정이 더 생기는 날이었다.
문제들을 리뷰해보는 시간을 가지겠다.
첫번째 문제이다.
1부터 100까지의 정수 중 5의 배수의 합계를 출력하는 프로그램을 작성하라는 문제였다.
주어진 값은 이러하였다.
package Chapter05;
public class Excercise1 {
public static void main(String[] args) {
int sum = 0;
// for문을 이용하여 반복 합계 연산
System.out.println(sum);
}
}
실행 결과는
1050
이렇게 출력해야 하는 문제이다.
문제를 풀기전에 합계는 0임을 줬고 나는 여기서 5의 배수의 합계를 반복합산하는 for문을 넣는게 포인트였다.
i값을 int 자료형으로 선언하고, 초기값을 5로 두고 i값을 100까지 5씩 늘려주고 그 값을 다 더하면 된다고 생각하였다.
그래서 만든식은 이와 같다
package Chapter05;
public class Excercise1 {
public static void main(String[] args) {
int sum = 0;
// for문을 이용하여 반복 합계 연산
for (int i = 5; i <= 100; i += 5) {
sum += i;
}
System.out.println(sum);
}
}
i값은 5씩 증가하고 그 값을 sum에다 대입하여 계속 5씩증가한값을 더해주는 식으로만들었다.
2번째 문제를 보겠다.
2번째 문제는 1부터 100까지의 수 중 짝수와 홀수의 합을 각각 구하라는 문제였다.
1부터 100까지 중, 짝수와 홀수를 판별하는 식을 세우는게 먼저였다.
짝수란 2로 나누었을때 나머지가 0인수, 홀수란 2로 나누었을때 나머지가 1인 수였다.
이와 같이 풀었다.
package Chapter05;
public class Excercise2 {
public static void main(String[] args) {
int evenSum = 0;
int oddSum = 0;
for(int i = 1 ; i <= 100 ; i++) {
if( i % 2 == 0) {
evenSum += i;
}
else if ( i % 2 ==1 ) {
oddSum += i;
}
}
System.out.println("짝수의 합계는 : " + evenSum);
System.out.println("홀수의 합계는 : " + oddSum);
}
}
1부터 100까지의 수를 계속 연산하게 하였고, 그중 2로 나누었을때 나머지가 0인수는 evenSum 즉 짝수의합계인 수에 더해주고 그 외에 2로나누었을때 나머지가 1인 수는 oddSum에 더하여 저장하게 두었다.
세번째 문제는 두개의 주사위의 두 눈의 합이 6이 되는 모든 경우의 수를 출력하는 프로그램을 작성하라는 것이다.
일단 주사위는 1부터 6까지의 눈이 있다.
두 개의 주사위의 눈의 값이므로 두가지 변수를 선언하여주고, 그 값을 1부터 6까지가 있고, 두 수의 합이 6이 되는 수를 만들면 되었다.
package Chapter05;
public class Excercise3 {
public static void main(String[] args) {
for(int x = 1; x<=6; x++) {
for(int y = 1; y <= 6; y++) {
if(x+y == 6) {
System.out.println("(" + x + "," + y + ")");
}
}
}
}
}
두 변수를 x와 y로 두었다.
출력값은 이와 같이 나왔다.
(1,5)
(2,4)
(3,3)
(4,2)
(5,1)
네번째 문제
이중 for문을 이용하여 아래와 같은 실행결과가 출력되도록 코드를 작성하시오.
[실행 결과]
*
**
***
****
*****
문제이다.
이런 문제는 행렬로 비유해서 보면 간단해진다.
칸을 이렇게 나누고
* | ||||
* | * | |||
* | * | * | ||
* | * | * | * | |
* | * | * | * | * |
표1.
5x5 행렬로 보면 된다.
먼저 이렇게 실행해본다.
package Chapter05;
public class Excersice4 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("(" + i + "," + j + ")");
}
System.out.println();
}
}
}
[실행결과]
(0,0)(0,1)(0,2)(0,3)(0,4)
(1,0)(1,1)(1,2)(1,3)(1,4)
(2,0)(2,1)(2,2)(2,3)(2,4)
(3,0)(3,1)(3,2)(3,3)(3,4)
(4,0)(4,1)(4,2)(4,3)(4,4)
로 출력이 된다. 그러면 위에서 표1을 보자면
(0,0)
(1,0)(1,1)
(2,0)(2,1)(2,2)
(3,0)(3,1)(3,2)(3,3)
(4,0)(4,1)(4,2)(4,3)(4,4)
이와 같다고 볼 수 있다. 규칙을 보자면 행을 i로두고 열을 j로 두었을때
i의 값이 j의 값과 같거나 클 때만 출력이 되는것을 알 수가 있다.
그럼 이식에서 출력이 i의 값이 j보다 크거나 같을때만 출력을 하는 식을 넣어주면.
package Chapter05;
public class Excersice4 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i >= j) // 이 식을 넣어준다.
System.out.print("(" + i + "," + j + ")");
}
System.out.println();
}
}
}
넣어주면
[실행결과]
(0,0)
(1,0)(1,1)
(2,0)(2,1)(2,2)
(3,0)(3,1)(3,2)(3,3)
(4,0)(4,1)(4,2)(4,3)(4,4)
가 출력되는 모습을 볼 수 있다.
여기서 이 값을 *로만 바꾸면 답에 맞게 출력이 된다.
5번 문제를 보겠다. 5번문제는 4번문제와 비슷하지만
이렇게 출력이 되어야한다.
[ 실행 결과 ]
*****
****
***
**
*
이것을 다시 행렬에 비교해서 보자.
(0,0)(0,1)(0,2)(0,3)(0,4)
(1,0)(1,1)(1,2)(1,3)(1,4)
(2,0)(2,1)(2,2)(2,3)(2,4)
(3,0)(3,1)(3,2)(3,3)(3,4)
(4,0)(4,1)(4,2)(4,3)(4,4)
이것을
(0,0)(0,1)(0,2)(0,3)(0,4)
(1,0)(1,1)(1,2)(1,3)
(2,0)(2,1)(2,2)
(3,0)(3,1)
(4,0)
이렇게 출력해야 하는 것이다.
그러면은
이것은 i의 값과 j의 값이 4를 넘어가는 것들은 출력이 안됨을 알 수 있다.
그렇기에 i의 값과 j의값의 합이 4보나 작거나 같을때만 출력되는식을 넣어주면
해결할 수 있다.
package Chapter05;
public class Excersice4 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i + j <= 4)
System.out.print("(" + i + "," + j + ")");
}
System.out.println();
}
}
}
6번 문제는
이렇게 출력이 되어야한다.
*
***
*****
*******
*********
이 문제는 생각보다 어려웠다. 왜냐면 4번문제와 5번문제와 다르게, 공백이 추가되어야 하기 때문이다.
그렇다면 이것도 행렬로 비교해보자
가로 = 행 세로 = 열
이것은 5 x 9 형식이다.
* | ||||||||
* | * | * | ||||||
* | * | * | * | * | ||||
* | * | * | * | * | * | * | ||
* | * | * | * | * | * | * | * | * |
package Chapter05;
public class Excersice4 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 9; j++) {
System.out.print("(" + i + "," + j + ")");
}
System.out.println();
}
}
}
행은 5, 열은9로 출력을 하면 출력값은 이와같이 나온다.
(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)
(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)
(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)
(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(3,8)
(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)
이것은 행렬로 표현하려면 굉장히 복잡해질 것 같아 다른방법을 생각해보았다.
보게되면 첫번째 줄은 공백이4칸
두번째줄은 공백이 3칸
세번째는 1칸
네번째는 0칸인것을 볼 수 있었다.
공백을 4,3,2,1 로 표현하는 for문을 만들고
별은 1,3,5,7,9 갯수로 표현하는 for문을 만들면 되는것이였다.
7번문제.
주사위의 눈이 6이 나올때까지 반복해서 굴리고, 눈이 6이 되면 지금까지 주사위를 굴린 횟수까지 출력하는 코드를 작성하시오. (While문으로 반복, 주사위는 Math.random()으로 작성)
여기서 Marh.random() 에 대해서 먼저알아보겠다. Math.random은 0.0 이상, 1.0 미만의 숫자를 출력하는 명령문이다.
이와같이 우리는 주사위의 눈인 1,2,3,4,5,6에 대한 난수가 필요하기 때문에, Math.random 에 6을 곱하여, 0.0~ 5.9999까지 출력을 하게 만들고, 거기서 숫자1을 더하여 1.0부터 6.9999... 까지를 출력하게 만든 후 int 괄호를 씌워 int형으로 바꿔 1~6까지로 만든다.
package Chapter05;
public class Excercise7 {
public static void main(String[] args) {
int num = (int) ((Math.random() * 6 + 1));
int count = 0;
while (num != 6) {
num = (int) ((Math.random() * 6 + 1));
System.out.println(num);
count++;
}
System.out.println("주사위를 돌린 횟수" +count);
}
}
이와 같이 num 값을 1부터 6까지 출력하는수로만들고
주사위를 돌린 횟수를 세는 값은 count로 둔다.
num이 6이되면식을 while문을 종료한다.
8. 배열
8.1 배열 선언
배열 변수를 선언하는 방법은 두가지가 있다.
데이터 타입[] 변수명; | 데이터 타입 변수명[]; |
데이터 타입(자료형) 뒤에 대괄호[]를 넣거나 변수명 뒤에 대괄호를 넣으면 배열 변수를 선언한 것이다. 실제 코드로 배열 변수를 선언해보자.
int[] arrInt;
int arrInt2[];
double[] arrDouble;
String[] arrString;
이런식으로 선언할 수가 있다.
배열 변수를 선언할 때 객체를 생성 할 수 있다. new 연산자를 이용해서 배열 객체를 생성 할 수 있다.
new 연산자로 배열 객체를 생성하면 배열의 값은 기본값으로 초기화된다.
int[] arrInt = new int[5]; // 길이가 5개인 배열 객체 생성
int 데이터타입의 배열변수 arrInt에 new 연산자로 길이가 5개인 배열 객체를 생성하는 소스이다.
값은 값을 초기화했으므로 [0] [0] [0] [0] [0] int형이므로 0으로 되어있고, 순번은 0,1,2,3,4 로 된다.
그러면 이제 값을 초기화 해보자.
int[] arrInt = new int[5]; //길이가 5개인 배열 객체 생성
arrInt[0] = 1;
arrInt[1] = 2;
arrInt[2] = 3;
arrInt[3] = 4;
arrInt[4] = 5;
이렇게 인덱스 0번부터 4번까지 순서대로 1부터 5까지의 값을 대입했다.
이번에는 배열변수를 선언과 동시에 초기화를 해보겠다.
String[] arrStr = {"BTS", "봉준호", "손흥민", "함준혁"};
이와같이 arrStr이라는 이름의 문자열 타입의 배열 변수를 선언함과 동시에 중괄호{}를 사용하여 "BTS", "봉준호". "손흥민", "함준혁" 네 문자열을 배열의 값으로 초기화 하였다.
0번 인덱스에는 BTS 1번 인덱스에는 봉준호 2번 인덱스에는 손흥민 3번인덱스에는 함준혁이 순서대로 열을 맞춰서 차례대로 대입 된 것이다.
이번에는 배열을 이용해 로또번호를 뽑는 식을 만들어보자.
package Chapter06;
public class Lotto {
public static void main(String[] args) {
int[] lotto = new int[6];
int idx = 0;
while (true) {
int number =(int)(Math.random()*45) +1 ;
boolean insert = true ;
for (int i = 0; i<=idx; i++) {
if ( lotto[i] == number ) {
insert = false ;
break ;
}
}
if (insert) {
lotto[idx] = number;
idx++;
}
if(idx == 6) break;
}
for (int i=0; i<lotto.length; i++) {
System.out.println(lotto[i]);
}
}
}
lotto라는 이름의 배열 길이를 6칸으로 설정해주고. 넣을 수 있는 idx값을 0으로 설정해준다. 그리고 매스 랜덤을 이용하여 0부터 45까지의 수를 랜덤으로 뽑아주고 배열 6칸에 대입해주고 그것을 출력하게 해주는 것이다. 그리고 길이가 6이 되면 종료해준다.
8.2 다차원배열
이번에는 다차원배열이다.
값들이 지금까지는 한줄이였지만 다차원 배열이라는것은 2차원 이상의 배열을 말한다.
예를들어 이런 예제를 보자.
int[][] matrix = new int[3][3];
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[1][0] = 4;
matrix[1][1] = 5;
matrix[1][2] = 6;
matrix[2][0] = 7;
matrix[2][1] = 8;
matrix[2][2] = 9;
행렬 구조를 이해하면 쉬워진다. new int[3][3] 은 3x3 행렬 구조를 의미한다.
1 (0,0) | 2 (0,1) | 3 (0,2) |
4 (1,0) | 5 (1,1) | 6 (1,2) |
7 (2,0) | 8 (2,1) | 9 (2,2) |
이렇게 이해하면 쉽다.
8.3 배열 선언방식
배열 선언방식으로는 즉 배열초기화 방법은
1. 크기를 통한 초기화
int[] arr = new int[3];
이와 같이 int형의 arr이라는 배열의 값을 3칸이라는 크기로 초기화하는 방법.
2. 지정된 값을 통한 초기화
int[]arr = new int[]{1,2,3,4];
이와 같이 4칸짜리 로 만들며 0번 인덱스 -> 1, 1번 인덱스 ->2, 2번 인덱스 -> 3, 3번 인덱스 ->4 를 집어넣으며 초기화하는 방법이 있다.
8.4 배열 복사
이번에는 배열 복사에 대해서 알아보겠다.
한번 생성된 배열 객체는 개수를 늘리거나 줄일 수없다. 배열의 개수를 늘리려면, 새로운 배열을 생성해 값들을 복사해서 옮겨야한다.
예제를 보겠다.
package Chapter06;
public class ArrEx13 {
public static void main(String[] args) {
int[] arrInt = { 1, 2, 3 };
int[] arrInt2 = new int[5];
for (int i = 0; i < arrInt.length; i++) {
arrInt2[i] = arrInt[i];
}
for (int i = 0; i < arrInt2.length; i++) {
System.out.println(arrInt2[i]);
}
}
}
[실행 결과]
1
2
3
0
0
자 첫번째 방법이다. 설명을 하자면 int[] arrInt = { 1, 2, 3}; 이와 같이 원본 배열을 만들어주고 int [] arrInt2 = new int[5]; 이와 같이 복사할 배열을 만들어준다. 그리고 for문을 통해 복사할 배열의 원본의 값을 대입해주는 것이다. arrInt2 배열은 5칸배열이고 값은 int값으로 초기화되어 [0, 0, 0, 0, 0] 기본값으로 초기화되어있고, 1,2,3을 대입해줘서 출력결과가 1,2,3으로 나오는 것이다.