4일차 퀴즈까지 복습

정혅·2024년 2월 10일

더 조은 아카데미

목록 보기
6/76

지금까지 했던 내용들 복습하기

  • 이 표시는 작성하다 실수한 문장 피드백

Day-2 퀴즈(이클립스로 한번 작성 후 메모장에 작성 - 아무것도 안보고)

Q1. 임의의 두 수를 입력받아 큰 수를 출력하고, 두 수가 서로 같으면 같다고 출력

import java.util.Scanner;
class Day2_Q1{
    public static void main(String[]args){

    Scanner sc = new Scanner(System.in);

    int num1 = 0, num2 = 0;

    System.out.print("첫번째 숫자를 입력하세요 : ");
    num1 = sc.nextInt();

    System.out.print("두번째 숫자를 입력하세요 : ");
    num2 = sc.nextInt();

        if(num1 > num2)
        {
            System.out.println(num2 + " 보다 " + num1 + " 이 더 큽니다.");
        }
        else if(num1 < num2)
        {
            System.out.println(num1 + " 보다 " + num2 + "이 더 큽니다.");
        }
        else
        {
            System.out.println(num1 + " 과 " + num2 + "는 같습니다.");
        }
    }
}    

  • Scanner를 들여오는 명령은 안함..

  • 사용자의 입력을 저장할 변수 앞에 Scanner 사용해서 에러

  • 자꾸 오타를 낸다.


Q2. 임의의 숫자 5개를 입력받아 오름 차순으로 정렬하시오.

import java.util.Scanner;
class Day2_Q2{
    public static void main(String[]args){

        int a = 0, b = 0, c = 0, d = 0, e = 0;
        int temp = 0;

        Scanner sc = new Scanner(System.in);
        //임의의 숫자 받기
        System.out.print("1번 숫자를 입력하세요.");
        a = sc.nextInt();
        System.out.print("2번 숫자를 입력하세요.");
        b = sc.nextInt();
        System.out.print("3번 숫자를 입력하세요.");
        c = sc.nextInt();
        System.out.print("4번 숫자를 입력하세요.");
        d = sc.nextInt();
        System.out.print("5번 숫자를 입력하세요.");
        e = sc.nextInt();
        //첫번째 자리에 최소값 구하기
        if(a > b)
        {
            temp = a;
            a = b;
            b = temp;
        }
        if(a > c)
        {
            temp = a;
            a = c;
            c = temp;
        }
        if(a > d)
        {
            temp = a;
            a = d;
            d = temp;
        }
        if(a > e)
        {
            temp = a;
            a = e;
            e = temp;
        }
        //두번째 최소값 구하기
        if(b > c)
        {
            temp = b;
            b = c;
            c = temp;
        }
        if(b > d)
        {
            temp = b;
            b = d;
            d = temp;
        }
        if(b > e)
        {
            temp = b;
            b = e;
            e = temp;
        }
        //세번째 최소값 구하기
        if(c > d)
        {
            temp = c;
            c = d;
            d = temp;
        }
        if(c > e)
        {
            temp = c;
            c = e;
            e = temp;
        }
        //4번째 최소값 구하기
        if(d > e)
        {
            temp = d;
            d = e;
            e = temp;
        }
        System.out.println(a + " " + b + " " + c + " " + d + " " + e);
    }
}

Q3. 1부터 100사이의 임의의 난수를 발생시키고, 그 숫자를 맞추는 게임을 만드시오.

예: 게임을 시작합니다. 숫자를 입력하세요. 50 당신이 입력한 숫자 보다 큽니다. 80 당신이 입력한 숫자 보다 작습니다. 67 정답입니다. 당신은 3번만에 정답을 입력하셨습니다. 프로그램을 종료합니다

