2015년 1월 19일 월요일

자바 ScrambledWord 예제

*예제는 남궁성님의 코드 초보 스터디 카페에 있는 Java 1000제에서 가져왔습니다.

문제1)
getAnswer(String[] strArr)는 배열strArr의 요소중의 하나를 임의로 골라서 반환한다.(Math.random()사용)
getScrambledWord(String str)는 주어진 문자열 str의 각 문자의 순서를 뒤섞은 다음, 새로운 문자열로 반환한다.
                                            *(Math.random()사용)


public static String getAnswer(String[] strArr){
int getNumber = (int) (Math.random()*strArr.length); 
              //Math.random이 0.0부터 1.0 사이의 난수를 반환하기 때문에.  strArr.length를 곱해준다.
              // 그 후 int 캐스팅으로 소수점을 잘라준다.
String anwser = strArr[getNumber];
return anwser;
}

 public static String getScrambledWord(String str) { 
        char[] chArr = str.toCharArray(); 

        for(int i=0;i<str.length()*2;i++) {
               int idx = (int)(Math.random()*str.length()); 
              
              char tmp = chArr[0];              // 임시로 변수를 만든후 chArr[0]를 저장한다.
              chArr[0] = chArr[idx];           // chArr의 임의의 문자를 chArr[0]에 저장한다. 
              chArr[idx] = tmp;                   // 변수에 저장된 값을 chArr의 임의의 장소에 저장한다.
        }                                                  // for문으로 충분히 섞어준다.

        return new String(chArr); 

  }

==>  getScrambledWord 메소드의 단점: 작은 확률이긴 하지만 섞이지 않은 채로 str이 그대로 나올 수 있다.

그래서 내가 생각한 방법
public static String getScrambledWord(String str){

int [] Numbers = {0};
char []words = str.toCharArray();
String word= new String();
try{
for(int i =0; i<str.length();i++){
int getNumber = (int) (Math.random()*str.length());
for(int j = 0;j < Numbers.length;j++){
if((getNumber == Numbers[j])){
break;
}
}
word+=words[getNumber];
Numbers[i]=getNumber;
}
}catch(ArrayIndexOutOfBoundsException ee){
System.out.println(ee);
}
return word;

}

==> 실패했다 ... <= 실패한 이유: 반복문과 배열을 너무 계획없이 쓴 것같다.
                                                그 때문에 ArrayIndexOutOfBoundsException이 생겼고 
                                               이 문제를 해결하는 데 너무 오랜 시간이 걸려 접었다.
      
     장점: 절대로 str이 그대로 나올 수 없다. <= if문으로 제한을 걸어 뒀기 때문


문제2)
1. 화면을 통해 사용자의 입력을 받는다.(Scanner클래스 사용)
2. 사용자가 q 또는 Q를 입력하면 프로그램을 종료한다.
3. 사용자가 정답을 맞출때까지 반복하다가
4. 사용자가 정답을 맞추면, while문을 빠져나간다.

while(true){                                                                    //3.
System.out.println("Question: "+question);
System.out.print("Your answer is : ");
Scanner ic = new Scanner(System.in);                       //1.
String sk = ic.next();
if(sk.equals("Q")||sk.equals("q")){                           //2. 답에서는 equalsIgnoreCase 메소드를 사용.
        System.out.print("프로그램을 종료합니다.");
        break;
}
if(sk.equals(answer.toLowerCase())||sk.equals(answer.toUpperCase())){
System.out.print("정답입니다");
break;                                                    //4. break만 삭제하면 문제3)의 답이 된다.
}else{
System.out.println(sk+"는 정답이 아닙니다. 다시 시도해주세요");
}
}


문제3)
문제2의 예제를 변경해서, 문제를 맞추더라도 프로그램이 종료되지 않고 다음문제를 보여주도록 하세요.


문제4) getHint를 완성하시오.

String getHint(String answer, char[] hint) - 문제의 답의 일부를 보여주는 메서드
                                                             한번 틀릴 때마다 한글자씩 더 보여준다.
answer - 문제의 정답
hint - 문제의 문자개수를 '_'로 표현해줌. ex) LOVE => ____

 public static String getHint(String answer, char[] hint) {
           int count = 0; //힌트에 포함된 '_'의 개수
         char[]hintArray=answer.toCharArray();
         
        for(int i=0;i<hint.length;i++){         // 이 for문을 통해 '_' 의 갯수를 센다.   
        char temp = hint[i];
        if(temp=='_'){
        count++;
        }
        }
        
        if(count > 2){                                                   // 너무 많은 힌트를 주는 것을 방지하기 위해 
        int idx = (int) (Math.random()*hint.length);    //'_' 갯수가 2개 이상이어야 힌트를 준다.
        hint[idx]=hintArray[idx];
        }
     return new String(hint);
     }


[출처]
 [Java1000제]Word Scramble 4 - 단어 맞추기(3번답 포함) (남궁성의 코드초보스터디(자바 java, c언어)) |작성자 남궁성[출처] [Java1000제]Word Scramble 3 - 단어 맞추기 (남궁성의 코드초보스터디(자바 java, c언어)) |작성자 남궁성



[출처] [Java1000제]Word Scramble 2 - 단어 맞추기(1번답 포함) (남궁성의 코드초보스터디(자바 java, c언어)) |작성자 남궁성





댓글 없음:

댓글 쓰기