본문 바로가기

자바/Do it! 알고리즘 입문

자료구조와 함께 배우는 알고리즘 입문 자바편 1장 연습문제 / 2021.09.15

* 참고 자료 : Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편

 

Q1. 네 값의 최댓값을 구하는 max4 메서드를 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Chapter1;
 
public class pratice {
    static int max4(int a, int b, int c, int d) {
        int max = a;
        if(b > max) max = b;
        if(c > max) max = c;
        if(d > max) max = d;
        return max;
    }
    public static void main(String[] args) {
        System.out.println("max4(1,2,3,4) = " + max4(1,2,3,4));
        System.out.println("max4(4,3,2,1) = " + max4(4,3,2,1));
        System.out.println("max4(3,2,4,1) = " + max4(3,2,4,1));
        System.out.println("max4(2,3,4,1) = " + max4(2,3,4,1));
    }
}
 
cs

 

Q2. 세 값의 최솟값을 구하는 min3 메서드를 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Chapter1;
 
public class pratice {
    static int min3(int a, int b, int c) {
        int min = a;
        if(b < min) min = b;
        if(c < min) min = c;
        return min;
    }
    public static void main(String[] args) {
        System.out.println("min3(1,2,3) = " + min3(1,2,3));
        System.out.println("min3(4,3,2) = " + min3(4,3,2));
        System.out.println("min3(3,2,4) = " + min3(3,2,4));
        System.out.println("min3(2,3,4) = " + min3(2,3,4));
    }
}
cs

 

Q3. 네 값의 최솟값을 구하는 min4 메서드를 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Chapter1;
 
public class pratice {
    static int min4(int a, int b, int c, int d) {
        int min = a;
        if(b < min) min = b;
        if(c < min) min = c;
        if(d < min) min = d;
        return min;
    }
    public static void main(String[] args) {
        System.out.println("min4(1,2,3,4) = " + min4(1,2,3,4));
        System.out.println("min4(4,3,2,1) = " + min4(4,3,2,1));
        System.out.println("min4(3,2,4,1) = " + min4(3,2,4,1));
        System.out.println("min4(2,3,4,1) = " + min4(2,3,4,1));
    }
}
cs

 

Q4. 세 값의 대소 관계 13종류의 모든 조합에 대해 중앙값을 구하여 출력하는 프로그램을 작성하세요.

 

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
package Chapter1;
 
public class pratice {
    static int med3(int a, int b, int c) {
        if (a >= b)
            if(b >= c)
                return b;
            else if (a <= c)
                return a;
            else
                return c;
        else if (a > c)
            return a;
        else if (b > c)
            return c;
        else
            return b;
    }
    
    public static void main(String[] args) {
        System.out.println("med3(3,2,1) = " + med3(3,2,1));
        System.out.println("med3(3,2,2) = " + med3(3,2,2));
        System.out.println("med3(3,1,2) = " + med3(3,1,2));
        System.out.println("med3(3,2,3) = " + med3(3,2,3));
        System.out.println("med3(2,1,3) = " + med3(2,1,3));
        System.out.println("med3(3,3,2) = " + med3(3,3,2));
        System.out.println("med3(3,3,3) = " + med3(3,3,3));
        System.out.println("med3(2,2,3) = " + med3(2,2,3));
        System.out.println("med3(2,3,1) = " + med3(2,3,1));
        System.out.println("med3(2,3,2) = " + med3(2,3,2));
        System.out.println("med3(1,3,2) = " + med3(1,3,2));
        System.out.println("med3(2,3,3) = " + med3(2,3,3));
        System.out.println("med3(1,2,3) = " + med3(1,2,3));    
    }
}
 
cs

 

Q5. 중앙값을 구하는 메서드는 다음과 같이 작성할 수도 있습니다. 그러나 실습 1C-1의 med3 메서드에 비해 효율이 떨어지는데, 그 이유를 설명하시오.

 

1
2
3
4
5
6
7
8
9
10
11
static int med3(int a, int b, int c) {
    if((b >= a && c <= a) || (b <= a && c >= a)) 
        return a;
    else if((a > b && c < b) || (a < b && c > b))
        return b;
    return c;
}
// 첫번째 if문에있는 b>=a 와 b<=a 는 수식만 보면 다르다고 생각할 수 있지만
// 수식만 뒤집은 차이고 실질적으로는 같은 판단이므로 효율이 나빠진다.
// 첫번째 if문이 성립한 후 두번째 else if문에서 첫번째 if문과 실질적으로 
// 같은 수식을 수행하므로 효율이 나빠진다.
cs

 

