[java] 로또번호 만들기, 잔돈 구하기, 합계 배열 추가하기, 그래프 그리기, 암호표 만들기

🧩1. math.random() 로또번호 만들기

Math.random() 메소드와 3항 교체로 자리바꾸기

  • 45개의 배열을 만듭니다. 배열에는 1~45의 숫자를 채웁니다.
    • 이때 배열의 인덱스는 0~44까지가 됩니다.
  • 최대한 많은 회수를 반복하며, 2개의 랜덤 숫자를 뽑습니다.
  • 랜덤 숫자는 인덱스로 이용되며, 첫번째 만든 배열에서 해당하는 인덱스의 값을 바꿔줍니다.
  • 임시 저장 변수를 이용해서 첫번째 인덱스의 값을 임시 변수에 저장합니다.
    • 12번 인덱스에 저장된 값이 1 이었다고 가정하면, temp 는 1이 됩니다.
    • 30번 인덱스에 저장된 값이 20 이었다고 가정하면, 12번 인덱스의 값은 20이 됩니다.
    • 임시 변수에 저장된 값 1을 다시 30번 인텍스에 넣습니다.
    • 처음 12번, 30번 인덱스 값은 각각 1, 20 이었고, 변경 후 각각 20, 1 이 됩니다.
    • 이렇게 자리 바꾸기를 계속 수행한 후에 앞에서 6개의 숫자를 뽑아냅니다.
public class lottoSelect {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] setArray = new int[45];
		double random = Math.random(); // 0 <= Math.random() <1
		// 로또는 1~45 사이의 수를 뽑아는 방법
		// 0X45 +1 <= (int)(Math.random() x 45) < 1x45 +1

		// 1~45 까지 채워진 배열을 만든다
		for (int i = 0; i < setArray.length; i++) {
			setArray[i] = i + 1;
		}

		for (int j = 0; j < 1000; j++) {
			// random 으로 1~45 중 2개의 수를 만든다.
			int fstNm = (int) (Math.random() * 45);
			int sndNm = (int) (Math.random() * 45);
			int temp = setArray[fstNm];
			setArray[fstNm] = setArray[sndNm];
			setArray[sndNm] = temp;

		}

		for (int i = 0; i < 6; i++) {
			System.out.print(setArray[i] + " ");
		}
	}

}

🧩2. for 문과 항 대차를 통한 거스름돈 계산

거스름돈을 계산하기위해 몫과 나머지를 이용한다.

  • coinUnit 배열을 만들어 놓고, coinNum 배열에 필요한 개수를 넣습니다.
  • 동전이 필요한 개수는 현재 금액을 coinUnit로 나눈 몫이 됩니다.
  • 현재 금액에서 coinUnit와 몫을 곱한 숫자를 빼면 나머지 잔돈이 됩니다.
  • 반복해서 작은 단위로 내려가며 동전의 개수를 구합니다. 
/*
 * 거스름돈을 몇개의 동전으로 지불할 수 있는지 계산
 * 변수 money의 금액을 동전으로 바꾸었을때 몇개의 동전이 필요한지 출
 * 가능한 적은 수의 동전을 거슬러 주어야 한다.
 */
public class Exercise1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] coinUnit = { 500, 100, 50, 10 };
		int money = 2680;
		int[] coinNum = new int[5];
		for (int i = 0; i < coinUnit.length; i++) {
			int change = (int) money / coinUnit[i];
			int to_change = money - change * coinUnit[i];
			coinNum[i] = change;
			money = to_change;
		}
		for (int i = 0; i < coinNum.length; i++) {
			System.out.print(coinUnit[i] + "\t");
			System.out.println(coinNum[i] + "\t");
		}
	}

}

🧩3. 배열에 합계 행-열 추가하기

기존 배열보다 가로 세로 1칸이 더 많은 새로운 배열 생성

  • 행별 합계는 동일한 열에 들어가므로 result[i][3] += score[i][j] 와 같이 누적합니다.
  • 열별 합계는 동일한 행에 들어가므로 result[5][j] += score[i][j];와 같이 누적합니다.
  • 총합계는 1자리 이므로 열과 행을 지정하여 result[5][3] += score[i][j];과 같이 누적합니다.
