국비교육 12일차 Java : Array를 이용하여 공백 지우기, 콤마(,) 넣고 빼기, 무작위로 숫자 뽑기
public static void main(String[] args) {
String str = "안녕하세요, 저는 호랑이 입니다.";
char[] ch_arr = str.toCharArray();
// 위의 str을 char타입의 배열로 바꾸어 주는 함수
// str을 char타입으로 바꾼 다음에 ch_arr 배열에다가
// char 타입으로 하나씩 넣어주는 것.
int len = 0; // // len이 int라 아래에 수치로 들어가는 것
for(char chr:ch_arr) {
// 확장된 for문 : for(배열의 타입 + 변수명 : 배열명)
// chr이라는 새로 만든 변수에 위의 글자 하나하나가 돌면서 다 들어오는 것.
// 배열로 바꿔서 하나한씩 끄집어 내 온 다음에 공백이 아니면 len에 누적시켜 준다.
if(chr != ' ') {
len++; // 공백이 아니라면 len에 하나씩 쌓아준다.
}
} // end of for
char[] ch_arr_result = new char[len];
// 공백이 아닌 글자만 땡겨서 넣어주고 싶은 거.
// 공백이 아닌 글자를 알려면 len(공백이 아닌 것)이 얼마인지를 알아야함.
for(int i=0, j=0; i<ch_arr.length; i++, j++) {
if(ch_arr[i] != ' ') { // 공백이 아니라면 배열에 넣어주고
ch_arr_result[j] = ch_arr[i];
// 공백이 아닐 때만 ch_arr_result에 넣어주기
} // end of if
else { // 공백이라면
j--;
// -1 -> for문에 가서 j +1 되어서 다시 j는 0,
// 공백이라도 j 혼자 증가하지 않도록 해주는 용도.
}
} // end of for
System.out.println(ch_arr_result);
public static void main(String[] args) {
// == 콤마(,) 제거하기 == //
String money1 = "1,234,567";
String money2 = "50,000";
String temp = "";
for(int i=0; i<money1.length(); i++) {
char ch = money1.charAt(i);
if(ch != ',') {
temp += ch;
} // end of if
} // end of for
int sum = Integer.parseInt(temp); // , 빼고 int로 바꾸기
// 1234567
temp = ""; // temp 초기화하고 다시 temp에 숫자 쌓아주기
for(int i=0; i<money2.length(); i++) {
char ch = money2.charAt(i);
if(ch != ',') {
temp += ch;
} // end of if
} // end of for
sum += Integer.parseInt(temp);
// 기존 sum에다가 누적해서 더해줌 1234567+50000
System.out.println(money1+"+"+money2+"="+sum);
// 1,234,567 + 50,000 = 1284567
} // end of main
public static void main(String[] args) {
int money3 = 1500000;
int money4 = 4000;
String temp = String.valueOf(money3+money4);
// "1504000" int를 문자열로 변환
// "1504000" ==> "1,504,000" 으로 바꿔주기
/* == 콤마 입력 규칙 ==
글자수 1자리 ==> 콤마가 0개 글자수가 3의 배수가 아니라면 1자리/3 = 0
글자수 2자리 ==> 콤마가 0개 글자수가 3의 배수가 아니라면 2자리/3 = 0
글자수 3자리 ==> 콤마가 0개 글자수가 3의 배수 라면 3자리/3 - 1 = 1-1 = 0 // 맨 앞에 , 찍지 않기 때문에 하나 빼주기
글자수 4자리 ==> 콤마가 1개 글자수가 3의 배수가 아니라면 4자리/3 = 1
글자수 5자리 ==> 콤마가 1개 글자수가 3의 배수가 아니라면 5자리/3 = 1
글자수 6자리 ==> 콤마가 1개 글자수가 3의 배수 라면 6자리/3 - 1 = 2-1 = 1
글자수 7자리 ==> 콤마가 2개 글자수가 3의 배수가 아니라면 7자리/3 = 2
글자수 8자리 ==> 콤마가 2개 글자수가 3의 배수가 아니라면 8자리/3 = 2
글자수 9자리 ==> 콤마가 2개 글자수가 3의 배수 라면 9자리/3 - 1 = 3-1 = 2
뒤에서부터 순서가 4번째 ==> 콤마 찍음
뒤에서부터 순서가 8번째 ==> 콤마 찍음
*/
char[] origin_arr = temp.toCharArray(); // origin_arr나 temp.toCharArray나 길이는 똑같음
int origin_length = origin_arr.length; // 7
int comma_len = (origin_length%3==0)? origin_arr.length/3-1:origin_arr.length/3;
// 콤마의 글자수는 글자수가 3의 배수라면 나머지에서 -1을 해주어야 한다.
char[] result_arr = new char[origin_length+comma_len];
// 전체 길이는 숫자 글자수 + 콤마 수
for(int i=origin_arr.length-1, j=result_arr.length-1, cnt=1; i>=0; i--,j--,cnt++) {
// i 는 index의 i이고 전체 길이가 7인데
//뒤에서부터 6번 방부터 들어가야 하기 때문에 -1해줌. 7번 반복
// j 는 결과물을 채워 넣을 방
// cnt는 1에서 시작해서 매번 하나씩 올라감.
// cnt가 4가 되는 순간에 ,를 찍어주게 됨
/*
-------------------------------------
|'1'|','|'5'|'0'|'4'|','|'0'|'0'|'0'|
-------------------------------------
j index 0 1 2 3 4 5 6 7 8 (방번호)
*/
if(cnt%4!=0) {
result_arr[j] = origin_arr[i];
// j의 공백에 original 값이 들어와야함.
// 만일, cnt가 1일 때, j의 8번째 방에 i의 6번째 값이 들어가야함.
}
else {
result_arr[j] = ',';
// cnt가 4가 되는 순간에는 j의 방에는 i의 값이 아니라 ,가 들어오게 되는 것.
i++;
// i가 계속 감소하면서 숫자를 넣고 있는데
//중간에 ,를 넣게 되면 4번째를 건너 뛰게 되면서 안들어가는 값이 생김
// 그래서 i를 중간에 더해줘서 중간에 비는 숫자가 없도록 하는 것.
}
} // end of for
} // end of main
public static void main(String[] args) {
/*
---------------------------------------------
index =>| 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | 43 | 44 |
---------------------------------------------
// 들어가는 숫자가 어디서 시작이든 방번호(index) 번호는 똑같기 때문에 배열을 만들어서 넣어주고 방 번호를 뽑아주면 된다.
*/
int[] ball_arr = new int[45];
// ball_arr 배열의 요소(방)마다 데이터값 입력하기
for(int i=0; i<ball_arr.length; i++) {
ball_arr[i] = i+1; // 1~45까지 입력하는 숫자를 이야기하는 것. i=0으로 설정해놨기 때문에.
} // end of for
/*
----------------------------------------------
값 => | 1 | 2 | 3 | 4 | 5 | 6 | ... | 43 | 44 | 45 |
----------------------------------------------
index => 0 1 2 3 4 5 42 43 44
*/
int[] temp_arr = new int[5];
// 앞에 뽑았던 숫자를 기억시켜두는 용도
// 5개만 뽑아주는 이유는 마지막 번호의 중복은 앞의 5개로 해결 가능하기 때문이다.
for(int i=0; i<temp_arr.length; i++) {
temp_arr[i] = -1;
// 중복 값을 확인하는 temp_arr에 값으로 사용되지 않는 수인 -1로 초기화.
} // end of for
// 45개의 숫자 중에 무작위로 6개 뽑기
Random rnd = new Random();
String result = "";
outer:
for(int i=0; i<6; i++) {
// 6개의 숫자를 모두 뽑을 때까지 반복
int idx = rnd.nextInt(44-0+1) + 0; // 랜덤한 정수 0~44
// 위에서 얻어온 랜덤한 정수 idx가 이미 뽑은 것인지
// 처음으로 뽑은 것인지 비교를 하기 위해서 아래처럼 한다.
for(int j=0; j<temp_arr.length; j++) {
// 중복값 확인이기 때문에 temp_arr 길이만큼 반복하면 된다.
if(idx == temp_arr[j]) {
// idx에 temp_arr와 같은게 있니?
i--;
// 중복값을 넣어줬을 때, i가 증가되지 않도록 하나 빼줘야함.
continue outer;
// 레이블명이 outer인 반복문의 증감식(i++)으로 이동하는 continue;
} // end of if
} // end of for j
// 5번(temp_arr.length) 비교를 끝낸 후에는 어쨌든 빠져나오게 되어있음.
// 전부 다 같은게 없으면 빠져나옴
if(i<5) {
temp_arr[i] = idx; // 뽑은 방번호(index)를 저장시켜둔다.
// temp_arr에 내가 뽑은 값인 idx를 넣어준다.
// 왜 여기 5까지만 오는거지?
// i는 0부터 5까지인데, 5는 마지막에 뽑아온 것.
// 마지막에 뽑은 값은 비교할 필요가 없기 때문에 저장할 필요가 없음.
}
String str = (i<5)?", ":" ";
// 0~4까지는 , 를 주고 마지막엔 ,가 나오면 안됨.
result += ball_arr[idx]+str; // 4,6,1,9,3,45
// for문 안에서 result에 값을 쌓아두고 있음.
} // end of for
System.out.println("\n로또 1등 당첨번호 : " + result);
// 로또 1등 당첨번호 : 5, 36, 13, 37, 34, 9
} // end of main
코드는 몇 줄 안되는데, 주석이 엄청 길어진다. 이해하겠다고 아등바등한 흔적들.
앞에는 그래도 할 만 하다고 생각했는데 for문에 배열도 배우고, 한번에 생각해야하는 경우의 수도 너무 많고.. 내가 잘 하고 있는지 모르겠다.