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.lengthreturn 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==0break;
            }
            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]==0break;    //그동안 구한 소수로 나눠본다.
            }
            
            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

 



오늘의 저녁메뉴는 뚜기뚜기 콕콕콕 스파게티면 !!!!!!!!!
집에가서 조질거다!!!!!!!!!!!
살이 빠질 틈이 없구나 ㅠ.ㅠ ㅋ