import java.util.Scanner;
import java.util.Random;
class Day2_Q3{
    public static void main(String[]args){
        int correct = 0, ans = 0, cnt = 0;

        Scanner sc = new Scanner(System.in);
        Random ran = new Random();

        correct = ran.nextInt(101);

        System.out.println("게임을 시작합니다.");    
        System.out.print("숫자를 입력하세요.");

        while(ans != correct){

        ans = sc.nextInt();
        cnt++;

            if (ans > correct){

                System.out.println("당신이 입력한 값보다 작습니다.");

            }else if(ans < correct){

                System.out.println("당신이 입력한 값보다 큽니다.");

            }else{

                System.out.println("정답입니다. 당신은 " + cnt + "번만에 정답을 맞추셨습니다.");
            }
        }
    }
}            
  • 크게 어려운점은 x > 노트로 다 적으니 아무래도 오타가;;


Day3 - 퀴즈

Q1. 1부터 100까지의 합

class Day3_Q1{
    public static void main(String[]args){

    int i = 0, sum = 0;

        do{
            i++;    
            sum += i;
            System.out.println(sum);
        }while(i <= 100);
    }
}
  • 실수 : i 증감 시키는 순서가 제일 앞에 있는것을 깜빡하고 i 를 1로 둬서 i 의 값이 바로 2부터 더해졌다.(2부터 100까지 합이 된것..)


Q2. 7의 배수의 합이 최초로 1000을 넘는 수와 그 수가 몇번째 항인가

class Day3_Q2{
    public static void main(String[]args){

int i = 0, sum = 0, cnt = 0;

            do {
                cnt++;
                i += 7;
                sum += i;
            } while (sum <= 1000);
        System.out.println("최초로 1000이 넘는 수는 " + sum + " 이고, 그 수는 " + cnt + "번째 이다.");    
    }
}


Q3. 1부터 20까지 출력하는데, 2의 배수와 3의 배수는 출력하지않고 continue 이용하기

class Day3_Q3{
    public static void main(String[]args){    
    
    int num = 0;

        for(num = 1; num <= 20; num++) {

            if (num % 2 == 0 || num % 3 == 0) {
                continue;
            }
        System.out.println(num);
        }
    }
}


Q4. 5의 배수이자 7의 배수인 가장 작은 수를 출력해라, break 이용

class Day3_Q4{
    public static void main(String[]args) {

        for(int num = 1; num < 50; num++) {

            if(num % 5 == 0 && num % 7 == 0) {

                System.out.println("5 와 7의 최소공배수는 " + num);
                break;
            }
        }
    }
}
  • int num을 0으로 초기화 시켜놔서 계속 출력이 0이 됐다.

  • break; 뒤에 print 하면 당연히 출력이 안되므로 조심


Q5.임의의 수를 입력받은 후 소수인지 아닌지 출력하기

소수(Prime Number): 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수

class Day3_Q5boolean{ //boolean이용한 문
    public static void main(String[]args) {

    int anum = 0, snum = 0; //anum은 임의의수, snum은 소수 비교하는 값
    boolean flag = true;
    Scanner sc = new Scanner(System.in);

    System.out.print("값을 입력하세요 : ");
    anum = sc.nextInt();

        if(anum <= 1) {

            System.out.println("소수가 아닙니다.");

        }for(snum = 2; snum < anum; snum++) { // 여기 snum이 1이라면

            if(anum % snum == 0) {

                flag = false;
                break;

            }
        if(flag) {
            System.out.println("소수 입니다.");
        }else {
            System.out.println("소수가 아닙니다.");
        }
    }
}
  • 처음에는 for문과 if문을 이용해서 도전하다가 안되서 boolean을 이용해서 도전했다.

  • snum을 1로 초기화 해놓아서 계속 소수가 아니다만 출력됐다.

  • break하고 뒤에 if(anum == snum) flag = true; 를 작성했는데 어차피 true의 값을 가지고 가다가 flag가 flase가 되면 소수가 아니다를 출력하가 때문에 필요x한 문장이라 판단해 삭제했다.

  • for/if문과 다르게 sum < anum인 이유가 자기 자신까지 값이 더해지면 나머지가 결국 0이 무조건 되기때문에 그것을 방지하기 위해서이다.

