JAVA_Learn/Do it! _ Algorithm Study
#3. 1주차 과제 3 [ Chap02_ 7 ~13 ]
CEJ_0929
2021. 12. 29. 19:39
2-7 (ArrayEqual)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
package practice;
import java.util.Scanner;
public class ArrayEqual_2_7 {
static boolean equals(int[]a, int[]b) {
if(a.length != b.length) return false;
for (int i = 0; i < a.length; i++)
if(a[i]!=b[i]) return false;
return true;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("배열 a의 요솟수: ");
int na = stdIn.nextInt();
int[]a = new int[na];
for (int i = 0; i < na; i++) {
System.out.print("a["+i+"]: ");
a[i] = stdIn.nextInt();
}
System.out.print("배열 b의 요솟수: ");
int nb = stdIn.nextInt();
int[]b = new int[nb];
for (int i = 0; i < nb; i++) {
System.out.print("b["+i+"]: ");
b[i] = stdIn.nextInt();
}
System.out.println("배열a와 b는 "+(equals(a,b) ? "같습니다." : "같지 않습니다."));
}
}
|
cs |
2-8 (CardConvRev) [A], [B] 같이 작업.
※ cardConvR 메서드에서 배열 d 를 매개변수로 받고 조건에 맞게 값을 넣기는 했다.
그러나 return 하지 않았는데, 어떻게 Main 메서드에서 그 값을 출력할 수 있었을까?
너무 이해가 안돼서 학원 강사님께 여쭤보고, 신명나게 구글링을 했다.
정답: Call by Reference 방식
매개변수로 배열 또는 참조형 변수를 받았을 경우에
그 변수는 값을 가지고 있는 것이 아닌
'주소값'을 가지고 있다.
그렇게 해서 cno 와 d 가 바라보는 주소값이 같아지게 된 것.
같은 주소에 값을 넣어 줌으로써 main 메서드에서 cno의 값을 인출면 d에 넣었던 값이 출력되는 것이다.
국비에서 자바 수업이 끝났기 때문에 자바는 어느정도 안다고 생각했는데도이런 개념은 참 어렵다.ㅠㅠ
Call by Reference 방식의 경우 C언어 계열에서도 등장하니 다시한번 확실히 잡고 가야겠다.
참조 블로그: https://soozl91.tistory.com/31
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package practice;
import java.util.Scanner;
public class CardConvRev_2_8 {
// 2-8[A]
static int cardConvR(int x, int r, char[]d) {
int digits = 0;
String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
do {
d[digits++] = dchar.charAt(x%r);
x/=r;
}while(x!=0);
return digits;
}
//2-8[B]
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int no; //변환하는 정수
int cd; //기수
int dno; //변환후의 자릿수
int retry; //다시 한 번?
char[]cno = new char[32];
System.out.println("10진수를 기수 변환합니다.");
do {
do {
System.out.print("변환하는 음이 아닌 정수: ");
no = stdIn.nextInt();
}while(no<0);
do {
System.out.print("어떤 진수로 변환할까요? (2~36): ");
cd = stdIn.nextInt();
} while(cd<2 || cd>36);
dno = cardConvR(no, cd, cno);
System.out.print(cd+" 진수로는 ");
for (int i = dno-1; i >= 0; i--) {
System.out.print(cno[i]);
}
System.out.println(" 입니다.");
System.out.print("한번 더 할까요?(1.예 / 0. 아니오): ");
retry = stdIn.nextInt();
} while(retry==1);
}
}
|
cs |
2-9 (PrimeNumber1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package practice;
public class PrimeNumber1_2_9 {
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);
}
}
|
cs |
2-10 (PrimeNumber2)
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
29
30
31
32
33
34
35
36
37
|
package practice;
/*
* 2-9에서는 약 7만번의 연산을 했지만
* 여기에서는 규칙성을 이용해 알고리즘을 개선함으로써 연산횟수를 줄인다.
* ★1. 2보다 큰 짝수는 소수가 아니다.
* ★2. 그렇다면 홀수 들 중, 자신보다 작은 소수로 나누어떨어진다면
* 그 수는 소수가 아니다.
*
* 위 2조건을 대입함.
*/
public class PrimeNumber2_2_10 {
public static void main(String[] args) {
int counter = 0;
int ptr = 0;
int[]prime = new int[500];
prime[ptr++] = 2;
for (int n = 3; n <= 1000; n+=2) {
int i;
for (i = 1; i < ptr; i++) {
counter++;
if(n%prime[i]==0) break; //그동안 구한 소수로 나눠본다.
}
if(ptr==i) prime[ptr++] = n;
}
for (int i = 0; i < ptr; i++)
System.out.println(prime[i]);
System.out.println("나눗셈을 수행한 횟수: "+counter);
}
}
|
cs |
2-11 (PrimeNumber3)
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
29
30
31
32
33
34
35
|
package practice;
public class PrimeNumber3_2_11 {
public static void main(String[] args) {
int counter = 0;
int ptr = 0;
int[]prime = new int[500];
prime[ptr++] = 2;
prime[ptr++] = 3;
for (int n = 5; n <= 1000; n+=2) {
boolean flag = false;
for (int i = 1; prime[i]*prime[i] <= n; i++) {
counter+=2;
if(n % prime[i] == 0) {
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);
}
}
|
cs |
2-12 (Int2DArray)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package practice;
public class Int2DArray_2_12 {
public static void main(String[] args) {
int[][]x = new int[2][4];
x[0][1] = 37;
x[0][3] = 54;
x[1][2] = 65;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++)
System.out.println("x["+i+"]["+j+"] = "+x[i][j]);
}
}
}
|
cs |
2-13 (DayOfYear)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package practice;
import java.util.Scanner;
public class DayOfYear_2_13 {
//윤년인지 확인하는 메서드
static int isLeap(int year) {
return (year%4==0 && year%100 !=0 || year%400==0) ? 1 : 0;
}
//윤년, 평년을 구분하여 일수를 저장해둔 static 변수
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}
};
//일수를 계산하는 메서드
static int dayOfYear(int y, int m, int d) {
int days = d; //일수가 될 변수
for (int i = 1; i < m; i++)
//main에서 dayOfYear 호출 --> dayOfYear에서 isLeap 호출
//근데 왜 윤년인지 매번 확인하는거지?
//for문 밖에서 한번 만 확인하고 그 int를 별도 변수에 넣어서 그걸로 for문 돌리면 안되나?
//매번 메서드를 호출하는 일이 변수를 1개 더 만드는 것보다 메모리 낭비가 덜 한건가?
//내일 강사님께 여쭤보기.
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.println("한 번 더 할까요?(1.예 / 2.아니오)");
retry = stdIn.nextInt();
}while(retry==1);
}
}
|
cs |
오늘의 저녁메뉴는 뚜기뚜기 콕콕콕 스파게티면 !!!!!!!!!
집에가서 조질거다!!!!!!!!!!!
살이 빠질 틈이 없구나 ㅠ.ㅠ ㅋ