JAVA 문제풀이

강정우·2022년 7월 4일
0

JAVA

목록 보기
10/31
post-thumbnail

7/4 강의

  1. 오늘은 시험을 봤다 간단한 이론들과 실습, 팀 플레이에 대해 시험을 봤다.
  2. 또한 오늘 오후에는 배열을 이용한 여러 문제들을 풀어보았다.

문제

1. 구구단을 외자!(lil upgrade ver.)

  • 문제 : 구구단문제를 푸는 게임을 만든다.
  • 조건

    1) 목숨은 3개로 목숨이 0이 되면 다시 할 것인가를 물어본다.
    2) 틀렸다면 새로운 문제가 아닌 전에 문제를 다시 출제한다.
    3)최고기록을 경신 했다면 점수를 출력한다.

  • 분석 : 이번 문제역시 랜덤 값은 초기에 주어지고 만약 맞춘다면 문제를 새로 random함수로 보내고 아니라면 기존에 있던 변수들을 다시 출제하는 방식으로 생각했다. 또 목숨과 최고기록과 현재 기록을 각각 변수를 선언하여 조건문을 작성하였다.
  • 애로사항 : 문제풀 때 나의 생각은 언제나 test case와 100% 일치하여야 한다고 생각한다. 따라서 세세한 문장의 순서를 똑같이 구연하느라 오히려 시간을 더 쓴것같다.
  • 코드 :
import java.util.Random;
import java.util.Scanner;

public class Q_1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);	// scanner 생성자
		Random r = new Random();	// 랜덤 생성자
		int life = 3;		// 목숨 선언
		int high_score = 0;		// 최고점수
		int score = 0;		// 현재 점수
		int answer = 0;		// 참가자가 생각하는 정답
		int dan = (r.nextInt(8) + 2);	// 2~9단까지의 단
		int range = (r.nextInt(9) + 1);	//	1~9단까지의 범위
		String choice = "";		// 계속 할것인가의 참가자의 선택
		
        // 게임 시작!

		System.out.println("구구단을 외자! 구구단을 외자!");
		while (true) {
        	// 문제 출제
			System.out.print(dan + " * " + range + "=");
            //문제 입력
            answer = sc.nextInt();
			if (answer == dan * range) {
				System.out.println("정답!!!");
				score += 1;		// 1점 
				dan = (r.nextInt(8) + 2);		// 새로운 문제를 위한 변수 생성
				range = (r.nextInt(9) + 1);
			} else {
				System.out.println("땡! 틀렸습니다.");
				life -= 1;
				if (life != 0) {
					System.out.println("남은 목숨 : " + life);
				}
			}
            // 점수와 관련된 코딩 최고점수를 기록 했을 때만 출력.
			if (life == 0) {
				if (high_score < score) {
					high_score = score;
					System.out.println("최고기록 경신!!" + high_score + "점!");
				}
				System.out.println("목숨을 모두 소진하였습니다. 다시 하시겠습니까? (Y|N) >> ");
				choice = sc.next();
				if (choice.equals("Y")) {
                	// 다시 시작한다면 목숨과 점수 초기화
					life = 3;		
					score = 0;
				} else {
					break;
				}
			}
		}
		sc.close();
	}
}

2. 로또 생성기

  • 문제 : 1~45번까지의 무작위 번호를 6개 생성한다. 단, 나왔던 숫자는 또 나오면 안 된다.
  • 분석 : 2중 for문을 돌려서 검사 후 같다면 새로운 변수를 생성한다.
  • 애로사항 : 애로사항은 int값이 계속 바뀌어 들어가고 index인 i값은 계속 증가하기 때문에 결국은 초반에 있는 index의 값과 겹치는 현상이 발생. error
  • 해결 : 생각의 전환이 필요했음. 번호들이 전부 안 겹치면 그때 i값에 추가하는게 아니라 일단 추가를 하고 번호가 겹친다면 다시 i를 빠꾸 쳐서 다시 생성하게 하면 됨. 즉, index인 i값은 맞는지 틀린지 조건문을 계산 후 i값이 ++ 되어버리기 때문에 만약 중복이라면 i값을 다시 끄집고 와야한다는 생각.
  • 코드 :
import jaca.util.Arrays;

public class Q_2{
	public static void main(String[] args){
    	int[] lotto = {0,0,0,0,0,0};
        Random r = new Random();
        for(int i = 0; i < 6; i++){
        	lotto[i] + r.nextInt(6) + 1;
            for(int j = 0; j < i; j++) {
            	if (lotto[i] == lotto[j]){
                	i**;
                }
            }
        }
        System.out.println(Arrays.toString(lotto));
    }
}

3. 여러 연산자들의 순서를 계산하여 예측

  • 코드
public class Q_3 {

	public static void main(String[] args) {
		int a = 1;
		int sum = 0;
		while(a++ < 10) {	//비교연산자 비교 하고나서!! a가 ++
			sum += a*3 >= sum ? a:1;
		}
        System.out.println(sum);
	}
}
  • 문제 : 결과값을 예측하라.
  • 분석 : 우선 a와 sum은 각각 1과 0으로 초기화 되어있다.
    그리고 while문에 들어감과 동시에 a의 값은 2가 되어 계산된다.
    다음 while문 다음에 있는 여러개의 다중 연산자와 3항 연산자의 순서는 먼저 >= , 삼항연산자(?) , 마지막으로 대입 연산자인 += 순으로 계산된다.
  • 위의 결과값은 스스로 디버깅하며 생각해본 결과값이다.
  • 정답 : 39
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글