p192 - 195
배열 복사
public static void main(String[] args) {
int[] arr = new int[5];
// 크기 변경 할 수 X
// arr[0] ~ arr[4] = 0, 초기화
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*100)+1; // 1-100
}
System.out.println("arr=" + Arrays.toString(arr));
// 5개 더 사용해야 됨
int[] temp = new int[10];
// 복사1
for(int i=0; i<arr.length; i++)
{
temp[i]=arr[i];
}
System.out.println("temp=" + Arrays.toString(temp));
// 복사2
int[] temp2 = new int[10];
System.arraycopy(arr, 0, temp2, 0, arr.length); // 라이브러리
// arr: 복사 할
// temp2: 복사 해서 갖다 붙일
System.out.println("temp2=" + Arrays.toString(temp2));
}
arr=[57, 48, 87, 14, 43]
temp=[57, 48, 87, 14, 43, 0, 0, 0, 0, 0]
temp2=[57, 48, 87, 14, 43, 0, 0, 0, 0, 0]
p196 배열 활용
1. 총합과 평균
public static void main(String[] args) {
// 배열 선언
int[] arr = new int[10];
// 초기화
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*100)+1;
}
// 확인
System.out.println("arr=" + Arrays.toString(arr));
// 처리
// 총합, 평균 구해서 저장 할 변수 필요
int total=0;
double avg=0.0;
for(int i:arr)
{
total+=i;
}
avg=total/10.0;
// 출력
System.out.println("총합: " + total);
System.out.printf("평균: %.2f\n", avg);
}
2. 최대값과 최소값
arr=[21, 96, 16, 50, 30, 93, 44, 60, 57, 88]
최대 값: 96
최소 값: 16
public static void main(String[] args) {
int[] arr = new int[10];
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*100)+1;
}
// 처리 → 결과 값 도출
int min=100;
int max=0;
for(int i:arr)
{
if(max<i) // 10바퀴(i)를 돌아 max 값을 찾는다
max=i;
if(min>i)
min=i;
}
// 결과 값 출력
System.out.println("arr=" + Arrays.toString(arr));
System.out.println("최대 값: " + max);
System.out.println("최소 값: " + min);
}
3. 섞기(shuffle)
lotto(중복O)=[13, 12, 31, 37, 3, 11]
lotto(중복X)=[2, 18, 29, 33, 6, 16]
lotto(정렬)=[2, 6, 16, 18, 29, 33]
public static void main(String[] args) {
int[] lotto = new int[6];
// 중복O
for(int i = 0; i<lotto.length; i++)
{
lotto[i]=(int)(Math.random()*45) + 1;
}
System.out.println("lotto(중복O)=" + Arrays.toString(lotto));
// 중복X
int su=0; // 난수를 저장하는 변수
boolean bCheck=false; // 중복 여부 확인 변수
for(int i=0; i<lotto.length; i++)
{
bCheck=true;
while(bCheck) // 중복이 없을 때까지 난수 발생
{
su=(int)(Math.random()*45)+1;
bCheck=false;
// 중복 있는지 검사
for(int j=0; j<i; j++)
{
if(lotto[j]==su)
{
bCheck=true;
break;
}
}
}
lotto[i]=su;
}
System.out.println("lotto(중복X)=" + Arrays.toString(lotto));
// 중복X, 정렬 (실제 로또 번호 같이)
for(int i=0; i<lotto.length-1; i++)
{
for(int j=i+1; j<lotto.length; j++)
{
int temp=lotto[i];
lotto[i]=lotto[j];
lotto[j]=temp;
}
}
Arrays.sort(lotto);
System.out.println("lotto(정렬)=" + Arrays.toString(lotto));
}
4. 임의의 값으로 배열 채우기
배열을 연속적인 범위의 임의의 값으로 채우는 것은 아래와 같이 random() 사용하면 된다.
for(i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*5); // 0-4
}
그럼, 불연속적인 값들로 배열을 채우는 건 어떻게 할까? 배열을 하나 더 사용하면 된다. 먼저 배열 code에 불연속적인 값들을 담고, 임의로 선택된 index에 저장된 값으로 배열 arr의 요소들을 하나씩 채운다. 저장된 값에 상관없이 배열의 index는 항상 연속적이기 때문이다. 아래 예제를 보자.
public static void main(String[] args) {
int[] code = {-4, -1, 3, 6, 11};
int[] arr = new int[10];
for(int i=0; i<arr.length; i++)
{
int tmp=(int)(Math.random() * code.length); // code.length → 5
arr[i] = code[tmp];
}
System.out.println(Arrays.toString(arr));
}
[3, 3, -1, 3, 3, 3, 6, 11, -4, -4] // 실행할 때마다 바뀐다
배열 code의 길이가 5이므로 code.length의 값은 5가 된다. 따라서 변수 tmp에는 0~4 범위에 속한 임의의 정수가 저장되는데, 이 범위는 배열 code의 index 범위와 일치한다.
5. 정렬하기(sort) → 오름차순, 내림차순으로 배열 정렬
8102300907
1023008079
0120030789
0100203789
0001023789
0000123789
public static void main(String[] args) {
int[] arr = new int[10];
for(int i=0; i<arr.length; i++)
{
System.out.print(arr[i] = (int)(Math.random()*10));
}
System.out.println();
for(int i=0; i<arr.length-1; i++)
{
boolean changed = false;
for(int j=0; j<arr.length-1-i; j++)
{
if(arr[j] > arr[j+1]) // 옆의 값이 작으면 서로 바꾼다
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
changed = true; // 자리 바꿈이 발생했으니 changed를 true로
}
} // end for j
if (!changed) break; // 자리 바꿈이 없으면 반복문을 벗어난다
for(int k=0; k<arr.length; k++)
System.out.print(arr[k]);
System.out.println();
}
}
비교 작업(아래 for문)을 반복할수록 비교해야 하는 범위는 하나씩 줄어든다. 그래서 원래는 배열의 길이에서 1이 작은 'arr.length-1' 번을 비교해야 하는데, 매 반복마다 비교 횟수가 1씩 줄어들기 때문에 바깥쪽 for문의 제어 변수 i를 뺀다.
for(int j=0; j<arr.length-1-i; j++)
// arr[j]와 바로 옆의 요소 arr[j+1]을 비교한다
{
if(arr[j] > arr[j+1] // 왼쪽 값이 크면 서로 바꾼다
{
int tmp = arr[j];
arr[j] = arr[j+1]
arr[j+1] = tmp;
}
}
위의 작업이 한번 수행되는 것만으로는 정렬이 되지 않기 때문에 비교 작업(위의 for문)을 모두 4번,
즉, '배열의 길이-1'번 만큼 반복해서 비교해야 한다. 그래서 바깥쪽 for문의 조건식이 'arr.length-1'이어야 한다.
public static void main(String[] args) {
for(int i=0; i<arr.length; i++)
{
changed = false; // 매 반복마다 changed를 false로 초기화 한다
for(int j=0; j<arr.length-1-i; i++)
{
if(arr[j] > arr[j+1] // 옆의 값이 작으면 서로 바꾼다
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
changed = true; // 자리바꿈이 발생했으니 changed를 true로 바꾼다
}
}
} // end for j
if (!changed) break; // 자리바꿈이 없으면 반복문을 벗어난다
for(int k=0; k<arr.length; k++)
System.out.print(arr[k]); // 정렬된 결과 출력한다
System.out.println();
} // end of for i
효율적인 작업 위해 changed라는 boolean 변수 두어서 자리 바꿈이 없으면 break문 수행해 정렬 마치도록 한다.
이 정렬 방법을 '버블 정렬 bubble sort'라고 하는데, 비효율적이지만 가장 간단하다.
6. 빈도수 구하기 → 배열에 어떤 값이 몇 개 저장되어 있는지 세서 보여준다.
arr=[7, 0, 1, 1, 5, 5, 4, 3, 8, 4]
count=[1, 2, 0, 1, 2, 2, 0, 1, 1, 0]
// 차례대로 1, 2, 3, 4, 5, 6, 7, 8, 9 개수 출력
// 임의의 수 : 10(0-9)
public static void main(String[] args) {
int[] arr = new int[10];
int[] count = new int[10];
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*10); //0-9
}
System.out.println("arr=" + Arrays.toString(arr));
// 빈도 수 구하기
for(int i:arr)
{
count[i]++;
}
System.out.println("count=" + Arrays.toString(count)); // 각 arr 개수 차례대로 구하기
}
심화_ 배열 순서대로 정렬 + 개수 구하기
public static void main(String[] args) {
int[] arr = new int[10];
int[] count = new int[10];
// 1. 난수 10개 "순서대로" 정렬
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*10);
}
for(int i=0; i<arr.length-1; i++)
{
for(int j=i+1; j<arr.length; j++)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
Arrays.sort(arr);
System.out.println("arr=" + Arrays.toString(arr));
// 2. 개수 세기
for(int i:arr)
{
count[i]++;
}
System.out.println("count=" + Arrays.toString(count));
}
교재에 없는
이진 법 구하기_고급
0-32767 사이의 정수 입력: 100
0000 0000 0110 0100 // 100의 이진법
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] binary = new int[16];
System.out.print("0-32767 사이의 정수 입력: ");
int input = sc.nextInt();
System.out.println(Integer.toBinaryString(input)); // 이진법 라이브러리
int index = 15; // 뒤에서부터 값 입력 15 14..
while(true)
{
binary[index] = input%2; // 나누고 나머지 값 저장
input/=2; // 2로 나눔
if(input==0)
break;
index--; // index 감소시키기
}
for(int i=0; i<binary.length; i++)
{
if(i%4==0 && i!=0)
System.out.print(" ");
System.out.print(binary[i]);
}
}
달력 만들기_고급2
달력 구현 과정
1. 2022.5 입력 시 → 5월 1일부터 센다 → 무슨 요일인지 확인한다 2. 전달까지 총 날 수 5 → 1, 2, 3, 4 3. +1 4. 총 날 수%7 → 요일 구하기 5. 0-6 → 0(일) - 6(토) 6. 달력 출력 |
년도 입력: 2022
월 입력: 2
2022년도 2월
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("년도 입력: ");
int year = sc.nextInt();
System.out.print("월 입력: ");
int month = sc.nextInt();
// 요일 구하기
char[] strWeek = {'일', '월', '화', '수', '목', '금', '토'};
System.out.println(year + "년도 " + month + "월");
System.out.println("\n");
for(char c:strWeek)
{
System.out.print(c+"\t"); // 요일 정렬
}
// 1. 전 년도까지 총 날 수 구하기
int total = (year-1)*365
+(year-1)/4
-(year-1)/100
+(year-1)/400;
// 2. 전 달까지 총 날 수 구하기
int[] lastday = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if((year%4==0 && year%100!=0) || (year%400==0))
{
// 윤년이면 → 29
lastday[1]=29; // 2월 29일
}
else
{
// 윤년이 아니면 → 28
lastday[1]=28; // 2월 28일
}
for(int i=0; i<month-1; i++)
{
total+=lastday[i]; // 전 달까지 합
}
// 3. +1
total++;
// -------- 누적 %7
int week = total%7;
System.out.println();
// System.out.println(year + "년도 " + month + "월 1일은 " + strWeek[week] + "입니다.");
// 0~6 0(일) - 6(토)
// 달력 출력
for(int i=1; i<=lastday[month-1]; i++)
{
if(i==1)
{
for(int j=0; j<week; j++)
{
System.out.print("\t");
}
}
System.out.printf("%2d\t", i);
week++;
if(week>6)
{
System.out.println();
week=0;
}
}
학생 3명의 국어, 영어, 수학 점수를 받아서 총점, 평균, 학점, 등수 출력하는 프로그램
_고급3
1번째 국어 점수 입력: 80
1번째 영어 점수 입력: 90
1번째 수학 점수 입력: 80
2번째 국어 점수 입력: 70
2번째 영어 점수 입력: 80
2번째 수학 점수 입력: 90
3번째 국어 점수 입력: 60
3번째 영어 점수 입력: 50
3번째 수학 점수 입력: 40
80 90 80 250 83.33 B 1
70 80 90 240 80.00 B 2
60 50 40 150 50.00 F 3
public static void main(String[] args) {
final int ROW=3;
int[] kor = new int[ROW];
int[] eng = new int[ROW];
int[] math = new int[ROW];
int[] total = new int[ROW];
double[] avg = new double[ROW];
char[] score = new char[ROW];
int[] rank = new int[ROW]; // 등수
// 값 입력 → 초기화
Scanner sc = new Scanner(System.in);
for(int i=0; i<ROW; i++)
{
System.out.printf("%d번째 국어 점수 입력: ", i+1);
kor[i] = sc.nextInt(); // i번째 사람의 점수
System.out.printf("%d번째 영어 점수 입력: ", i+1);
eng[i] = sc.nextInt();
System.out.printf("%d번째 수학 점수 입력: ", i+1);
math[i] = sc.nextInt();
// 총점
total[i] = kor[i] + eng[i] + math[i];
avg[i] = total[i]/(double)ROW;
// 학점
switch((int)(avg[i]/10))
{
case 10: case 9:
score[i]='A';
break;
case 8:
score[i]='B';
break;
case 7:
score[i]='C';
break;
case 6:
score[i]='D';
break;
default:
score[i]='F';
}
}
// 등수
for(int i=0; i<ROW; i++)
{
rank[i]=1; // 초기 값
for(int j=0; j<ROW; j++)
{
if(total[i]<total[j]) // 큰 게 나올 때마다
{
rank[i]++; // 등수 증가
}
}
}
// 출력
for(int i=0; i<ROW; i++)
{
System.out.printf("%-5d%-5d%-5d%-6d%-7.2f%-3c%-3d\n", // 5d% → 칸 만들기
kor[i], eng[i], math[i], total[i], avg[i], score[i], rank[i]);
}
}
문자열 String 배열
문자열 잘라서 추출
*변수에 값이 여러 개라 replace는 못 쓰고, substring, indexOf 써야하는 듯
public static void main(String[] args) {
String[] arr = {
"사과:apple",
"배:pear",
"밤:chestnut",
"잣:pine nut",
"호두:walnut",
"도토리:acorn",
"귤:tangerine",
"딸기:strawberry",
"파인애플:pineapple",
"포도:grape",
"복숭아:peach",
};
/*
* 한글 과일 명
* → substring (문자 자르는) 사용
*/
for(String f:arr)
{
String kor = f.substring(0, f.indexOf(":")); // 처음(0)부터 ":"까지 자르기
String eng = f.substring(f.indexOf(":")+1);
// indexOf(":") → ":" 자르기
System.out.println(kor + " → " + eng);
}
사과 → apple
배 → pear
밤 → chestnut
잣 → pine nut
호두 → walnut
도토리 → acorn
귤 → tangerine
딸기 → strawberry
파인애플 → pineapple
포도 → grape
복숭아 → peach
배열 예제
1. 정수 10개 저장하는 배열 만들고 1에서 10까지 범위의 정수를 랜덤하게 생성하여 배열에 저장한다.
그리고, 배열에 든 숫자들과 평균을 출력한다.
hint :
1에서 10까지 범위의 정수를 랜덤하게 생성할 때 다음 코드 이용
int i = (int)(Math.random()*10)+1;
arr = [9, 1, 8, 2, 5, 2, 3, 3, 10, 4]
평균: 4.7
public static void main(String[] args) {
int[] arr = new int[10];
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*10)+1;
}
System.out.println("arr = " + Arrays.toString(arr));
// 평균
double avg=0.0;
int total=0;
for(int i:arr)
{
total+=i;
}
avg=total/10.0;
System.out.println("평균: " + avg);
}
2. 임의의 정수를 배열로 선언하고 정렬해서 출력하는 프로그램
arr = [19, 47, 51, 75, 77]
public static void main(String[] args) {
int[] arr = new int[5];
for(int i=0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*100)+1;
}
Arrays.sort(arr);
System.out.println("arr = " + Arrays.toString(arr));
}
3. 다음 배열에서 최대 값, 최소 값 출력하는 프로그램
int[] num = {94, 85, 95, 88, 90};
-- 배열
최대 값: 95
최소 값: 85
public static void main(String[] args) {
int[] num = {94, 85, 95, 88, 90};
int min=100;
int max=0;
for(int i:num)
{
if(max<i)
max=i;
if(min>i)
min=i;
}
// 결과 값 출력
System.out.println("최대 값: " + max);
System.out.println("최소 값: " + min);
}
4. 10-99까지 정수 중에서 같은 자리의 정수 출력
11 22 33 44 55 66 77 88 99
// 제일 간단하고 권장 방법
public static void main(String[] args) {
for(int i=10; i<=99; i++)
{
int a=i/10;
int b=i%10;
if(a==b)
{
System.out.print(i + " ");
}
}
// 다른 방법
public static void main(String[] args) {
for(int i=10; i<=99; i++)
{
// valueOf: 정수를 문자열로 변환
String s = String.valueOf(i);
String[] ss = s.split(""); // {"1", "1"}
if(ss[0].equals(ss[1]))
{
System.out.print(i + " ");
}
}
// 다른 방법2
public static void main(String[] args) {
for(int i=10; i<=99; i++)
{
// valueOf: 정수를 문자열로 변환
String s = String.valueOf(i);
String s1 = s.substring(0,1);
String s2 = s.substring(1);
if(s1.equals(s2))
System.out.print(i+ " ");
}
}
// 다른 방법3
public static void main(String[] args) {
for(int i=10; i<=99; i++)
{
String s = String.valueOf(i);
char[] c = s.toCharArray();
if(c[0]==c[1])
System.out.print(i+ " ");
}
}
5. 100-999 사이의 4의 배수가 아닌 수의 개수, 합을 출력
합: 371250
개수: 675
public static void main(String[] args) {
int sum=0;
int count=0;
for(int i=100; i<=999; i++)
{
if(i%4!=0)
{
sum+=i;
count++;
}
}
System.out.println("합: " + sum);
System.out.println("개수: " + count);
}
// 다른 방법
public static void main(String[] args) {
int count=0;
int sum=0;
for(int i=100; i<=999; i++)
{
if(i%4==0)
continue;
sum+=i;
count++;
}
System.out.println("합: " + sum);
System.out.println("개수: " + count);
}
6. 100-999 사이의 7의 배수 합, 개수 출력
합: 70336
개수: 128
public static void main(String[] args) {
int sum=0;
int count=0;
for(int i=100; i<=999; i++)
{
if(i%7==0)
{
sum+=i;
count++;
}
}
System.out.println("합: " + sum);
System.out.println("개수: " + count);
}
7. 1-1000 사이의 7의 배수 합과 9의 배수 합 출력
-- for
7의 배수 합: 71071
9의 배수 합: 55944
public static void main(String[] args) {
int sum=0;
int sum2=0;
for(int i=1; i<=1000; i++)
{
if(i%7==0)
sum+=i;
if(i%9==0)
sum2+=i;
}
System.out.println("7의 배수 합: " + sum);
System.out.println("9의 배수 합: " + sum2);
}
내일 처음부터 다시 복습하는 날
'수업' 카테고리의 다른 글
+10 변수, 연산자, 제어문, 배열 [복습] (0) | 2022.05.16 |
---|---|
+9 문자열 배열 (0) | 2022.05.13 |
+7 배열, 크롤링 (0) | 2022.05.11 |
+6 반복문(2차 for, while) (0) | 2022.05.10 |
+5 제어문(선택문, 반복문) (0) | 2022.05.09 |