오늘의 숙제는 2개다. 하나는 코드는 길지만 쉬운 주차문제였고. 하나는 나에게 꽤나 어려웠던 로또 문제였다
로또 문제는 짝꿍의 도움을 받아 완성하긴 했지만 코드를 완벽히 이해하기 위해선 복습이 중요할 것 같다 !!!!
[문제1] 주차장 관리 프로그램
[실행결과]
주차장 관리 프로그램
**************
1. 입차
2. 출차
3. 리스트
4. 종료
**************
메뉴 :
[1번인 경우]
위치 입력 : 3
3위치에 입차 / 이미 주차되어있습니다
[2번인 경우]
위치 입력 : 4
4위치에 출차 / 주차되어 있지않습니다
[3번인 경우]
1위치 : true
2위치 : false
3위치 : true
4위치 : false
5위치 : false
package array;
import java.util.Scanner;
public class Parking {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean[] ar = new boolean[5];
while(true) {
System.out.println();
System.out.println("주차장 관리 프로그램");
System.out.println("**************");
System.out.println(" 1. 입차");
System.out.println(" 2. 출차");
System.out.println(" 3. 리스트");
System.out.println(" 4. 종료");
System.out.println("**************");
System.out.print("메뉴 : ");
int menu = scan.nextInt();
if(menu == 1) {
System.out.print("위치 입력 : ");
int a = scan.nextInt();
//if(ar[a-1] == true) { 등호 사용하는 것 아님 !! ★★★★★
if(ar[a-1]) {
System.out.println("이미 주차되어있습니다");
}
else {
ar[a-1] = true;
System.out.println(a + "위치에 입차");
}
}else if(menu == 2) {
System.out.print("위치 입력 : ");
int b = scan.nextInt();
if(ar[b-1]) {
ar[b-1] = false;
System.out.println(b + "위치에 출차");
}
else {
System.out.println("주차되어 있지않습니다");
}
}else if(menu == 3) {
for(int i=0; i<ar.length; i++) {
System.out.println(i+1 + "번 위치 : " + ar[i]);
}
}else if(menu == 4)
break;
else
System.out.println("1 ~ 4번까지만 입력하시오.");
}
System.out.println("프로그램 종료");
}//while
}
주차장 관리 프로그램
**************
1. 입차
2. 출차
3. 리스트
4. 종료
**************
메뉴 : 1
위치 입력 : 3
3위치에 입차
주차장 관리 프로그램
**************
1. 입차
2. 출차
3. 리스트
4. 종료
**************
메뉴 : 3
1위치 : false
2위치 : false
3위치 : true
4위치 : false
5위치 : false
주차장 관리 프로그램
**************
1. 입차
2. 출차
3. 리스트
4. 종료
**************
메뉴 : 2
위치 입력 : 3
3위치에 출차
주차장 관리 프로그램
**************
1. 입차
2. 출차
3. 리스트
4. 종료
**************
메뉴 : 4
프로그램 종료
이 문제에서 포인트가 있었다면 우리가 1위치에 입차나 출차한다고 하면 배열상으로는 인덱스 2번에 들어가니 그것만 주의하면 쉽게 해결할 수 있는 문제였다.
추가 고칠점 :
//if(ar[a-1] == true) {
이미 boolean형이기 때문에 그냥 그 자체가 true이므로
등호 사용해서 true인지 false인지 비교하는 것 아님 !! ★★★★★
if(ar[a-1]) {
System.out.println("이미 주차되어있습니다");
}
else {
ar[a-1] = true;
System.out.println(a + "위치에 입차");
}
[문제 2] 로또 프로그램 - 자동 번호
1. 1 ~ 45까지의 정수형 값을 가진 6개인 배열이다.
2. 중복된 숫자를 가지면 안된다.
3. 오름차순
4. 1줄당 1000원이다.
5. 출력시 5자리로 맞춘다.
6. 5줄마다 줄바꿈을 한다.
[실행결과]
사진 설명을 입력하세요.
package array;
import java.util.Arrays;
import java.util.Scanner;
public class Lotto {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int money, count = 0;
System.out.print("돈 입력 : ");
money = scan.nextInt();
for(int j=0; j<(money/1000); j++) {
int[] lotto = new int[6];
for(int i=0; i<lotto.length; i++) {
boolean a = true;
while(a) {
int num = (int)(Math.random() * 45 + 1);
// 중복 확인
for(int k=0; k<i+1; k++) {
if(lotto[k] == num) break;
else if (lotto[k] != num && k == i){
lotto[i] = num;
a = false;
}
}
}
}
Arrays.sort(lotto);
System.out.println();
for(int i=0; i<lotto.length; i++) {
System.out.print(lotto[i] + "\t");
count++;
}
if(count % 5 ==0 )System.out.println();
}
}
}
돈 입력 : 3200
12 19 27 28 31 33
17 22 24 27 32 40
17 22 27 29 30 43
돈 입력 : 8000
5 12 14 19 22 25
21 22 24 27 30 31
2 6 9 27 30 33
7 10 13 21 27 34
1 7 14 15 30 33
8 13 19 27 30 37
1 7 8 24 28 30
1 17 18 20 21 31
진짜진짜 어려웠던 부분은 중복된 숫자가 나오지 않게 하는 부분이었다...
중복인지 아닌지 확인을 하고 또 인덱스가 마지막인지 확인을 하고나서야 숫자를 넣을 수 있고
또 boolean값 이용해서 while문 빠져나가게 한다는 점이 신기한 방법이었다.
여기서 k == i를 확인하는 이유는, for 루프가 마지막에 도달했을 때
(즉, 배열의 모든 요소를 확인한 후) 중복된 값이 없다는 것을 확정짓고 새로운 값을 배열에 넣기 위함이다.
위에 부분이 꽤나 어려운 부분이었다.
복습복습 필수 !!!!!!!!!!!!!!!!
[강사님 답]
package array;
import java.util.Arrays;
import java.util.Scanner;
public class Lotto {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] lotto = new int[6];
System.out.print("돈 입력 : ");
int money = scan.nextInt();
for(int k=1; k<(money/1000); k++) {
//난수 발생
for(int i=0; i<lotto.length; i++) {
lotto[i] = (int)(Math.random() * 45 + 1);
// 중복 확인
for(int j=0; j<i; j++) {
if(lotto[i] == lotto[j]) {
i--;
break;
}
}//for j
}//for i
Arrays.sort(lotto); //오름차순 정렬
System.out.println();
for(int data : lotto) {
System.out.print(String.format("%5d", data));
}
if(k % 5 ==0 )
System.out.println();
}//for k
}
}
중복확인하는 부분이 훨씬 간단해졌다는 것 확인 !!!
코드적는 방법은 다양한데 밑에가 쉬우니 밑에 방법을 기억하는 것이 좋을 것 같다 !
//난수 발생
for(int i=0; i<lotto.length; i++) {
lotto[i] = (int)(Math.random() * 45 + 1);
// 중복 확인
for(int j=0; j<i; j++) {
if(lotto[i] == lotto[j]) {
i--;
break;
}
}//for j
}//for i
System.out.print(String.format("%5d", data));
String 의 static 메서드인 format 메서드는 문자열의 형식을 설정하는 메서드이다.
- %d(10진수 형식)
- %s(문자열 형식
- %f(실수형 형식)
그리고 위에서 우리가 이걸 이용한 이유는 밑에 예시같은 방법으로 이용하기 위함이다.
ex) int data = 123;
System.out.print(String.format("%5d", data));
-> %5d는 5자리의 공간을 확보하라는 의미입니다.
data의 값이 123이므로, 5자리에서 123은 3자리만 사용하고
나머지 2자리는 공백으로 채워집니다.
'HOMEWORK' 카테고리의 다른 글
DAY 3 - HOMEWORK - 숫자 순서대로 출력 / 가위바위보 (2024.07.05) (0) | 2024.08.13 |
---|---|
DAY 4 - HOMEWORK - 덧셈계산 / 2~9단 3개씩 출력 (0) | 2024.08.13 |
DAY 6 - HOMEWORK - 성적 처리 프로그램 / 성적계산 (2024.07.10) (0) | 2024.08.13 |
DAY 8 - HOMEWORK 치환 / 사지선다형 (2024.07.12) (0) | 2024.08.12 |
DAY 9 - HOMEWORK - 과일판매량 (2024.07.15) (0) | 2024.08.12 |