1. 1년 1월 1일부터 전년도 12월 31일까지의 총 날짜수 구함. int total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400);
2. 해당년도 1월 1일부터 해당년도 해당월 1일까지의 총 날짜수 구함. int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int a=0; a<month-1; a++) { total += m[a]; } //해당월 1일 때문에 +1 total++; //올해가 윤년이면서 2월 이상인 경우 +1 if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) { total++; }
3. 해당년도 해당월의 첫 날(1일)의 요일(일, 월, 화, 수, 목, 금, 토) 구함. String[] d = {"일", "월", "화", "수", "목", "금", "토"}; int days = total % 7; System.out.printf("%s요일 %n", d[days]);
4. 콘솔버전에서 날짜를 달력 형태로 출력.
package com.test; import java.util.Scanner;
public class Sample37 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("년도?"); int year = sc.nextInt(); System.out.print("월?"); int month = sc.nextInt();
//처리 int total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400); int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int a=0; a<month-1; a++) { total += m[a]; }
//올해가 윤년이면서 2월 이상인 경우 +1 if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) { total++; }
//특정 일까지의 날짜수 더하기 total += 1;
//요일 계산 int week = total%7; //0 일요일, 1 월요일, 2 화요일, ...
//해당 월의 마지막 날짜 구하기 int lastDay = m[month-1]; if (month==2 && (year%4==0 && year%100!=0 || year%400==0)) { lastDay = 29; }
//출력 (year, month, week, lastDay) StringBuilder sb = new StringBuilder(); sb.append(String.format("----- %d년 %d월 ----- %n", year, month)); sb.append(String.format(" 일 월 화 수 목 금 토%n")); for (int count=1; count<=week; count++) { sb.append(String.format("%3s", "")); } for (int day=1; day<=lastDay; day++) { sb.append(String.format("%3d", day)); if ((day+week)%7 == 0) { sb.append(String.format("%n")); } } System.out.println(sb.toString()); } }
난수 발생
1. 0 부터 1 사이의 무작위 숫자를 난수라고 함.
2. Random 클래스의 nextInt() 메소드를 이용하면 쉽게 난수를 얻을 수 있다.
import java.util.*; Random rd = new Random();
int val = rd.nextInt(100); //0 보다 크거나 같고 100 보다는 작은 난수
예를 들어, 로또번호는 1~45까지만 존재. rd.nextInt(45) + 1 라고 계산함. 난수를 여러개 발생시키고, 배열에 저장한 다음, 난수 출력. 1~45 범위의 숫자 6개.
package com.test; import java.util.*; //Random, Arrays public class Sample38 { public static void main(String[] args) {
//입력 int count = 6;
//처리 int[] arr = new int[count]; Random rd = new Random();
문제) 여러개의 난수를 발생시키고, 난수들 중에서 가장 큰 값과 가장 작은 값을 별도 출력. 난수 허용 범위는 1~100. 배열 이용. 실행 예) 난수 갯수(2~20)?5 난수 결과 : 55 9 12 6 90 가장 큰 값 : 90 가장 작은 값 : 6
package com.test;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Sample39 {
public static void main(String[] args) {
//입력
Scanner sc = new Scanner(System.in);
System.out.print("난수 갯수(2~20)?");
int count = sc.nextInt();
//처리
int[] arr = new int[count];
Random rd = new Random();
for (int a=0; a<count; a++) {
arr[a] = rd.nextInt(45) + 1;
}
StringBuilder sb = new StringBuilder();
sb.append(String.format("난수 결과 : "));
for (int a=0; a<arr.length; a++) {
sb.append(String.format("%d ", arr[a]));
}
sb.append(String.format("%n"));
Arrays.sort(arr);
sb.append(String.format("가장 큰 값 : %d %n", arr[arr.length-1]));
sb.append(String.format("가장 작은 값 : %d %n", arr[0]));
//출력
System.out.println(sb.toString());
}
}
중복되지 않은 난수 얻기 (1~100)_방법1 실행 예) 난수 갯수(2~20)? 5 난수 결과 : 3 4 5 10 12
//중복되는 경우
int size=5; int count=0; int[] arr = new int[size]; Random rd = new Random(); while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복) int random = rd.nextInt(100) + 1; arr[count] = random; count++; if (count == size) { break; } }
//중복되지 않은 경우
int size=5; int count=0; int[] arr = new int[size]; Random rd = new Random();
while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복) int random = 0; boolean check = false;
do { check = false; random = rd.nextInt(100) + 1; for (int a=0; a<count; a++) { if (arr[a] == random) { check = true; } } }while(check); //무한실행 (중복되지 않는 경우만 배열에 저장)
중복되지 않은 난수 얻기 (1~100)_방법2 실행 예) 난수 갯수(2~20)? 5 난수 결과 : 3 4 5 10 12
package com.test;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Sample41 {
public static void main(String[] args) {
//입력
Scanner sc = new Scanner(System.in);
System.out.print("난수 갯수(2~20)?");
int size = sc.nextInt();
//처리
int count = 100;
int[] arr = new int[count];
for (int a=0; a<arr.length; a++) {
arr[a] = a+1;
}
Random rd = new Random();
for (int a=0; a<arr.length; a++) {
//섞는다
int r = rd.nextInt(count); //0~(count-1)
int temp = arr[0];
arr[0] = arr[r];
arr[r] = temp;
}
int[] random = new int[size];
for (int a=0; a<size; a++) {
random[a] = arr[a];
}
//출력
Arrays.sort(random);
System.out.print("난수 결과 : ");
for (int a=0; a<random.length; a++) {
System.out.printf("%d ", random[a]);
}
System.out.println();
}
}
문제) 로또 번호를 원하는 장수 만큼 출력. 로또 번호는 1~45 범위의 숫자를 중복되지 않은 상태에서 6개가 되면 1장에 해당. 실행 예) 로또 장수(1~20)?3 번호1 : 1 12 13 34 35 36 번호2 : 12 20 25 30 39 45 번호3 : 1 4 9 20 30 42