본문 바로가기
문제를 풀어보자

JAVA) 자바의 정석 기초편 7-2 연습문제 풀이

by 휴일이 2022. 10. 9.

 

자바의 정석 기초편 7-1에 이은

7-2의 연습 문제를 풀어보았습니다

 

Q) 연습문제 7-1의 SutdaDeck 클래스에 다음에 정의된 새로운 메소드를 추가하고 테스트하시오

 

1.

메소드명 : Shuffle

기능 :  배열 cards에 담긴 카드의 위치 뒤섞기(Math.random() 이용)

반환타입 : 없음

매개변수 : 없음

 

2.

메소드명 : Pick

기능 : 배열 cards에서 지정된 위치의 SutdaCard를 반환한다

반환타입 : SutdaDeck

매개변수 : int index (위치)

 

3.

메소드명 : Pick

기능 : 배열 cards에서 임의의 위치에 SutdatCard를 반환한다(Math.random() 사용)

반환타입 : Sutdadeck

매개변수 : 없음

 

 

 

class SutdaDeck {
    final int CARD_NUM = 20;
    SutdaCard[] cards = new SutdaCard[CARD_NUM];
    //섯다카드 20개의 객체배열
    //20장 다 1이고, true라서 다 k가 뜸

    SutdaDeck() {

        for(int a=0;a<cards.length;a++) {//일단 cards객체 배열의 인스턴스 생성
            cards[a] = new SutdaCard();
        }

        int j=1; //카드 숫자를 세어 10이 넘으면 초기화해줄 변수
        for(int i=0;i< cards.length;i++) { //카드 숫자를 부여하기 위해 for문
            cards[i].num = j; //j값을 집어넣음
            cards[i].isKwang=false; //일단 다 false해서 k를 떼줌
            j++; //한번 돌아갈때마다 1씩 증가(1,2,3...이렇게 부여해줘야 하니까

            if(j==11) { //j가 11이 되면
                j=1; //j를 1로 초기화해줌 1~10 하고 다시 1~10 해주기 위해
            }
        }

        //1,3,8에 광(k)를 붙여주기 위한 for문
        for (int i=0;i<10;i++) { //2장씩 들어있는 1,3,8중 한장씩에만 붙이면 되니까 10번만 돌려줌
            if(cards[i].num==1||cards[i].num==3||cards[i].num==8) { //카드번호가 1이거나3,8 이라면?
                cards[i].isKwang=true; //true값을 줘서 광을 붙여줌
            }
        }
    }

    public void shuffle() { //배열cards에 담긴 카드의 위치를 뒤섞는다(Math.random() 사용)

        SutdaCard tmp = new SutdaCard(); //중간 다리 역할을 할 인스턴스

        for(int i=0;i<cards.length;i++) { //배열 갯수만큼 돌림
            int j=(int)(Math.random()* cards.length); //j에 랜덤 숫자 돌림
            tmp = cards[i]; //i에 들어있는 객체 tmp에게 넘겨줌
            cards[i] = cards[j]; //j(랜덤숫자)는 i에게 넘겨줌
            cards[j]=tmp; //tmp에 든 i의 객체는 j에게 넘겨줌
        }
    }

    public SutdaCard pick(int index) { //사용자가 입력한 숫자에 있는 배열값 출력

        return cards[index]; //사용자 입력값 반환
    }

    public SutdaCard pick() { //랜덤한 배열 값 출력

        int i=(int)(Math.random()*20); //랜덤 숫자 부여

        return cards[i]; //랜덤 숫자 배열 반환
    }


}





class SutdaCard {
    public boolean cards;
    int num; //카드넘버 1~10까지
    boolean isKwang; //광이면 true

    SutdaCard() {
        this(1, true);
    }

    SutdaCard(int num, boolean isKwang) {
        this.num = num;
        this.isKwang = isKwang;
    }

    public String toString() {
        return num + (isKwang ? "K" : ""); //isKwang이 true라면 k, 아니라면 ""
    }
}


public class Exercise7_1 {
    public static void main(String[] args) {
        SutdaDeck deck = new SutdaDeck(); //20개의 섯다 카드를 넣은 덱

        System.out.println(deck.pick(0)); //첫번째 배열에 있는 숫자 출력
        System.out.println(deck.pick()); //랜덤 배열에 있는 숫자 출력
        deck.shuffle(); //덱 랜덤으로 돌림

        for(int i=0;i<deck.cards.length;i++) { //20번 돌림(출력을 위해)
            System.out.print(deck.cards[i]+","); //1~10하고 다시 1~10 나와야함
        }

        System.out.println();
        System.out.println(deck.pick(0)); //첫번째 배열 숫자 출력


    }
}

 

결과

 

 

 

2,3번은 쉬웠는데

1번이 이해 안 돼서 머리 싸매다가

결국 검색했는데 그 코드도 이해 안 돼서

 

 

이 짓 하면서

결국 이해하고....풀었다.....

 

 

코딩하면서 느낀점

ㄴ 나는 벌레다...나는 밥만 축내는 똥이다....라고 생각하면 나를 좀 덜 미워할 수 있음

728x90