    • 나머지가 0이 되는 수들은 break를 이용해 걸러주고, 결국 나머지가 0이 아닌 애들이 flag를 통해 소수 입니다. 라고 출력하는 것
class Day3_Q5for_if{
    public static void main(String[]args) {

    int anum = 0, snum = 0; //anum은 임의의수, snum은 소수 비교하는 값

    Scanner sc = new Scanner(System.in);

    System.out.print("값을 입력하세요 : ");
    anum = sc.nextInt();

        if(anum <= 1) {

            System.out.println("소수가 아닙니다.");

        }for(snum = 2; snum <= anum; snum++) { //snum이 1이면

            if(anum % snum == 0) 

                break;

        }if(anum == snum){

            System.out.println("소수 입니다.");

        }else {
            System.out.println("소수가 아닙니다.");
        }
    }
}
  • boolean과 다르게 얘는 snum <= anum으로 해줘야 anum == snum이 되었을때 소수인지 아닌지를 출력하기 때문에 꼭 작거나 같다 라고 넣어야한다.

  • **** snum이 1이면 무조건 소수가 아니라고 나오는 이유

    • anum % snum이 0이 나오지 않기 때문에 무조건 밑에 if문으로 내려가는데 anum == snum과 같지 않으니까 무조건 소수가 아니다가 출력된다.


Day4 - 퀴즈

Q1. 2단 세로로, 3단 세로로 ~ 이렇게 구구단 출력하기

class Day4_Q1{
    public static void main(String[]args){
        int dan = 0, num = 0;
        for(num = 1; num < 10; num++){
            for(dan = 2; dan < 10; dan++){
                System.out.print(dan + " * " + num + " = " + dan * num + "\t");
            }
        System.out.println();
        }
    }
}


Q2. 반복문을 이용하여 다음 식을 만족하는 A와 B의 조합을 구하는 프로그램을 작성하자.

AB

+BA = 99

class Day4_Q2_1{
  public static void main(String[]args){  
    int i = 0, j = 0;

        for(i = 0; j < 10; i++) { 

            for(j = 9; j >= 0; j--) {

                if((j * 10 + i) + (i * 10 + j) == 99){

                    System.out.println(j + " " + i + " + " + i + " " + j + " = 99" );
                }
            }
        }
    }
}
  • 몰랐다가 i - for문에 j가 10보다 작은동안이라고 해놓아서.. j가 감소되어도 출력이 제대로 나온것이였다.

class Day4_Q2_2번 방법{
int i = 0, j = 0;

        for(i = 0; i < 10; i++) {

            for(j = 0; j < 10; j++) {

                if((j * 10 + i) + (i * 10 + j) == 99){

                    System.out.println(j + " " + i + " + " + i + " " + j + " = 99" );
                }
            }
        }
    }
}

Q4.

사진과 같이 출력되게 하시오.

class Day4_Q4{
    public static void main(String[]args){

    int h = 0, y = 0, num = 0;

        for(h = 0; h < 5; h++) { //행

            for(y = 0; y < 5; y++) { //열

                if(num <= 25) {

                num++;
                System.out.print(num + " ");
                }
            }
            System.out.println();
        }
    }
}
  • 행 과 열만 생각하고 25이하만 출력하는것을 까먹었다.. num이 for문이 진행되는동안 계속 늘어나서 25까지만 출력되는게 아니라 30이상을 출력시켜버렸다.

  • if문을 이용해 25까지만 출력시키게 해주었고 줄 나뉨 위치를 행 for문에 위치 시켜서 줄나뉨이 이상하게 되었다.


Q5. 4 x 7의 역삼각형이 출력되게 하시오.

class Day4_Q5{
    public static void main(String[]args){

        int i = 0, j = 0;

        for(i = 0; i < 4; i++){ //행

            for(j = 0; j < i; j++){

                System.out.print(" ");

            }for(; j < 7 - i;  j++){

                System.out.print("*");

            }
        System.out.println();
        }    
    }
}
  • 변수를 3개 사용해서for 문을 3개 사용할 생각함

  • 중괄호로 반복문을 따로 정한게 아니라 그냥 안정하고 중괄호를 막 마지막에 다 몰아넣음..

  • 공백 + + 공백 이렇게 생각한게 패착인듯.. 을 7개 출력해야한다고 생각해서 for문 이용해서 7보다 작다고 설정해야된다고 생각함.