Q6. 실습 1-4에서 while문이 종료될 때 변수 i의 값이 n + 1이 됨을 확인하세요( 변수 i 값을 출력하도록 프로그램을 수정하세요).

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Chapter1;
import java.util.Scanner;
public class pratice{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("1부터 n까지의 합을 구합니다.");
        System.out.print("n의 값 : ");
        int n = sc.nextInt();
        
        int sum = 0;
        int i = 1;
        
        while(i <= n) {
            sum += i;
            i++;
        }
        
        System.out.println("1부터 " + n + "까지의 합은 " + sum + "입니다.");
        System.out.println("i의 값은 ? "+ i);
    }
}
cs

 

 

Q7. 실습 1-5 프로그램을 참고하여 n이 7이면 '1 + 2 + 3 + 4 + 5 + 6 + 7 = 28'로 출력하는 프로그램을 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Chapter1;
import java.util.Scanner;
public class pratice{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("1부터 n까지의 합을 구합니다.");
        System.out.print("n의 값 : ");
        int n = sc.nextInt();
        
        int sum = 0;
        
        for(int i = 1; i <= n; i++) {
            sum += i;
            if(i < n)
                System.out.print(i + " + ");
            else if(i == n)
                System.out.print(i + " = " + sum);
        }    
    }
}
 
cs

 

 

 

Q8. 1부터 10까지의 합은 (1+10) * 5와 같은 방법으로 구할 수 있습니다. 가우스의 덧셈이라는 방법을 이용하여 1부터 n까지의 정수 합을 구하는 프로그램을 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Chapter1;
import java.util.Scanner;
public class pratice{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("1부터 n까지의 합을 구합니다.");
        System.out.print("n의 값 : ");
        int n = sc.nextInt();
        
        int sum = (n + 1* (n / 2+ (n % 2 == 1 ? (n + 1/ 2 : 0);
        
        System.out.println("1부터 "+n+"까지의 합은 = "+sum);    
    }
}
 
cs

 

Q9. 정수 a, b를 포함하여 그 사이의 모든 정수의 합을 구하여 반환하는 아래 메서드를 작성하세요.

 

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 Chapter1;
import java.util.Scanner;
public class pratice{
    static int sumof(int a, int b) {
        int min = 0;
        int max = 0;
        if(a > b) {
            min = b;
            max = a;
        }
        else {
            min = a;
            max = b;
        }
        
        int sum = 0;
        for(int i = min; i <= max; i++) {
            sum += i;
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("a의 값을 입력하시오 : ");
        int a = sc.nextInt();
        System.out.print("b의 값을 입력하시오 : ");
        int b = sc.nextInt();
        
        System.out.println("a부터 b까지의 합은 ? " + sumof(a, b));
        
    }
}
 
 
cs

 

 

Q10. 오른쪽과 같이 두 변수 a, b에 정수를 입력하고 b - a를 출력하는 프로그램을 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Chapter1;
import java.util.Scanner;
public class pratice{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("a의 값 : ");
        int a = sc.nextInt();
        
        int b = 0;
        while(true) {
            System.out.print("b의 값 : ");
            b = sc.nextInt();
            
            if(a < b)
                break;
            System.out.println("a보다 큰 값을 입력하세요!");
        }
        
        System.out.println("b - a는 " + (b-a) + "입니다.");
    }
}
 
cs

 

 

Q11. 양의 정수를 입력하고 자릿수를 출력하는 프로그램을 작성하세요. 예를들어 135를 입력하면 ' 그 수는 3자리입니다.' 라고 출력하고, 1314를 입력하면 ' 그 수는 4자리입니다. ' 라고 출력하면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Chapter1;
import java.util.Scanner;
public class pratice{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("양의 정수를 입력하시오 : ");
        int number = sc.nextInt();
        
        while(true) {
            if(number > 0)
                break;
            System.out.print("양의 정수를 입력하시오 : ");
            number = sc.nextInt();
        }
        
        int count = 0;
        while(number > 0) {
            number /= 10;
            count++;
        }
        System.out.println("그 수는 " + count + "자리입니다.");
    }
}
cs

 

 

Q12. 오른쪽과 같이 위쪽과 왼쪽에 곱하는 수가 있는 곱셈표를 출력하는 프로그램을 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Chapter1;
public class pratice{
    public static void main(String[] args) {
        System.out.println("   |  1  2  3  4  5  6  7  8  9 ");
        System.out.println("-------------------------------");
        for(int i = 1; i <= 9; i++) {
            System.out.printf("%2d |",i);
            for(int j = 1; j <= 9; j++) {
                System.out.printf("%3d", i*j);
            }
            System.out.println();
        }
    }
}
cs
 

Q13. 곱셈이 아니라 덧셈을 출력하는 프로그램을 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Chapter1;
 
public class pratice{
    public static void main(String[] args) {
        System.out.println("   |  1  2  3  4  5  6  7  8  9 ");
        System.out.println("-------------------------------");
        for(int i = 1; i <= 9; i++) {
            System.out.printf("%2d |",i);
            for(int j = 1; j <= 9; j++) {
                System.out.printf("%3d", i+j);
            }
            System.out.println();
        }
    }
}
cs

 

Q14. 오른쪽과 같이 입력한 수를 한 변으로 하는 정사각형을 * 기호로 출력하는 프로그램을 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Chapter1;
import java.util.Scanner;
public class pratice{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("사각형을 출력합니다.");
        System.out.print("단 수 : ");
        int number = sc.nextInt();
        for(int i = 0; i < number; i++) {
            for(int j = 0; j < number; j++) {
                System.out.print("* ");
            }
            System.out.println();
        }
    }
}
cs

 

 

