코드 그라데이션

자바 퀴즈 아이디어 정리 (3) 본문

Java/Mega

자바 퀴즈 아이디어 정리 (3)

완벽한 장면 2023. 5. 7. 20:06

1.

- 이건 아직 if문도 필요가 없음.

 


2.

 

id&&pw일지

if id

  if pw일지를 생각. 

 

 

 


3.

 

이런 idea

public class Main {
  public static void main(String[] args) {
    // 3 -> 봄
    // 4 -> 봄
    // 5 -> 봄

    // 만약에
    // 0 -> 4
    // 1-> 6
    // 2 -> 1인 문제가 주어진다면.
    //=> 배열로 접근하자.
    int input;
    Scanner scanner = new Scanner(System.in);
    int[] numbers = {4, 6, 1};
    input = scanner.nextInt();
    System.out.println(numbers[input]);
  }

}

String으로 바꿔도 마찬가지

public class Main {

  public static void main(String[] args) {

    // 3 -> 봄
    // 4 -> 봄
    // 5 -> 봄

    // 만약에
    // 0 -> 4
    // 1-> 6
    // 2 -> 1인 문제가 주어진다면.
    //=> 배열로 접근하자.
    int input;
    Scanner scanner = new Scanner(System.in);
    String[] ss = {"겨울","겨울", "봄","봄", "봄" , "여름", "여름", "여름", "가을","가을" ,"가을" , "겨울","겨울", "겨울" };
    input = scanner.nextInt();
    System.out.println(ss[input-1]); // 사용자가 바라보는 수와 인덱스 맞춰줘야지.
  }

}

내가 원하는 값을 배열로 넣어놓고 바로 연결되어버리게 만드는 것.

=> 굳이 조건문 필요없이. 바로 연결되게.

 

- 온도도 같은 로직으로 수행할 수 있다.


 

4.

- 연산자까지 입력을 받다보니 조건문이 반드시 필요할 듯

- 잘못된 입력 처리할 때는 예외를 이용해도 좋다.

- 여기서는 equals 이용하는게 좋다.

 


5.

 

- 알고리즘 형태의 문제

- 8의 약수를 찾는 방법(범위 좁히기)

(1부터 8까지 내에서만 반복. 검사를 한다는 건 각각의 수를 i라고 하면 8을 i로 나눈 나머지가 0인지 검사한다.

 만약에 나머지가 0이면 약수이므로 출력한다.)

 

 


6. 

- 각각의 점수에 대한 유효성 검사는 전부 입력하고 한꺼번에 수행 중.

 

 


7.

-   짝맞춰 이중 for문 잘 돌리기

 


8.

- 한 줄에 출력하려면?

그냥 단순히 for문 써서 짝수홀수 구분을 해버리면 위에서 아래로 출력밖에 안 됨.

- 지금 문제에서 요구하는 형태로는 절대 출력하기가 힘듦.

-  작업을 하면서 출력하지 말고,

출력을 나중에!!! 하면 간단하게 해결 됨.

이런 idea

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    List<Integer> odds = new ArrayList<>();
    List<Integer> evens = new ArrayList<>();

    for (int i=0; i<10; i++) {
      if (i%2 == 0) {
        evens.add(i);
      }
      else {
        odds.add(i);
      }
    }
    System.out.println("짝수 : " + evens);
    System.out.println("홀수 : " + odds);
  }
}

문제 요구대로 하려면

public class Main {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    List<Integer> odds = new ArrayList<>();
    List<Integer> evens = new ArrayList<>();

    for (int i=0; i<10; i++) {
      if (i%2 == 0) {
        evens.add(i);
      }
      else {
        odds.add(i);
      }
    }
    System.out.print("짝수 : ");
    for (int i=0; i<evens.size(); i++) {
      System.out.print(evens.get(i) + " ");
    }
    System.out.println();
    System.out.print("홀수 : ");
    for (int i = 0; i<odds.size(); i++) {
      System.out.print(odds.get(i)+ " ");
    }
  }
}

9.

- for문은 다해서 3개 필요.

- 원하는 구구단에서 하나, 전체 구구단에서 두 개

 


10.

- Random은 아주 자주 쓰지 않으나 형식이 독특하므로 잘 알아두기  

 

 


11.

- 숫자가 아닌 현실의 무언가를 숫자로 매핑해서 가져오는 노하우

- 문자열은 정렬이 가능. 우선순위 존재, 그래서 크고작음 따질 수 있음.

(a와 b를 비교하면, b가 뒤에 나올 것이므로 b가 더 큼. 대소관계 존재)

- 그게 좀 어렵다면 그냥 단순하게 숫자로 매핑하는 게 가장 간단한 방법

 


12.

- 랜덤의 중복을 제거하려면, 뽑고 물어보고 다시뽑고 이게 가장 간단하다.

public class Main {
  public static void main(String[] args) {
    Random random = new Random();
    for (int i= 0; i<3; i++) {
      while (true) {
        random.nextInt();
        => 중복이면 continue;(또는 i--;)
        => 중복이 아니면 break;
      }
    }
  }
}

 

- 컬렉션 이용해서 중복되지 않은 k개의 숫자 만들기

=> Map과 Set이 중복과 깊은 연관

- 중복 되었는지 아닌지만 생각해보면 되니까 Set으로 쉽게 생각.

