220616 TIL

Yeoni·2022년 6월 16일
0

국비교육TIL

목록 보기
12/41

국비교육 12일차 Java : Array를 이용하여 공백 지우기, 콤마(,) 넣고 빼기, 무작위로 숫자 뽑기

1. Array

1) 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);

2) Array로 콤마(,) 제거하기

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

3) Array로 콤마(,) 넣기

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

4) Array와 Random을 이용하여 무작위로 6자리 숫자 뽑아내기

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문에 배열도 배우고, 한번에 생각해야하는 경우의 수도 너무 많고.. 내가 잘 하고 있는지 모르겠다.

profile
이런 저런 기록들

0개의 댓글