본문 바로가기

[책]명품 JAVA Programming

명품 자바 프로그래밍 6장 OpenChallenge&실습문제

OpenChallenge

- 텍스트를 키보드로 입력받아 알파벳이 아닌 문자는 제외하고 영문자 히스토그램을 만들어보자. 대문자와 소문자는 모두 같은 것으로 간주하고, 세미콜론만 있는 라인을 만나면 입력의 끝으로 해석한다.

 

실습문제

 

Q1. 다음 main()이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.

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
package RealQ;
 
public class Q01 {
 
    public static void main(String[] args) {
        MyPoint p = new MyPoint(3,50);
        MyPoint q = new MyPoint(4,50);
        System.out.println(p);
        if(p.equals(q))
            System.out.println("같은점");
        else
            System.out.println("다른점");
    }
 
}
 
class MyPoint{
    private int x,y;
    
    MyPoint(int x, int y){
        this.x = x;
        this.y = y;
    }
    
    public String toString() {        //toString을 적고 적지않고 차이를 보세요! 
        return "Point("+x+","+y+")";
    }
 
}
cs

 

Q2. 중심을 나타내는 정수 x,y와 반지름 radius 필드를 가지는 Circle 클래스를 작성 하고자 한다. 생성자는 3개의 인자(x, y, radius)를 받아 해당 필드를 초기화 하고, equals() 메소드는 두 개의 Circle 객체의 중심이 같으면 같은 것으로 판별하도록 한다.

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
package RealQ;
 
public class Q02 {
 
    public static void main(String[] args) {
        Circle a = new Circle(2,3,5);
        Circle b = new Circle(2,3,30);
        System.out.println("원 a : "+ a);
        System.out.println("원 b : "+ b);
        if(a.equals(b))
            System.out.println("같은 원");
        else
            System.out.println("다른 원");
    }
 
}
 
class Circle{
    private int x,y,r;
    
    public Circle(int x,int y, int r) {
        this.x = x;
        this.y = y;
        this.r = r;
    }
    
    public String toString() {
        return "Circle("+x+","+y+")반지름"+r;
    }
    
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    
    public boolean equals(Object obj) {        //이것이 있고 없고의 차이를 봐보세요
        //Circle myCircle = (Circle)obj  << 이렇게 다운캐스팅 한 myCircle 객체를 만들어서 써도 됩니다.
        if(this.x == ((Circle) obj).getX() && this.y == ((Circle) obj).getY())    //받은 객체를 Circle로 다운캐스팅 해야합니다!!
            return true;
        else
            return false;
    }
}
 
cs

 

Q3~ Q4는 생략 하겠습니다.

 

Q5. Calendar 객체를 생성하면 현재 시간을 알 수 있다. 프로그램을 실행한 현재 시간이 새벽 4시에서 낮 12시 이전이면 "Good Morning"을, 오후 6시 이전이면 "Good Afternoon" 밤 10시 이전이면 "Good Evening"을, 그 이후는 "Good Night"을 출력하라.

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
package RealQ;
 
import java.util.Calendar;
import java.util.Scanner;
 
public class Q05 {
 
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        
        int hour = c.get(Calendar.HOUR);
        int min = c.get(Calendar.MINUTE);
        int am_pm = c.get(Calendar.AM_PM);
        
        System.out.println("현재 시간은 "+hour+"시 "+min+"분입니다.");
        if(am_pm ==Calendar.AM && hour>=4 && hour<12) {
            System.out.println("Good Morning");
        }else if(am_pm ==Calendar.PM && hour<=6) {
            System.out.println("Good Afternoon");
        }else if(am_pm == Calendar.AM_PM && hour>6 && hour<=10) {
            System.out.println("Good Evening");
        }else {
            System.out.println("Good Night");
        }
 
    }
 
}
 
cs

 

Q6. 경과시간을 맞추는 게임을 작성. 엔터입력하면 현재 초 시간을 보여주고 10초에 근접하도록 다음 엔터입력 한사람이 이기는 게임.

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
64
65
66
67
68
69
70
71
72
73
package RealQ;
import java.util.Calendar; 
import java.util.Scanner;
 
public class Q06 {
    
