본문 바로가기
TIL/Java | Spring Boot

2022.1.1 TIL : [Java] 컬렉션과 제네릭 (Collection & Generic) - 마무리

by yeon_zoo 2022. 1. 1.

컬렉션과 제네릭 개념에 대한 블로그를 작성하고 난 후에, 책의 마무리 과제에 있는 문제를 수행해 보았다. 아무래도 자바에 익숙하지 않고, 파이썬에서는 단순하게 클래스를 쓰면 될 것을 자바에선 컬렉션과 제네릭..으로 구성하다보니 조금 헷갈리긴 했다. 그럼에도 전에 누군가 자바로 알고리즘 풀면 재밌다고 한 적 있는데, 그럴 것 같기도 하다. 해당 언어가 익숙해지려면 알고리즘 푸는 것만큼 효과적인 것도 없으니까 자바로 알고리즘 푸는 연습도 해봐야겠다. 

 

문제는 영어 단어 뜻 맞추기 게임을 만드는 것으로, 다음과 같이 수행되면 된다. 

조건 : Word 클래스 작성하고, Word를 Vector<Word> 컬렉션에 삽입해 둔다. 벡터 내에서 정답이 아닌 단어를 3개 선택하여 총 4개의 보기를 보여준다. 

단어 테스트를 시작합니다. -1을 입력하면 종료합니다.
현재 9개의 단어가 있습니다.
bear?
 (1)곰 (2)인간 (3)동물 (4)눈 :>1
Excellent!

단어 테스트를 시작합니다. -1을 입력하면 종료합니다.
현재 9개의 단어가 있습니다.
picture?
 (1)사진 (2)인간 (3)사랑 (4)사회 :>1
Excellent!

단어 테스트를 시작합니다. -1을 입력하면 종료합니다.
현재 9개의 단어가 있습니다.
love?
 (1)곰 (2)그림 (3)사랑 (4)사회 :>2
No. !!

단어 테스트를 시작합니다. -1을 입력하면 종료합니다.
현재 9개의 단어가 있습니다.
human?
 (1)그림 (2)사진 (3)인간 (4)안녕 :>-1

코드 :

import  java.util.*;
class Word{
    private String ko;
    private String en;
    Word (String ko, String en){
        this.ko = ko;
        this.en = en;
    }
    public String getKo() return ko;
    public String getEn() return en;
}
public class practice_10 {
    public  static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        var dic = new Vector<Word>();
        dic.add(new Word("그림", "painting"));
        dic.add(new Word("곰", "bear"));
        dic.add(new Word("눈", "eyes"));
        dic.add(new Word("사진", "picture"));
        dic.add(new Word("사회", "society"));
        dic.add(new Word("인간", "human"));
        dic.add(new Word("사랑", "love"));
        dic.add(new Word("동물", "animal"));
        dic.add(new Word("안녕", "hello"));

        while(true){
            System.out.println("단어 테스트를 시작합니다. -1을 입력하면 종료합니다.");
            System.out.println("현재 "+ dic.size() +"개의 단어가 있습니다.");
            Random rand = new Random();
            Word quiz = dic.get(rand.nextInt(dic.size()));
            System.out.println(quiz.getEn() +"?");
            var tmp = new HashSet<Word>();
            tmp.add(quiz);
            while (tmp.size() < 4){ //중복을 제거하여 랜덤하게 3개의 단어를 뽑음. 
                tmp.add(dic.get(rand.nextInt(dic.size())));
            }
            
            Iterator<Word> iter = tmp.iterator();
            int count = 1;
            int correct = 0;
            while (iter.hasNext()){ //집합 내의 보기들을 출력함. 
                var current = iter.next().getKo();
                System.out.print(" ("+count+")" + current);
                if (current.equals(quiz.getKo())) correct = count;
                count++;
            }
            System.out.print(" :>");
            int answer = scanner.nextInt();
            if (answer == -1)
                break;
            else if (answer == correct){
                System.out.println("Excellent!\n");
            }
            else{
                System.out.println("No. !!\n");
            }
        }
    }
}

중복을 제거하여 랜덤하게 3개의 단어를 뽑는 과정과 뽑힌 단어들을 출력하는 과정을 하나로 출력하면 더 깔끔한 코드가 될 것 같은데, 그렇게 되면 정답이 항상 같은 번호에 위치하게 해야 할 것 같아서 분리해뒀다. 

댓글