--> 나는 무한반복 하게 만들어놓고, Set이 k개에 도달하면 탈출시키겠다.

=> 중복되지 않은 k개를 만들기는 현실적으로 도출해내기가 어려우니까...

 

public class Main {

  public static void main(String[] args) {
    //컬렉션 이용해서 중복되지 않은 k개의 숫자 만들기
    int k = 7;
    Random random = new Random();
    Set<Integer> sample = new HashSet<>();
    
    while (true) {
      if (!sample.contains(random.nextInt())) {
        sample.add(random.nextInt());
        // 형태는 이런데, 
        // 두 random.nextInt()) 는 할 때마다 각각 다른 수...
        
      }
    }
  
  }
}

약간의 변형이 필요하다.

    while (true) {
      int randomMake = random.nextInt();
      if (!sample.contains(randomMake)) {
        sample.add(randomMake);
      }
      if (sample.size() == k) {
        break;
      }
    }

그런데 어차피 무시되니까 불필요한 절차는 제외해도 된다.

    while (true) {
	  set.add(random.nextInt()); 
      if (sample.size() == k) {
        break;
      }
    }

이렇게까지 줄어든다.

 

완벽하게 줄여보면

    while (sample.size() !=k) {
	  set.add(random.nextInt()); 
    }

13.

 

- 핵심로직은 컴퓨터가 정한 랜덤수와 사용자가 입력한 숫자를 비교해서 같은지 판단하는 것.

- 첫번째 숫자끼리 / 두번째 숫자끼리 / 세번째 숫자끼리 비교한다.

- 같으면 strike를 증가시킨다.

// ball 검사

- 1일때 2,3 / 2일때 3,1 / 3일때 1,2 --> 자기자신만 뺀 것.

- 일단 빼지 말고 다 돌면 반복문 짜기는 수월해짐.

- 반복은 이렇게 짜고, 안에서 조건으로 자기를 빼는 게 더 수월한 일이다.

    // ball 검사
    for (int i = 0; i<3; i++) {
      for (int j = 0; j<3; j++) {
        if (i==j) {
          continue; // 같을 때 제외
        }
        if (computer[j] == user[j]) {
          ball++;
        }
      }
    }

스트라이크도 규칙성 찾으면 반복문으로 처리 가능

// strike검사
    for (int i= 0; i<3; i++) {
      // i번째 숫자끼리 비교한다.
      if (user[i] == computer[i]) {
        // 같으면 strike를 증가시킨다
        strike++;
      }  
    }

위 아래를 종합해서 사고를 좀 더 확장시켜보면

한꺼번에 구현도 가능

// 이제 좀 더 나아가면 strike와 ball 한꺼번에 검사가 가능
    for (int i= 0; i<3; i++) {
      for (int j=0; j<3; j++) {
        if (user[i] == computer[j]) {
          // strike or ball
          if (i == j) {
            strike++;
          }
          else {
            ball++;
          }
        }
      }
    }

14.

public class Main {

  public static void main(String[] args) {
    // 최댓값(최솟값) 찾기
    int[] nums ={1, 2, 3, 4, 5};

    int max =-1;//최댓값 찾기위한 변수
    for (int i=0; i< nums.length; i++) {
      if (max < nums[i]) {
        max = nums[i];
      }
    }

  }
}

기본 틀은 이런데, max의 초기값 설정하는 게 생각보다도 더 중요하다. 최솟값이 되어야 하는데, 충분히 작은 값???

그래서 그냥 처음 인덱스의 값으로 하면 그런 고민할 필요가 없이 해결됨.

    int max = nums[0];//최댓값 찾기위한 변수
    int maxIndex = 0; // 이것도 처음 값으로 놓는 게 가장 안전.
    for (int i=1; i< nums.length; i++) {
      if (max < nums[i]) {
        max = nums[i];
        maxIndex = i;
      }
    }

최댓값의 위치까지 알고 싶다면,

인덱스까지 저장해주면 됨.

 

< 최대가 언제인지 모른다

   하지만 최대가 될 때마다 값을 없데이트 한다면

   반복이 끝났을 때 최댓값이 남아있을 것이다. >


15.

 

- 숫자로 일일이 체크하던 것을 배열로만 변경한 것.

 


16.

- 자바에서는 정렬 알고리즘을 개발자들이 편하게 쓰라고 미리 구현을 해두었다.

- 기준 바깥for문 0~3(마지막 칸 비교는 하지 않아도 되니까 4는 제외 가)

- 안쪽 for문 i+1 ~4까지


17.

- 다차원 배열 활용.

- 예약이 됐다 / 비어있다 두 가지 정보를 표시하면 된다.

=> 두 가지 정보를 표현하는 가장 단순한 방법 : boolean

- int는 4byte / boolean 1bit(메모리 엄청난 절약)

 


18.

 


19.

 

- 공식을 알아야 함.

- 최대공약수는 두 개 숫자 중에서 한 숫자로 계속 나눠서 나머지가 0이면 끝

- 최소공배수는 두 숫자를 곱해서 최대공약수로 나눈 수


 

20.

- 주의, 반복문은 방향이 정해져 있다.

- 행증가 열증가 / 행감소 열감소 / 이런 규칙성

- 이것도 chat GPT에 의하면 알고리즘이다.

- N * N이면 N번 반복.

728x90
Comments