/*
 * 주어진 2차원 배열의 데이터보다 가로 세로로 1이 더 큰배열을 생성해서
 * 배열의 행과 열의 마지막 요소에 각 열과 행의 총합을 저장하고 출력 * 
 */
public class Exercise2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[][] score = { { 100, 100, 100 }, { 20, 20, 20 }, { 30, 30, 30 }, { 40, 40, 40 }, { 50, 50, 50 } };
		int[][] result = new int[score.length + 1][score[0].length + 1];

		System.out.println("계산시작 " + score.length);
		for (int i = 0; i < score.length; i++) {
			for (int j = 0; j < score[i].length; j++) {

				result[i][j] = score[i][j];
				result[i][3] += score[i][j];
				result[5][j] += score[i][j];
				result[5][3] += score[i][j];

			}
		}
		System.out.println("계산끝 ");
		for (int i = 0; i < result.length; i++) {
			for (int j = 0; j < result[i].length; j++) {

				System.out.printf("%4d", result[i][j]);

			}
			System.out.println();
		}

	}

}

🧩4. 숫자 개수로 그래프 그리기

배열로 담고, 배열로 출력

  • 인덱스와 숫자를 일치시켜 인덱스+1에 해당하는 숫자면 1씩 증가시킵니다.
  • answer 배열을 돌아가면서 동일한 숫자는 숫자 인덱스에 값을 누적합니다.
  • 출력할때는 배열에 들어 있는 숫자만큼 for 문을 돌며 *(아스타)를 가로로 출력합니다. 
/*
 *배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어서 개수만큼 '*'를 찍어 그래프를 그린다.
 */

public class Exercise3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] answer = { 1, 4, 4, 3, 1, 4, 4, 2, 1, 3, 2 };
		int[] counter = new int[4];
		int count = 0;
		for (int i = 0; i < answer.length; i++) {

			for (int j = 0; j < counter.length; j++) {
				if (answer[i] == j + 1) {
					counter[j]++;
				}

			}

		}

		for (int j = 0; j < counter.length; j++) {

			for (int k = 0; k < counter[j]; k++) {
				System.out.print("*");
			}
			System.out.println();
		}

	}

}

🧩5. 알파벳과 숫자로 암호표 만들기

아스키 값을 이용해서 변환 (숫자 -'a', 문자-'a')

  • 숫자는 아스키 값과 숫자가 동일합니다. 이점을 이용해서 숫자인지 문자인지 구분해서, 숫자와 문자의 변환글자를 가져옵니다.
public class Exercise4 {
	public static void main(String[] args) {
//		char[] abcCode =
//		{ '`','~','!','@','#','$','%','^','&','*',
//		'(',')','-','_','+','=','|','[',']','{',
//		'}',';',':',',','.','/'};	
//		char[] numCode = {'q','w','e','r','t','y','u','i','o','p'};
//		char ch = 'y';
//		if(ch>='0' && ch<='9') {
//			System.out.println(numCode[ch-'0']);
//		} else {
//			System.out.println(abcCode[ch-'a']);
//		}
		char[] abcCode = { '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '|', '[',
				']', '{', '}', ';', ':', ',', '.', '/' };
		// 0 1 2 3 4 5 6 7 8 9
		char[] numCode = { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p' };
		String src = "abc123";
		String result = "";
		// 문자열 src의 문자를 charAt()으로 하나씩 읽어서 변환 후 result에 저장
		for (int i = 0; i < src.length(); i++) {
			char ch = src.charAt(i);
//			System.out.println(ch);
			if (ch >= '0' && ch <= '9') {
				// 숫자로 넘기는 경우 ='0'
				result += numCode[ch-'0'];
			} else {
				// 문자로 넘기는 경우 -'a'
				result += abcCode[ch-'a'];

			}
		}
		System.out.println("src:" + src);
		System.out.println("result:" + result);
	}
}


댓글 쓰기

0 댓글