코드 그라데이션
230324 2주차 어려웠던 부분들 내용 및 개념 정리 본문
1. for문에 각각이 없는 경우는 무엇인가.
for(초기식; 조건식; 증감식){
}
세미콜론은 이를 구분하는 용도로만 사용하기 때문에 증감식 끝에는 세미콜론이 들어가지 않는다고 이해해도 된다.
그래서 for(; ;) 이것도 가능
아무 조건도 주지 않으면 무한히 반복된다.
반복문 초기식 => 반복변수
초기식을 안 써도 되는 경우 : 밖에서 이미 반복변수를 만들어 놨을 때.
public class Hello {
public static void main(String[] args) {
int i = 0;
for (; i < 10; i++) {
}
}
}
이렇게 쓸 수 있다. for문에서만 쓰고, 끝나면 죽게 만드는 변수.
-----------
조건이 없으면, 무한반복
키오스크 등.
조건식이 없는 경우: 사용자가 어떤 조건을 만족했을 때만 탈출하고, 그렇지 않은 경우에는 무한반복하고 싶다!
public class Hello {
public static void main(String[] args) {
int i = 0;
Scanner scanner = new Scanner(System.in);
for (; ;i++) {
int inputNum = scanner.nextInt();
if(inputNum == 1) {
break;
}
}
//또는
while(true) {
int inputNum = scanner.nextInt();
if(inputNum == 0) {
break;
}
}
}
}
요런 식으로,,,
--------------
증감식은 없어도 되고, 두 개가 들어가도 된다.
증감식은 사실 잘못된 말일 수도 있다.
public class Hello {
public static void main(String[] args) {
for(int i = 0; i<10; System.out.println("반복끝")) {
i++;
}
}
}
정확하게 말하면, 반복이 끝날때마다 할 일.
또 다른 예시, 이런 것도 가능함
public class Hello {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
for (int i = 0; i < 10; ) {
if (input % 2 != 0) {
} else {
i++;
}
}
}
}
=> 이것은 내가 원하는 경우만 카운트를 한다는 뜻.
----------------------------
2. 이 코드의 뜻은?
: 문자 A에다가 0~25사이에서 추출한 값을 더한 다음에 이걸 문자로 바꿔서 result라는 문자열에 집어 넣는다는 뜻인가?
<주어진 코드>
public class Hello2 {
public static void main(String[] args) {
Random r = new Random();
String result = "";
for (int i = 0; i < 10; i++) {
result += (char) (65 + r.nextInt(26));
} // 요기
System.out.print(result);
}
}
result += (char) (65 + r.nextInt(26));
일단 답부터 말하면, 그렇다!
[이 코드를 먼저 뜯어보면]
이 코드를 쪼개보면
for (int i = 0; i < 10; i++) {
int randomNumber = r.nextInt(26);
int randomApNumber = 65 + randomNumber;
result += (char) randomApNumber;
}
사실 이거다.
즉,
1) 랜덤 수를 추출하고
2) 65에 이 랜덤 수를 더하고,
3) 문자로 변환하여 result 문자열에 저장하는 행위
-----------------------------
3. 최댓값 추출하기
최댓값.
값을 일일이 하나씩 비교. 집단 내에서 가장 큰 애.
최댓값을 저장할 변수를 하나 만들고,
기존 값 저장 변수. 즉 두 개의 저울 중에 더 무거운 것을 최댓값 변수에 업데이트함.
처음부터 끝에 있는 수까지 전부 비교해야 하기 때문에 반복문이 필요하다.
public class Hello3 {
public static void main(String[] args) {
Random r = new Random();
int[] array = new int[10]; // 배열 생성
int max = 0; // 최댓값을 저장해둘 변수를 하나 만든다.
for(int i = 0;i<array.length;i++) {
array[i] = r.nextInt(11); // 0부터 10까지 랜덤 수를 배열에 저장한다.
if(max < array[i]) { // 배열 인덱스에 들어있는 값이 최댓값에 저장되어 있는 수보다 크면
max = array[i]; // 최댓값 변수에 이 값을 저장한다. => update
}
}
}
}
지금 아래 반복문은
for (int i = 0; i<array.length; i++) {
array[i] =r.nextInt(11);
}
//입력을 받고
for (int i = 0; i<array.length; i++) {
if(max < array[i]) {
max = array[i];
}
// 최댓값과 비교해서 배열의 값이 더 크면
이렇게 두 개로 쪼개서 볼 수 있다!!!
그래서 이걸 리펙토링 가능하다!
import java.util.Random;
public class Hello3 {
public static void main(String[] args) {
Random r = new Random();
int[] array = new int[10];
int max = 0;
int maxIndex = 0;
for (int i = 0; i < array.length; i++) {
array[i] = r.nextInt(11);
if (max < array[i]) { // 배열 인덱스에 들어있는 값이 최댓값에 저장되어 있는 수보다 크면
max = array[i]; // 최댓값 변수에 이 값을 저장한다. => update
maxIndex = i;
}
}
for (int i = 0; i < array.length; i++) {
System.out.println("index[" + i + "] : " + array[i]);
}
System.out.print("최댓값 : [" + maxIndex + "] " );
}
}
-------------------
4. 숫자야구 게임에서 특정 식
//1. 컴퓨터 랜덤 숫자 생성 단, 중복제거 O
//2. 유저 숫자 입력 단, 1~9값만 허용, 중복허용X
//3. 컴퓨터 랜덤 숫자와 유저 입력 숫자 비교
//3-1. 자리와 숫자가 같으면 strike
//3-2. 숫자는 같지만 자리가 다르면 ball
//3-3. strike, ball이 없으면 out
//3-4. 3 strike -> 홈런 프로그램 종료
//홈런이 나오기 전까지는 strike ball을 출력 or out 출력
import java.util.Random;
import java.util.Scanner;
public class BBA {
public static void main(String[] args) {
Random r = new Random();
Scanner sc = new Scanner(System.in);
int[] com = new int[3];
int[] user = new int[3];
for(int i = 0;i<com.length;i++) {
com[i] = r.nextInt(9)+1; // 예를 들면 com[0] = 8 com[1] = 7 com[2] = 7
for(int j = 0;j<i;j++) {
if(com[i] == com[j]) {
i--; // i의 값을 변동시켜 com[i]에 계속 다른 값을 넣기 위함. 결국 i가 3이 되고 [0], [1], [2]의 값이 모두 다르면 탈출함.
break;
}
}
}
System.out.println(com[0]+","+com[1]+","+com[2]);
//1. 클리어
int strike = 0;
int ball = 0;
while(strike < 3) {
for(int i = 0;i<user.length;i++) {
System.out.print((i+1)+"번째 숫자 : ");
user[i] = sc.nextInt();
//범위 1~9 아닌경우
if(user[i]<1 || user[i] >9) {
System.out.println("잘못된 입력입니다.");
i--;
continue;
// 그 값만 보면 되기 때문에 반복문 안 쓴다.
}
//값이 중복되는 경우
for(int j = 0;j<i;j++) { // 일일이 확인해줘야 하기 때문에 밤복문 출력
if(user[i] == user[j]) {
System.out.println("잘못된 입력입니다.");
i--;
break;
}
}
}
strike = 0;
ball = 0;
//이거 이해 못하면 안된다.
for(int i = 0;i<user.length;i++) { //0일때 0 1 2 다 비교 / 1일때 0 1 2 다 비교/ 2일 때 0 1 2 다 비교
for(int j = 0;j<com.length;j++) {
if(user[i] == com[j]) { // i, j의 인덱스는 신경쓰지 않아도 된다.
if(i==j) {
strike++;
}
else {
ball++;
}
}
}
}
//3-3
if(strike == 0 && ball == 0) {
System.out.println("OUT 입니다.");
}
else if(strike == 3) {
System.out.println("홈런입니다.");
}
else {
System.out.println("strike : "+strike+", ball : "+ball);
}
}
}
}
여기서 이 코드.
아리송...
for(int i = 0;i<com.length;i++) {
com[i] = r.nextInt(9)+1; // 예를 들면 com[0] = 8 com[1] = 7 com[2] = 7
for(int j = 0;j<i;j++) {
if(com[i] == com[j]) {
i--; // i의 값을 변동시켜 com[i]에 계속 다른 값을 넣기 위함.
break;
}
}
}
이건 보면, 아까 위에서 증감식 없는 for문이 뭐였는지 개념을 다시 살펴보면 된다.
그것은 무엇이었냐면,
반복을 돌면서, 내가 원하는 경우에만 증가를 시켜주는 게 있었잖아. 그거랑 동일하다고 여기면 된다.
그러니까, 내가 원하지 않는 입력(com[i] == com[j]. 즉 두 수가 같은 경우 숫자야구의 의미가 없으니까...) 일 때는
그 수도 빼버리고, 반복 횟수도 제외해버리면 되지.
그게 i--;
// 현재 조건,
// 자리 && 숫자 => 스트라이크 / 숫자 같으면 => 볼
// 여기서 공통된 것은 숫자!. 그래서 숫자를 보는 거다.
for(int i = 0;i<user.length;i++) { //0일때 0 1 2 다 비교 / 1일때 0 1 2 다 비교/ 2일 때 0 1 2 다 비교
for(int j = 0;j<com.length;j++) {
if(user[i] == com[j]) { // i, j의 인덱스는 신경쓰지 않아도 된다. 숫자가 같니?
if(i==j) { // 위치도 같니?
strike++;
}
else {
ball++;
}
}
}
}
이거 좀 헷갈릴 수도 있어, 그냥 짤 때는 스트라이크, 볼 따로 짰는데, 이건 합쳐놨으니까.....
합친 이유.
---------------
5. Swap
a=10;
b=20;
나는 최종적으로 a와 b의 값을 서로 바꾸고 싶어.
일단 a에 20 값을 넣어버리면, 10 들어있는 값이 사라지지. 그래서 얘를 백업할 데이터 공간이 필요하다.
변수는 그냥 a와 b를 옮길 때 필요한 껍데기
int temp;
그래서 그 과정을 해보면
temp = a; // 일단 a값을 임시변수에 저장
a = b; 그리고 a에는 b를 저장
b = temp; 마지막으로 b에는 임시변수에 저장해뒀던 원래 a값을 저장
// 그러면 두 값이 바뀌게 된 것.
-------------------------
6. 비행기 좌석 예약 프로그램에서, 행과 열에 -1 또는 +1을 해준 경우. 왜?
if(h<1 || h >9 || y >2 || y<1) {
System.out.println("잘못된 입력입니다.");
}
else {
//예약 여부확인
// 그러니까 이 비즈니스 로직에서는 0이면 예약이 안 되어 있는 상태이고,
// 1 이상이면 예약이 되어있는 것.
if(seat[h-1][y-1] == 0) { // 사람이 입력한 숫자와 컴퓨터가 인식하는 숫자는 1 차이가 나므로, 빼줘야.
System.out.println("예약이 완료 됐습니다.");
count--;
seat[h-1][y-1]++;
}
else {
System.out.println("비어있는 좌석 ");
for(int i = 0;i<seat.length;i++) {
for(int j = 0;j<seat[i].length;j++) {
if(seat[i][j] == 0) { // 이것은 빈 자리가 있다(예약이 가능하다)
// 여기서 i와 j는 0부터 시작하도록 세팅을 해줬으니 -1을 굳이 해주지 않아도 됐던 것.
System.out.println("행 : "+(i+1)+"열 : "+(j+1));
// 이건 사용자한테 보여주는 것이므로, 다시 +1 씩 해준다는 것.
}
}
}
'Java, SpringBoot 추가 공부' 카테고리의 다른 글
230327 무한루프 사용을 지양해야 하는 이유 (0) | 2023.03.28 |
---|---|
230327 숫자야구 배열에서 궁금증 해결 (0) | 2023.03.28 |
230317 자바 추가 - 문자열 더하기, break, continue (0) | 2023.03.21 |
230317 수업 조건문, 반복문 (2) (0) | 2023.03.20 |
230317 수업 조건문, 반복문 (1) (0) | 2023.03.20 |