Q6. int형 정수 15678의 오른쪽 세번째 비트와 다섯번째 비트가 각각 어떻게 되는지 확인하여 출력하는 프로그램

class Day4_Q6{
    public static void main(String[]args){

    System.out.println(15678 >> 2 & 1)
    System.out.println(15678 >> 4 & 0)
    }
}
  • 얘는 아직 이해 안가는 부분 존재,

    • 시프트 연산 이용해 비트 and연산자를 통해 0,1을 구분해서 출력한다했는데, 저 문장은 0을 입력해서 출력하면 0 이고 , 1을 입력해서 출력하면 1로뜬다.

Day4-1 - 메소드 이용한 퀴즈

Q1. 사칙연산을 각각 메소드로 사칙연산의 결과값을 리턴한다.

class Day4_1_Q1{
public static void main(String[] args) {

        oper(10,10);

    }
    public static void oper(int num1, int num2) {

        System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));
        System.out.println(num1 + " - " + num2 + " = " + (num1 - num2));
        System.out.println(num1 + " * " + num2 + " = " + (num1 * num2));
        System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
        System.out.println(num1 + " % " + num2 + " = " + (num1 % num2));
    }
}
  • 연산은 + 와 우선순위가 동일하기 때문에 괄호를 해주지 않으면 에러

  • 가독성을 위해 다 괄호를 해줬다.

  • return은 사용 안할것이기 때문에 void를 사용 후 호출만 해줬다.


Q2. 정수값 하나를 넘겨주면 그 정수에 해당하는 구구단 출력

return값 x

class Day4_1_Q2{
    public static void main(String[]args){

        multi(3);

    }
    public static void multi(int a) {

        for(int j = 1; j < 10;j++) {
            System.out.println(a + " * "+ j + " = " + a*j);
        }
    }
}


Q3. 정수값 두개를 넘겨주면 첫 번째 매개변수 시작단부터 두번째 매개변수 끝단까지 출력하는 메소드

class Day4_1_Q3{

    public static void main(String[]args){    

        multi(3,5);

    }
    public static void multi(int a, int b) {

        for(; a <= b;a++) {
            for(int j = 1; j < 10;j++) {
                System.out.println(a + " * "+ j + " = " + a*j);
            }
        }
    }
}


Q4.숫자하나를 넘겨주면 1부터 그 숫자까지 더해서 그 값을 리턴하는 메소드

예 5를 넘겨주면 1부터 5까지 순차적으로 더해서 그 값을 리턴

class Day4_1_Q4{
    public static void main(String[]args){

    System.out.println(multi(5));

    }
    public static int multi(int a) {

        int i = 0, sum = 0;
        for(i = 1; i <= a; i++) {

            sum += i;

        }
        return(sum);
    }
}
  • return을 받을 것이기 때문에 int를 사용해줬다.
  • int로 메소드 리턴타입을 주었기 때문에 반드시 int형으로 반환해야한다.

Q5. 정수값 두개를 넘겨주면 첫 번째 매개변수가 시작값부터 두 번째 매개 변수가 끝값까지 더해서 리턴

5와 10을 넘겨주면 5부터 10까지 순차적으로 더해서 그 값을 리턴

class Day4_1_Q5{
    public static void main(String[]args){
System.out.println(multi(5,10));

    }
    public static int multi(int a, int b) {

        int  sum = 0;
        for(; a <= b; a++) {

            sum += a;

        }
        return(sum);
    }
}
  • multi메소드의 변수가 2개면 main메소드에서도 무조건 2개의 값을 입력해서 호출을하던 해야한다.

Q6. 정수값 하나를 넘겨주면 그 정수값에 대한 팩토리얼 값을 리턴

