자바 퀴즈 아이디어 정리 (3)
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번 반복.