- 임의의 값으로 배열 채우기: for문을 활용하여 새로운 배열을 만들어주고, 기존 배열 [] 안에 랜덤*배열.length
- 예제
--- 인접한 거 비교해서 자리 바꾸기
--- 이번에 -1 씩 해서 반복 // 배열의 길이가 5라면, 4번만 비교하면 된다. 그리고 두번째에는 세번만 비교하면 된다......
● arraycopy 예제
public class Test {
public static void main(String[] args) {
char [] abc = {'A', 'B', 'C', 'D'};
char [] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8','9'};
System.out.println(abc);
System.out.println(num);
// 배열 abc 와 num을 붙여서 하나의 배열 (result)로 만든다.
char [] result = new char[abc.length + num.length];
System.arraycopy(abc, 0, result,0,abc.length);
System.arraycopy(num,0,result,abc.length, num.length);
System.out.println(result);
// 배열 abc를 배열 num의 첫번째 위치부터 배열 abc의 길이만큼 복사
System.arraycopy(abc,0,num,0,abc.length);
System.out.println(num);
// number의 인덱스 6 위치에 3개를 복사
System.arraycopy(abc, 0, num, 6, 3);
System.out.println(num);
}
}
// arraycopy: 무슨 배열을, 인덱스 어디서부터, 어디 배열에, 인덱스 어디서부터, 얼마나
// 배열.length를 최대한 활용
// num은 전역변수 이기 때문에 계속해서 값을 갱신해나가는 것이다.
// arraycopy는 해당 배열 객체의 주소에 접근하여 값 변경
● 총점과 평균 구하기
public class Test {
public static void main(String[] args) {
int[] arr = {100, 88, 100, 100, 90};
int sum = 0;
float average = 0; // 초기화해주기!!
for(int i = 0; i<arr.length; i++){
sum += arr[i];
}
average = sum/(float)arr.length;
System.out.println("총점: "+ sum);
System.out.println("평균: "+ average);
}
}
// 값을 초기화해주지않으면 발생하는 에러: java: variable sum might not have been initialized
// average를 for문에 넣어버리면 분모를 0으로 대입하는 불상사가!!
// 여기에 들어가는게 맞는지 꼭 검토하기!
● 최대값과 최소값 예제
public class Test {
public static void main(String[] args) {
int[] score = {79, 88, 91, 33, 100, 55, 85};
int max = score[0];
int min = score[0];
for(int i=1; i<score.length;i++){
if(max<score[i]){
max = score[i];
}
if(min>score[i])
min = score[i];
}
System.out.println("최대값: "+ max);
System.out.println("최소값: "+ min);
}
}
// 처음에는 일일이 정렬해주려고 했었다.
// 하지만 그냥 처음 값으로 초기화하고 배열 요소 하나하나 접근하면서
// 보다 크면 Max는 걔로 바꾸고, 작으면 Min은 걔로 바꾸고!!
// ==> 센스인 것 같다.
==> 내 방식대로 풀어본 것. 오름차순으로 정렬해주고나서 앞과 끝을 구하는!
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] score = {79, 88, 91, 33, 100, 55, 85};
for(int j=6; j>0;j--)
for(int i=0; i<j; i++)
if (score[i]>score[i+1]){
int tmp = score[i];
score[i]= score[i+1];
score[i+1]=tmp;
}
System.out.println(Arrays.toString(score));
System.out.println("최대값: "+ score[6]);
System.out.println("최소값: "+ score[0]);
}
}
// 배열의 각 요소 출력: sop(메소드 Arrays.toString(배열이름))
// 그냥 배열을 출력하면 타입@주소 형식으로 출력
결과
[33, 55, 79, 85, 88, 91, 100]
최대값: 100
최소값: 33
● 셔플
- int tmp = 0; 으로 먼저 전역변수 초기화 해도 되고 for문에 int tmp 로 해도 될듯(근데 메모리 측면에서 이게 낫겠지?)
- 임시변수와 자릿수를 전역변수로 초기화하면 가독성은 좋다. for문 안에 넣으면 메모리측면에서는 좋을듯
- random 돌릴 횟수는 최대한 많이할 필요는 없다. 그냥 int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; 정도만 해주면..
//로또 예제
import java.util.*;
public class Test {
public static void main(String[] args) {
int [] arr = new int[45];
for (int i=0; i<arr.length; i++){
arr[i] = i+1;
}
for (int i=0; i<6; i++){
int j = (int)(Math.random()*45);
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
for(int i=0; i<6; i++)
System.out.println("Ball["+i+"]: "+arr[i]);
//System.out.printf("Ball[%d]: %d%n", i, arr[i]);
}
}
// 문제가 어떻게하면 중복이 되지않게하는지가 ....
// 중복 불가 + for문을 통해 랜덤에서 숫자 여섯을 뽑는다.
// 나의 생각: 0~45번까지 배열을 만들고 하나 뽑을 때마다 없애기?
// => 비슷했으나,,,,
// 0~45번까지 배열을 만들고, 0~5번 인덱스에 해당하는 걸 랜덤 n의 인덱스 값과 바꿔주면 된다.
● 버블 정렬 알고리즘
- 중첩 for문이 어떻게 돌아가는지 잘 파악!
- 계속 반복되게 하려면 boolean과 break를 적극 활용
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] numArr = new int[10];
for (int i = 0; i < numArr.length; i++) {
System.out.print(numArr[i] = (int)(Math.random() * 10));
}
System.out.println();
for (int i = 0; i < numArr.length - 1; i++) {
boolean changed = false; // 처음에 false라고 놓고, 다음 for문으로 인해 막힘.
for (int j = 0; j < numArr.length -1-i; j++) {
if (numArr[j] > numArr[j + 1]) {
int temp = numArr[j];
numArr[j] = numArr[j + 1];
numArr[j + 1] = temp;
changed = true;
} // if에 해당하는 경우에만 자리바꿈 실행.
// 얼마나 실행하는지는 매번 바뀐다. start가 갈 수 있는 때까지 가야하기에
// for i문이 계속 반복되는데, 여기서 자리바꿈 x면 changed = false 상태가 된다.
}
if (!changed) break; // changed = true인 경우, 그냥 지나가고 밑 for문 실행
for (int k: numArr) {
System.out.print(numArr[k]);
} // 그냥 가진 요소를 출력하는 것이기에 향상된 for문 사용해도 된다.
System.out.println();
}
}
}
// 자리바꿈이 없어질 때까지 자리바꿈이 생길 때마다 계속 출력하는 구만
// 처음에 배열을 생성하고 배열 안에 random 하게 요소들을 채운다.
// 정렬을 하려면 처음에 최대 배열의 크기-1번만큼 자리를 바꿔줘야한다.
// 그리고 1번씩 감소하면서 자리 바꿔준다.
// 출력: 처음에 배열 만들 때 출력, 그리고 한번 정렬될 때 결과 출력
=> 자리바꿈없는(break)때까지 계속!
● 빈도수 구하기
import java.util.*;
public class Test {
public static void main(String[] args) {
int [] arr = new int [10];
int [] counter = new int [10];
for(int i=0; i<arr.length; i++){
arr[i] = (int)(Math.random()*10);
}
System.out.println(Arrays.toString(arr));
for(int i=0; i<counter.length; i++){
counter[arr[i]]++;
}
for(int i=0; i<counter.length; i++){
System.out.printf("%d의 개수: %d%n", i, counter[i]);
}
}
}
// 빈도수 구하기: 0이면, counter[0]에 갯수를 구하면 된다.
● 자바의 정석 EX 5_13(16진수를 2진수로 바꾸는 예제), 5_15(문자열을 모스 부호로 변환)
- 공통적으로 바꿀 배열과 변환에 참고할 배열을 생성
- 인덱스를 잘 설정할 것!!(char타입인 경우, 숫자일 떄와 영문자일 떄) + 문자열화하기 위해 초기화할 때, "" 잊지 않기
- charAt 메서드는 char타입으로 결과가 반환되는 것이지 char배열에서만 쓸 수 있는 메서드가 아니다!
● 사칙연산 대입 예제
- 커맨드라인에서부터 매개변수를 넣기위해 modify run configuartion 사용. 매개변수를 입력할 때는 띄어쓰기!
- 사칙 연산 시, O(피연산자) o(문자) O(피연산자)
=>> 피연산자: 문자열->숫자, 문자: 문자열->문자 화 필요하다! // 커맨드라인으로부터 입력받은 데이터가 문자열!!
import java.util.*;
public class Test {
public static void main(String[] args) {
if (args.length !=3){
System.out.println("usage: java ArrayEx17 NUM1 OP NUM2");
System.exit(0);
}
System.out.println(Arrays.toString(args));
int num1 = Integer.parseInt(args[0]);
char op = args[1].charAt(0);
int num2 = Integer.parseInt(args[2]);
int result = 0;
switch (op){
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case 'x':
result = num1 * num2;
break;
case '/':
result = num1/num2;
break;
default :
System.out.println("허용되지않는 연산입니다.");
}
System.out.println("결과: "+ result);
}
}
//결과
// [3, x++, 7] => 사칙연산에 뭘 넣어도 첫번째 요소로 // args 배열
// 결과: 21
//
● 다차원 배열의 생성과 초기화, 그리고 각각의 값을 출력 및 합계
import java.util.*;
public class Test {
public static void main(String[] args) {
int[][] score = {
{100, 100, 100},
{20, 20, 20},
{30, 30, 30},
{40, 40, 40}
};
int sum = 0;
for(int i=0; i<score.length; i++) {
for (int j = 0; j < score[i].length; j++) {
System.out.printf("score[%d][%d]= %d%n", i, j, score[i][j]);
}
}
// i, j는 인덱스를 활용하기위해 있다.
// 배열을 행으로 놓고, 작은 반복구조에서 각 행에 있는 요소에 접근,
// 큰 반복구조에서는 각 행에 접근
for (int [] tmp : score) {
for (int i : tmp) {
sum += i;
}
// 향상된 for문에서 int i는 행에 있는 각 요소를 말한다.
// int [] tmp는 score 다차원 배열에 있는 각 행을 말한다.
}
System.out.println("sum= "+ sum);
}
}
// 다차원 배열을 반복문으로 다루려면 중첩 반복문을 쓸 수밖에 없다.
// 중첩 for문과 향상된 for문이 어떻게 작동하는지 구조를 잘 이해할 것!
● 다차원 배열의 활용 예제: 5-19(반복구조 나눠주기!, 특정 반복문에 어떤 걸 던져줘야하는지 생각해야한다.), 5-20, 5-21, 5-22, 5-23 ⇒ 힘들어서 이 부분을 못 봤다.
'예제 노트 > Java 예제' 카테고리의 다른 글
Java 예제 Ch 4 조건문, 반복문 (0) | 2021.10.21 |
---|---|
Java 예제 ch 3 연산자 예제 (0) | 2021.10.20 |
댓글