class Dat4_1_Q6{
    public static void main(String[]args){
System.out.println(multi(5));

    }
    public static int multi(int a) {

        int i = 0, fac = 1;
        for( i = 1; i <= a; i++) {

            fac *= i;

        }
        return(fac);
    }
}
  • 갑자기 저 값들을 어떻게 곱해서 더해놓지 라는 뇌정지가 왔다...

  • 그냥 fac *= i;하면 됐는데..


Q7. 숫자 하나를 넘겨주면 그 숫자가 소수면 true, 소수가 아니면 false를 리턴

class Day4_1_Q7{//내가 작성한 소스 
  public static void main(String[]args){  

        System.out.println(sosu(11));

    }
    public static boolean sosu(int a) {

        int i = 0;
        boolean flag = true;
        if(a <= 1) {

            flag = false;

        }for(i = 2; i < a; i++) {

            if(a % i == 0) {

                break;
            }
        }if(a == i) {

        }else {
            flag = false;
        }
        return(flag);
    }
}
  • 아까 연습 엄청해서 틀리지 않고 한번에 무사통과
class Day4_1_Q7{ //간단하게 이렇게도 작성가능 
    public static void main(String[] args){
System.out.println(sosu(11));
	}
	public static boolean sosu(int a) {
		
		int i = 0;
		
		if(a <= 1) {
			
			return false;
		
		}for(i = 2; i < a; i++) {
			
			if(a % i == 0) 
				return false;
		}
	return true;
	}
}

Q8. 7번 메소드를 이용하여 1~100사이의 모든 소수 출력해라

for(int num = 1; num < 100; num++) {//틀린 문장 
        if(sosu(num){ System.out.println(num); //여기서 에러 
        }
    }
    public static boolean sosu(int a) {

        int i = 0;
        boolean flag = true;
        if(a <= 1) {

            flag = false;

        }for(i = 2; i < a; i++) {

            if(a % i == 0) {

                break;
            }
        }if(a == i) {
            System.out.println(a);
        }else {
            flag = false;
        }
        return(flag);
    }
}
  • 소수인 값을 출력하려 했더니 boolean으로 설정해놓은 탓에 true와 false로만 출력/ int로 반환메소드 변경했는데 main메소드에서 갑자기 에러..boolean때문인것같은데

  • 위 문장대로면 (7번 문제를 변경) sosu메소드에서 소수의 값을 출력하고 있는데 굳이 main메소드에서 출력할 필요 없는 문제였음 , main메소드에서 출력하게 되면 true, flase까지 다 출력되는 까닭 <> 그러나 위 문장은 7번문제를 변형해서 틀린문장
for(int num = 1; num < 100; num++) { //정답인 문장 

        if(sosu(num))
            System.out.println(num);

        } 
     }
        public static boolean sosu(int a) {

            int i = 0;
            boolean flag = true;
            if(a <= 1) {

                flag = false;

            }for(i = 2; i < a; i++) {

                if(a % i == 0) {

                    break;
                }
            }if(a == i) {

            }else {
                flag = false;
            }
            return(flag);
        }
    }
  • main메소드에서 1~100까지 sosu메소드에 넣을 수 있는 반복문을 만들고

  • if문을 사용해 호출과 값을 받아오는 역할을 맡게한다.

  • 그 후에 println(num)을 작성하면 sosu메소드에서 반환된 소수들을 출력시킨다.

    • 나는 바보같이 main메소드에서 출력하는 곳과 반환 받는곳을 함께 넣어놔서 true/flase와 소수값이 함께 반환된것이였다.

    느낀점

    1. 아직 제대로 논리적 사고를 통해서 문제를 푸는것은 부족하다고 느꼈다.
    2. 소수나 절대값등을 출력하라고 하면 어떻게 작성해서 수학적으로 풀어내 컴퓨터가 인식하게끔 해야하는지 바로 생각되지 않는다.
    3. 중괄호를 제대로 닫고 문장을 진행시키지 않아 반복문을 벗어나 작성해야하는 문장이 반복문에 있다거나 하는 실수가 많았다.

0개의 댓글