    public static void main(String[] args) {
        System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
        Timer t1 = new Timer("황기태");
        Timer t2 = new Timer("이재문");
        System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
        t1.run();
        t2.run();
        if(Math.abs(10-t1.getResult()) < Math.abs(10-t2.getResult())) {    //t1 이 이겼을때
            System.out.println(t1.getName()+"의 결과 "+t1.getResult()+", "+
                               t2.getName()+"의 결과 "+t2.getResult()+", 승자는"+ t1.getName() );
        }else if(Math.abs(10-t1.getResult()) > Math.abs(10-t2.getResult())) {
            System.out.println(t1.getName()+"의 결과 "+t1.getResult()+", "+
                       t2.getName()+"의 결과 "+t2.getResult()+", 승자는"+ t2.getName() );
        }else {
            System.out.println(t1.getName()+"의 결과 "+t1.getResult()+", "+
                       t2.getName()+"의 결과 "+t2.getResult()+", 비겼습니다" );
        }
    }
}
 
class Timer{
    Scanner sc = new Scanner(System.in);
    private int sec;
    private int sec2;
    private int result;
    private String name;
    public Timer(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
    public void TimerStop(int sec2) {
        System.out.println("\t현재 초 시간 = "+sec2);
        if(sec2<sec) {
            result = sec2+60-sec;
        }else {
            result = sec2-sec;
        }
    }
    
    public void setTimer() {
        this.sec = Calendar.getInstance().get(Calendar.SECOND);
        System.out.println("\t현재 초 시간 = "+sec);
    }
    
    public int getResult() {
        return result;
    }
    
    public void run() {
        String s;    //엔터입력 받는 변수
        System.out.print(getName()+" 시작 <Enter>키>>");
        s = sc.nextLine();    //엔터 입력 포함 문자를 받습니다. 
        if(s.contentEquals("")) {    //s가 엔터만 있으면 이거 실행!
            setTimer();
        }
        
        System.out.print("10초 예상 후 <Enter>키>>");
        s = sc.nextLine();
        if(s.contentEquals("")) {
            sec2 = Calendar.getInstance().get(Calendar.SECOND);
            TimerStop(sec2);
        }
    }
}
cs

 

Q7. 공백으로 분리된 어절이 몇 개 들어 있는지 계산하는 프로그램 만들기.

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 RealQ;
 
import java.util.Scanner;
import java.util.StringTokenizer;
 
public class Q07 {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true) {
            System.out.print(">>");
            String s = sc.nextLine();
            if(s.contentEquals("그만")) {
                System.out.println("종료합니다...");
                break;
            }
            StringTokenizer st = new StringTokenizer(s);
            int a = st.countTokens();
            System.out.println("어절 개수는 "+a);
        }
        
        sc.close();
    }
 
}
 
cs

 

Q8. 문자열을 한글자씩 회전시켜 출력하는 프로그램 만들기.

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 RealQ;
 
import java.util.Scanner;
 
 
public class Q08 {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        
        System.out.println("문자열을 입력하세요. 빈칸이 있어도 되고 영어 한글 모두 됩니다.");
        String s = sc.nextLine();
 
        for(int i=0;i<s.length();i++) {
            char a = s.charAt(0);
            String b = s.substring(1);
            s = b+a;
            System.out.println(s);
        }
        
        sc.close();
    }
 
}
 
cs

 

Q9. 가위바위보 게임 만들기. 컴퓨터는 매 판 랜덤으로 설정.

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
package RealQ;
 
import java.util.Scanner;
 
public class Q09 {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true) {
            System.out.print("철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>");
            int user = sc.nextInt();
            if(user==4) {
                break;
            }
            
            int com = (int)(Math.random()*3+1);
            switch(user) {
            case 1:
                if (com ==1) {
                    System.out.println("철수(가위) : 컴퓨터(가위)");
                    System.out.println("비겼습니다.");
                }else if(com ==2) {
                    System.out.println("철수(가위) : 컴퓨터(바위)");
                    System.out.println("컴퓨터가 이겼습니다.");
                }else {
                    System.out.println("철수(가위) : 컴퓨터(보)");
                    System.out.println("철수가 이겼습니다.");
                }
                break;
            case 2:
                if (com ==1) {
                    System.out.println("철수(바위) : 컴퓨터(가위)");
                    System.out.println("철수가 이겼습니다.");
                }else if (com ==2) {
                    System.out.println("철수(바위) : 컴퓨터(바위)");
                    System.out.println("비겼습니다.");
                }else {
                    System.out.println("철수(바위) : 컴퓨터(보)");
                    System.out.println("컴퓨터가 이겼습니다.");
                }
                break;
            case 3:
                if (com ==1) {
                    System.out.println("철수(보) : 컴퓨터(가위)");
                    System.out.println("컴퓨터가 이겼습니다.");
                }else if (com ==2) {
                    System.out.println("철수(보) : 컴퓨터(바위)");
                    System.out.println("철수가 이겼습니다.");
                }else {
                    System.out.println("철수(보) : 컴퓨터(보)");
                    System.out.println("비겼습니다.");
                }
                break;
            }
        }
        
 
    }
 
}
 
