목차
61p 연습문제Q2 <기본자료구조-배열역순정렬>
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
static void swap(int[]a,int b1, int b2){
int t = a[b1];
a[b1] = a[b2];
a[b2] = t;
}
static void reverse(int[]a) {
System.out.println(Arrays.toString(a));
for(int i =0; i<a.length/2; i++) {
System.out.println("a[" + i + "]와 a[" + (a.length - i - 1) + "]을 교환합니다.");
swap(a,i,a.length-i-1);
System.out.println(Arrays.toString(a));
}
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("요솟수:");
int num = stdIn.nextInt();
int[] x = new int[num];
for(int i=0; i<num; i++) {
System.out.println("x"+i+"] :");
x[i] = stdIn.nextInt();
}
reverse(x);
System.out.println("역순 정렬을 마쳤습니다.");
}
}
요솟수:6
x0] :
5
x1] :
10
x2] :
73
x3] :
2
x4] :
-5
x5] :
42
[5, 10, 73, 2, -5, 42]
a[0]와 a[5]을 교환합니다.
[42, 10, 73, 2, -5, 5]
a[1]와 a[4]을 교환합니다.
[42, -5, 73, 2, 10, 5]
a[2]와 a[3]을 교환합니다.
[42, -5, 2, 73, 10, 5]
역순 정렬을 마쳤습니다.
72p실습2-9 소수구분하는코드(1) < 기본자료구조-소수인지 판단 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
public static void main(String[] args) {
int counter = 0; // 나눗셈 횟수
for (int n = 2; n <= 1000; n++) {
int i;
for (i = 2; i < n; i++) {
counter++;
if (n % i == 0) // 나누어떨어지면 소수가 아님
break; // 반복은 더 이상 불필요
}
if (n == i) // 마지막까지 나누어떨어지지 않음
System.out.println(n);
}
System.out.println("나눗셈을 수행한 횟수 : " + counter);
}
}
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
나눗셈을 수행한 횟수 : 78022
75p 실습 2-10 소수구분하는 코드(2) < 기본자료구조-소수인지 판단 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
public static void main(String[] args) {
int counter =0; //나눗셈의 횟수
int ptr =0; //찾은 소수의 개수
int[] prime = new int[500]; //소수를 저장하는 배열
prime[ptr++]=2;//2도 소수이기 때문에 ptr에 2를 하나 넣어준것.
for(int n=3; n<=1000; n+=2) { //n+=2는 홀수만 대상으로한다 만약 n++라고 하려면 아래 반복문에 i값을 0으로 하면됨.
int i;
for(i=1;i<ptr;i++) {//이미 찾은 소수로만 나눠봄
counter++;
if(n%prime[i]==0) {//나누어 떨어지면 소수가 아니기에 break함
break;
}
}
if(ptr==i) { //반복문이 끝나서 나왔다는 것은 마지막까지 나누어 떨어지지않았다는 것.
prime[ptr++]=n;//소수라고배열에 저장
}
}
for(int i=0;i<ptr; i++) {
System.out.println(prime[i]);
}
System.out.println("나눗셈을 수행한 횟수:"+counter);
System.out.println(ptr);
}
}
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
나눗셈을 수행한 횟수:14622
168
78p 실습2-11 소수구분하는코드(3) < 기본자료구조-소수인지 판단 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
public static void main(String[] args) {
int counter =0; //곱셈과 나눗셈의 횟수
int ptr =0; //찾은 소수의 개수
int[] prime = new int[500]; //소수를 저장하는 배열
prime[ptr++]=2;//2도 소수이기 때문에 ptr에 2를 하나 넣어준것.
prime[ptr++]=3;//3역시 소수
for(int n=5; n<=1000; n+=2) { //n+=2는 홀수만 대상으로한다
boolean flag = false;
for(int i=1;prime[i]*prime[i]<=n;i++) {//이미 찾은 소수로만 나눠봄
counter+=2;
if(n%prime[i]==0) {//나누어 떨어지면 소수가 아니기에 break함
flag = true;
break;
}
}
if(!flag) { //반복문이 끝나서 나왔다는 것은 마지막까지 나누어 떨어지지않았다는 것.
prime[ptr++]=n;//소수라고배열에 저장
counter++;
}
}
for(int i=0;i<ptr; i++) {
System.out.println(prime[i]);
}
System.out.println("나눗셈을 수행한 횟수:"+counter);
System.out.println(ptr);
}
}
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
나눗셈을 수행한 횟수:3774
168
82p 실습 2-13 한 해의 경과일 수를 구하는 프로그램 < 기본자료구조-다차원배열>
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
//각 달의 일 수
static int[][] mdays = {
{31,28,31,30,31,30,31,31,30,31,30,31},//평년
{31,29,31,30,31,30,31,31,30,31,30,31},//윤년
};
//서기 year년은 윤년인가(윤년 :1 / 평년: 0)
static int isleap(int year) {
if(year%4==0 && year%100 !=0 ||year%400 ==0) {
return 1;
}else {
return 0;
}
}
//서기 y년 m월 d일의 그 해 경과 일 수를 구함
static int dayOfyear(int y,int m,int d) {
int days =d;
//총 몇일이 지났는지
for(int i=1;i<m;i++) {
days +=mdays[isleap(y)][i-1];//[년도][월]
}
return days;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int retry;
System.out.println("그 해 경과 일수를 구합니다.");
do {
System.out.print("년:");
int year = stdIn.nextInt();
System.out.print("월:");
int month = stdIn.nextInt();
System.out.print("일:");
int day = stdIn.nextInt();
System.out.printf("그 해 %d 일 째 입니다.\\n",dayOfyear(year,month,day));
System.out.print("한 번 더할까요?(1.예/0.아니오):");
retry = stdIn.nextInt();
}while(retry==1);
}
}
그 해 경과 일수를 구합니다.
년:2019
월:3
일:15
그 해 74 일 째 입니다.
한 번 더할까요?(1.예/0.아니오):1
년:2024
월:04
일:11
그 해 102 일 째 입니다.
한 번 더할까요?(1.예/0.아니오):0
91p 실습2-14 클래스의 배열(신체검사 데이터용 클래스 배열에서 평균키와 시력의분포)
< 기본자료구조-클래스의 배열 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
static final int VMAX = 21; // 시력의 분포(0.0부터 0.1 단위로 21개)
static class PhyscData {
String name; // 이름
int height; // 키
double vision; // 시력
//--- 생성자(constructor) ---//
PhyscData(String name, int height, double vision) {
this.name = name;
this.height = height;
this.vision = vision;
}
}
//--- 키의 평균값을 구함 ---//
static double aveHeight(PhyscData[] dat) {
double sum = 0;
for (int i = 0; i < dat.length; i++)
sum += dat[i].height;
return sum / dat.length;
}
//--- 시력의 분포를 구함 ---//
static void distVision(PhyscData[] dat, int[] dist) {
int i = 0;
dist[i] = 0;
for (i = 0; i < dat.length; i++)
if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX / 10.0)
dist[(int)(dat[i].vision * 10)]++;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
PhyscData[] x = {
new PhyscData("강민하", 162, 0.3),
new PhyscData("김찬우", 173, 0.7),
new PhyscData("박준서", 175, 2.0),
new PhyscData("유서범", 171, 1.5),
new PhyscData("이수연", 168, 0.4),
new PhyscData("장경오", 174, 1.2),
new PhyscData("황지안", 169, 0.8),
};
int[] vdist = new int[VMAX]; // 시력의 분포
System.out.println("■ 신체검사 리스트 ■");
System.out.println(" 이름 키 시력");
System.out.println("--------------------");
for (int i = 0; i < x.length; i++)
System.out.printf("%-6s%3d%5.1f\\n",
x[i].name, x[i].height, x[i].vision);
System.out.printf("\\n평균 키: %5.1fcm\\n", aveHeight(x));
distVision(x, vdist); // 시력의 분포를 구함
System.out.println("\\n시력 분포");
for (int i = 0; i < VMAX; i++)
System.out.printf("%3.1f~: %2d명\\n", i / 10.0, vdist[i]);
}
}
■ 신체검사 리스트 ■
이름 키 시력
--------------------
강민하 162 0.3
김찬우 173 0.7
박준서 175 2.0
유서범 171 1.5
이수연 168 0.4
장경오 174 1.2
황지안 169 0.8
평균 키: 170.3cm
시력 분포
0.0~: 0명
0.1~: 0명
0.2~: 0명
0.3~: 1명
0.4~: 1명
0.5~: 0명
0.6~: 0명
0.7~: 1명
0.8~: 1명
0.9~: 0명
1.0~: 0명
1.1~: 0명
1.2~: 1명
1.3~: 0명
1.4~: 0명
1.5~: 1명
1.6~: 0명
1.7~: 0명
1.8~: 0명
1.9~: 0명
2.0~: 1명
'Do it! 자료구조와 함께 배우는 알고리즘 입문' 카테고리의 다른 글
<01> 기본 알고리즘 (0) | 2024.04.23 |
---|
61p 연습문제Q2 <기본자료구조-배열역순정렬>
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
static void swap(int[]a,int b1, int b2){
int t = a[b1];
a[b1] = a[b2];
a[b2] = t;
}
static void reverse(int[]a) {
System.out.println(Arrays.toString(a));
for(int i =0; i<a.length/2; i++) {
System.out.println("a[" + i + "]와 a[" + (a.length - i - 1) + "]을 교환합니다.");
swap(a,i,a.length-i-1);
System.out.println(Arrays.toString(a));
}
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("요솟수:");
int num = stdIn.nextInt();
int[] x = new int[num];
for(int i=0; i<num; i++) {
System.out.println("x"+i+"] :");
x[i] = stdIn.nextInt();
}
reverse(x);
System.out.println("역순 정렬을 마쳤습니다.");
}
}
요솟수:6
x0] :
5
x1] :
10
x2] :
73
x3] :
2
x4] :
-5
x5] :
42
[5, 10, 73, 2, -5, 42]
a[0]와 a[5]을 교환합니다.
[42, 10, 73, 2, -5, 5]
a[1]와 a[4]을 교환합니다.
[42, -5, 73, 2, 10, 5]
a[2]와 a[3]을 교환합니다.
[42, -5, 2, 73, 10, 5]
역순 정렬을 마쳤습니다.
72p실습2-9 소수구분하는코드(1) < 기본자료구조-소수인지 판단 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
public static void main(String[] args) {
int counter = 0; // 나눗셈 횟수
for (int n = 2; n <= 1000; n++) {
int i;
for (i = 2; i < n; i++) {
counter++;
if (n % i == 0) // 나누어떨어지면 소수가 아님
break; // 반복은 더 이상 불필요
}
if (n == i) // 마지막까지 나누어떨어지지 않음
System.out.println(n);
}
System.out.println("나눗셈을 수행한 횟수 : " + counter);
}
}
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
나눗셈을 수행한 횟수 : 78022
75p 실습 2-10 소수구분하는 코드(2) < 기본자료구조-소수인지 판단 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
public static void main(String[] args) {
int counter =0; //나눗셈의 횟수
int ptr =0; //찾은 소수의 개수
int[] prime = new int[500]; //소수를 저장하는 배열
prime[ptr++]=2;//2도 소수이기 때문에 ptr에 2를 하나 넣어준것.
for(int n=3; n<=1000; n+=2) { //n+=2는 홀수만 대상으로한다 만약 n++라고 하려면 아래 반복문에 i값을 0으로 하면됨.
int i;
for(i=1;i<ptr;i++) {//이미 찾은 소수로만 나눠봄
counter++;
if(n%prime[i]==0) {//나누어 떨어지면 소수가 아니기에 break함
break;
}
}
if(ptr==i) { //반복문이 끝나서 나왔다는 것은 마지막까지 나누어 떨어지지않았다는 것.
prime[ptr++]=n;//소수라고배열에 저장
}
}
for(int i=0;i<ptr; i++) {
System.out.println(prime[i]);
}
System.out.println("나눗셈을 수행한 횟수:"+counter);
System.out.println(ptr);
}
}
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
나눗셈을 수행한 횟수:14622
168
78p 실습2-11 소수구분하는코드(3) < 기본자료구조-소수인지 판단 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
public static void main(String[] args) {
int counter =0; //곱셈과 나눗셈의 횟수
int ptr =0; //찾은 소수의 개수
int[] prime = new int[500]; //소수를 저장하는 배열
prime[ptr++]=2;//2도 소수이기 때문에 ptr에 2를 하나 넣어준것.
prime[ptr++]=3;//3역시 소수
for(int n=5; n<=1000; n+=2) { //n+=2는 홀수만 대상으로한다
boolean flag = false;
for(int i=1;prime[i]*prime[i]<=n;i++) {//이미 찾은 소수로만 나눠봄
counter+=2;
if(n%prime[i]==0) {//나누어 떨어지면 소수가 아니기에 break함
flag = true;
break;
}
}
if(!flag) { //반복문이 끝나서 나왔다는 것은 마지막까지 나누어 떨어지지않았다는 것.
prime[ptr++]=n;//소수라고배열에 저장
counter++;
}
}
for(int i=0;i<ptr; i++) {
System.out.println(prime[i]);
}
System.out.println("나눗셈을 수행한 횟수:"+counter);
System.out.println(ptr);
}
}
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
나눗셈을 수행한 횟수:3774
168
82p 실습 2-13 한 해의 경과일 수를 구하는 프로그램 < 기본자료구조-다차원배열>
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
//각 달의 일 수
static int[][] mdays = {
{31,28,31,30,31,30,31,31,30,31,30,31},//평년
{31,29,31,30,31,30,31,31,30,31,30,31},//윤년
};
//서기 year년은 윤년인가(윤년 :1 / 평년: 0)
static int isleap(int year) {
if(year%4==0 && year%100 !=0 ||year%400 ==0) {
return 1;
}else {
return 0;
}
}
//서기 y년 m월 d일의 그 해 경과 일 수를 구함
static int dayOfyear(int y,int m,int d) {
int days =d;
//총 몇일이 지났는지
for(int i=1;i<m;i++) {
days +=mdays[isleap(y)][i-1];//[년도][월]
}
return days;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int retry;
System.out.println("그 해 경과 일수를 구합니다.");
do {
System.out.print("년:");
int year = stdIn.nextInt();
System.out.print("월:");
int month = stdIn.nextInt();
System.out.print("일:");
int day = stdIn.nextInt();
System.out.printf("그 해 %d 일 째 입니다.\\n",dayOfyear(year,month,day));
System.out.print("한 번 더할까요?(1.예/0.아니오):");
retry = stdIn.nextInt();
}while(retry==1);
}
}
그 해 경과 일수를 구합니다.
년:2019
월:3
일:15
그 해 74 일 째 입니다.
한 번 더할까요?(1.예/0.아니오):1
년:2024
월:04
일:11
그 해 102 일 째 입니다.
한 번 더할까요?(1.예/0.아니오):0
91p 실습2-14 클래스의 배열(신체검사 데이터용 클래스 배열에서 평균키와 시력의분포)
< 기본자료구조-클래스의 배열 >
package kr.bin;
import java.util.*;
import java.io.*;
class solution {
static final int VMAX = 21; // 시력의 분포(0.0부터 0.1 단위로 21개)
static class PhyscData {
String name; // 이름
int height; // 키
double vision; // 시력
//--- 생성자(constructor) ---//
PhyscData(String name, int height, double vision) {
this.name = name;
this.height = height;
this.vision = vision;
}
}
//--- 키의 평균값을 구함 ---//
static double aveHeight(PhyscData[] dat) {
double sum = 0;
for (int i = 0; i < dat.length; i++)
sum += dat[i].height;
return sum / dat.length;
}
//--- 시력의 분포를 구함 ---//
static void distVision(PhyscData[] dat, int[] dist) {
int i = 0;
dist[i] = 0;
for (i = 0; i < dat.length; i++)
if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX / 10.0)
dist[(int)(dat[i].vision * 10)]++;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
PhyscData[] x = {
new PhyscData("강민하", 162, 0.3),
new PhyscData("김찬우", 173, 0.7),
new PhyscData("박준서", 175, 2.0),
new PhyscData("유서범", 171, 1.5),
new PhyscData("이수연", 168, 0.4),
new PhyscData("장경오", 174, 1.2),
new PhyscData("황지안", 169, 0.8),
};
int[] vdist = new int[VMAX]; // 시력의 분포
System.out.println("■ 신체검사 리스트 ■");
System.out.println(" 이름 키 시력");
System.out.println("--------------------");
for (int i = 0; i < x.length; i++)
System.out.printf("%-6s%3d%5.1f\\n",
x[i].name, x[i].height, x[i].vision);
System.out.printf("\\n평균 키: %5.1fcm\\n", aveHeight(x));
distVision(x, vdist); // 시력의 분포를 구함
System.out.println("\\n시력 분포");
for (int i = 0; i < VMAX; i++)
System.out.printf("%3.1f~: %2d명\\n", i / 10.0, vdist[i]);
}
}
■ 신체검사 리스트 ■
이름 키 시력
--------------------
강민하 162 0.3
김찬우 173 0.7
박준서 175 2.0
유서범 171 1.5
이수연 168 0.4
장경오 174 1.2
황지안 169 0.8
평균 키: 170.3cm
시력 분포
0.0~: 0명
0.1~: 0명
0.2~: 0명
0.3~: 1명
0.4~: 1명
0.5~: 0명
0.6~: 0명
0.7~: 1명
0.8~: 1명
0.9~: 0명
1.0~: 0명
1.1~: 0명
1.2~: 1명
1.3~: 0명
1.4~: 0명
1.5~: 1명
1.6~: 0명
1.7~: 0명
1.8~: 0명
1.9~: 0명
2.0~: 1명
'Do it! 자료구조와 함께 배우는 알고리즘 입문' 카테고리의 다른 글
<01> 기본 알고리즘 (0) | 2024.04.23 |
---|