Q15. 직각 이등면 삼각형을 출력하는 부분을 아래와 같은 형식의 메서드로 작성하세요. 또 왼쪽 위, 오른쪽 위, 오른쪽 아래가 직각인 이등변 삼각형을 출력하는 메서드를 작성하세요.

(1) 왼쪽 아래가 직각인 이등변 삼각형

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Chapter1;
import java.util.Scanner;
public class pratice{
    static void triangleLB(int B) {
        for(int i = 0; i < B; i++) {
            for(int j = 0; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number;
        System.out.println("왼쪽 아래가 직각인 이등변 삼각형을 출력합니다.");
        do {
            System.out.print("몇 단 입니까? ");
            number = sc.nextInt();
        }while(number <= 0);
            
        triangleLB(number);
    }
}
cs

 

 

(2) 왼쪽 위가 직각인 이등변 삼각형

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Chapter1;
import java.util.Scanner;
public class pratice{
    static void triangleLU(int B) {
        for(int i = B; i >= 1; i--) {
            for(int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number;
        System.out.println("왼쪽 위가 직각인 이등변 삼각형을 출력합니다.");
        do {
            System.out.print("몇 단 입니까? ");
            number = sc.nextInt();
        }while(number <= 0);
            
       triangleLU(number);
    }
}
cs

 

 

(3) 오른쪽 위가 직각인 이등변 삼각형

 

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
package Chapter1;
import java.util.Scanner;
public class pratice{
    static void triangleRU(int B) {
        for(int i = 0; i < B; i++) {
            for(int j = 0; j < B; j++) {
                if( j >= i)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number;
        System.out.println("오른쪽 위가 직각인 이등변 삼각형을 출력합니다.");
        do {
            System.out.print("몇 단 입니까? ");
            number = sc.nextInt();
        }while(number <= 0);
            
       triangleRU(number);
    }
}
cs

 

 

(4) 오른쪽 아래가 직각인 이등변 삼각형

 

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
package Chapter1;
import java.util.Scanner;
public class pratice{
    static void triangleRB(int B) {
        for(int i = B-1; i >= 0; i--) {
            for(int j = 0; j < B; j++) {
                if( j >= i)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number;
        System.out.println("오른쪽 아래가 직각인 이등변 삼각형을 출력합니다.");
        do {
            System.out.print("몇 단 입니까? ");
            number = sc.nextInt();
        }while(number <= 0);
            
       triangleRB(number);
    }
}
cs

 

 

Q16. n단의 피라미드를 출력하는 메서드를 작성하세요

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Chapter1;
import java.util.Scanner;
public class pratice{
    static void spira(int n) {
        for(int i = 0; i < n; i++) {
            for(int j = 1; j < n - i; j++)
                System.out.print(" ");
            for(int k = 0; k < i*2+1; k++)
                System.out.print("*");
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number;
        System.out.println("피라미드를 출력하시오.");
        do {
            System.out.print("몇 단 입니까? ");
            number = sc.nextInt();
        }while(number <= 0);
            
        spira(number);
    }
}
cs

 

 

Q17. 오른쪽과 같이 아래를 향한 n단의 숫자 피라미드를 출력하는 메서드를 작성하세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Chapter1;
import java.util.Scanner;
public class pratice{
    static void npira(int n) {
        for(int i = 0; i < n; i++) {
            for(int j = 1; j < n - i; j++)
                System.out.print(" ");
            for(int k = 0; k < i*2+1; k++)
                System.out.print(i+1);
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number;
        System.out.println("피라미드를 출력하시오.");
        do {
            System.out.print("몇 단 입니까? ");
            number = sc.nextInt();
        }while(number <= 0);
            
        npira(number);
    }
}
cs