cs

 

Q10. 세개의 숫자가 같으면 이기는 프로그램 만들기.

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
package RealQ;
 
import java.util.Scanner;
 
public class Q10 {
 
    public static void main(String[] args) {
        Person[] player = new Person[2];
        player[0= new Person("수희");
        player[1= new Person("연수");
        boolean flag=true;
        while(flag) {
            for(int i=0; i<2;i++) {
                flag = player[i].run();
                if(flag == false) {
                    break;
                }
            }
        }
 
    }
 
}
 
class Person{
    Scanner sc = new Scanner(System.in);
    private String name;
    private int num1,num2,num3;
    
    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    
    public boolean run() {
        System.out.print("["+name+"]"+":<Enter>");
        String s = sc.nextLine();
        boolean flag=true;
        if(s.contentEquals("")) {
            num1 = (int)(Math.random()*3+1);
            num2 = (int)(Math.random()*3+1);
            num3 = (int)(Math.random()*3+1);
            
            if(num1 ==num2&&num2==num3) {
                System.out.println("\t"+ num1+ "  "+num2+"  "+num3+"   "+name+"님이 이겼습니다.");
                flag = false;
            }
            else {
                System.out.println("\t"+ num1+ "  "+num2+"  "+num3+"   "+"아쉽군요!");
            }
        }
        return flag;
    }
}
 
cs

 

Q11. 문자열 수정 프로그램 만들기.

*StringBuffer는 주로 문자열을 추가하거나 수정할때 사용하는 클래스 입니다. 이런 옵션이 있으니String 클래스 보다는 메모리를 많이 잡아먹고 무겁습니다. 수정이 많으면 StringBuffer를 쓰고 그렇지 않을땐 String을 쓰는게 일반적입니다. 

indexOf(String) 함수는 왼쪽부터 검사해 문자열의 위치를 리턴해줍니다.

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
package RealQ;
 
import java.util.Scanner;
import java.util.StringTokenizer;
 
public class Q11 {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuffer sb = new StringBuffer();
 
        
        System.out.print(">>");
        sb.append(sc.nextLine());
        
        while(true) {
            System.out.print("명령: ");   //ssss!aaa 형식으로 작성 ssss->aaa로 바꾸는것.
            String s = sc.next();
            if(s.contentEquals("그만")) break;
            
            String str[] = s.split("!");    // !를 기준으로 나눴습니다.
            
            if(str.length != 2System.out.println("잘못된 명령어 입니다!");    // 규칙이랑 다를때
            else {
                if(str[0].length() ==0 || str[1].length() ==0System.out.println("잘못된 명령어 입니다!");     //위에서는 이걸 거르지 못합니다.
                else {
                    int index = sb.indexOf(str[0]);
                    if(index == -1) {
                        System.out.println("찾을 수 없습니다!");
                    }else {
                        sb.replace(index, index+str[0].length(), str[1]);
                        System.out.println(sb);
                    }
                }
            }
            
        }
    }
 
}
 
cs

 

Q12. 문제 10의 갬블링 게임을 여러명이 할 수 있도록 수정.

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
package RealQ;
 
import java.util.Scanner;
 
public class Q12 {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        
        System.out.print("겜블링 게임에 참여할 선수 숫자>>");
        int num = sc.nextInt();
        Person[] player = new Person[num];
        
        for(int i=0; i<num;i++) {
            System.out.print((i+1)+"번째 선수 이름>>");
            String name = sc.next();
            player[i] = new Person(name);
        }
        boolean flag = true;
        while(flag) {
            for(int i=0;i<num;i++) {
                flag = player[i].run();
                if(flag == false) {
                    break;
                }
            }
        }
    }
}
 
cs