728x90
반응형
주민등록번호 13자리를 입력받아 만 나이 출력
Date 함수로 현재 년도를 구하고 substring함수와 Integer.parseInt 함수로 태어난 년도를 구함
삼항연산자를 통해 20년생과 19년생을 구별하여 1900 or 2000을 더하고 마지막으로 현재 년도에서 태어난 년도를 빼서 만 나이 추출
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class IDTestYear {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("주민번호 13자리를 '-'없이 입력하세요: ");
String Id = scanner.nextLine();
Date date = new Date();
int year = date.getYear()+1900;
System.out.println(year);
Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));
// 주민번호 예시 830422185600, 020422485600
// 앞의 두자리를 String 타입으로 추출
System.out.println(Id.substring(0,2));
// 문자열을 숫자로 변환: parseInt
int ageYear = Integer.parseInt(Id.substring(0,2));
ageYear += Id.charAt(6)<='2' ? 1900 : 2000;
System.out.println("year" +year);
System.out.println(ageYear);
System.out.println(year - ageYear);
}
}
주민등록번호 유효치 검사
삼항연산자를 사용하여 코드 간결화 - 아래의 주민등록번호 유효치 공식 참고
import java.util.Scanner;
public class ClassPractices {
public static void main(String[] args) {
// 입력받은 주민번호를 가중치를 곱해 주민번호가 유효한지 확인
// 주민번호 입력
Scanner scanner = new Scanner(System.in);
System.out.println("주민번호 입력");
String id = scanner.nextLine();
// 가중치 설정 후 각각 주민번호에 곱셈하여 합산
String st = "234567892345";
int sum = 0;
for(int i = 0; i<st.length(); i++) {
sum += (st.charAt(i) - '0') * (id.charAt(i) - '0');
System.out.println(sum);
}
// 합산 값을 11로 나눈
int result = 0;
result = (11 - sum % 11) % 10;
if(result == id.charAt(12) - '0')
System.out.println("정상");
else
System.out.println("비정상");
}
}
야구게임
레벨의 숫자에 따라 랜덤 숫자를 컴퓨터에서 출력하고 숫자의 자리가 같으면 스트라이크, 숫자가 포함되있으면 볼
모든 자리를 다 맞추면 게임 종료
쓰인 주 함수: .contains, .currentmilliseconds, SimpleDataFrame
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;
// 야구게임: 1-9까지 랜덤숫자 넣고 자리가 맞으면 1스트라이크, 번호가 맞으면 1볼 = 모든 자리 번호를 맞출 때 까지 반복
public class BaseballGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
// 0~9 숫자 랜덤하게 발생하여 섞기
int[] ball = {0,1,2,3,4,5,6,7,8,9};
for(int i = 0; i<100000; i++) {
int ran = random.nextInt(9)+1;
int tmp = 0;
tmp = ball[0];
ball[0] = ball[ran];
ball[ran] = tmp;
}
System.out.println("레벨 입력");
int level = scanner.nextInt();
// 2개를 넣으면 CPU: 1 3(예시)입력됨
System.out.print("CPU: ");
for(int i = 0; i<level; i++) {
System.out.print(ball[i]);
}
System.out.println();
scanner.nextLine();
int count = 1;
// 게임 시작 시간과 끝나는 시간을 계산
long start = System.currentTimeMillis(); // 게임 시작 시간
while(true) {
int s = 0, b = 0;
System.out.print("User: ");
//
String st = scanner.nextLine();
// 스트라이크와 볼의 개수를 기억할 변수 2개 생성
// 동일한 자리가 맞으면 스트라이크 조건문 생성
for(int i=0; i<level; i++) {
if(ball[i] == st.charAt(i) - '0') {
s++;
}
// 데이터 타입이 안맞으므로 아래와 같은 String.format ("%s", ) 를 사용
// if(st.indexOf(String.format("%s", ball[i])) >=0) {}
// 아니면 아래와 같이 사용 가능 = valueOf
// if(st.indexOf(String.valueOf(ball[i])) >= 0) {}
// 마지막은 정말 쉬운 방법 = ball(int 타입에 ""string을 더해서 casting 시키고
// indexOf 함수로 해당 숫자가 출력 숫자에 포함되있는지 확인
// if(st.indexOf(ball[i] + "") >= 0) {
// b++;
// }
// 찐 쉬운방법은 이것: contains 를 활용하여 true false
if(st.contains(ball[i]+"")) {
b++;
}
}
// 입력된 레벨과 스트라이크 개수가 맞으면 게임 종료
if(s==level) {
break;
}
// 볼의 개수에서 스트라이크를 빼주어야 중복된 스트라이크의 값이 제거되어 정상적인 수치 출력이 가능
System.out.println(s + " 스트라이크" + (b - s) + " 볼");
s = b = 0;
count++;
}
long end = System.currentTimeMillis(); // 게임 종료 시간
System.out.println("정답");
System.out.println("시도횟수: " + count);
// 밀리세컨을 초로 보기 위해서 1000을 나누고 .을 붙여서 double로 형변환
// System.out.println("게임 끝난 시간: " + (end - start)/1000. );
// 혹은 SimpleDateFormat으로 서식을 지정하여 프린트
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:s.S초");
System.out.println("게임 끝난 시간: " + sdf.format(end - start));
// HH 서식을 줬을때 영국과 차이가 9시간이 때문에 3천 2백 4십만(offset)값을 제거해주면 9시가 없어짐
// offset값을 확인해서 그 값을 제거해야함
System.out.println("게임 끝난 시간: " + sdf.format(end - start - 32400000));
}
}
//출력문:
//레벨 입력
//3
//CPU: 306
//User: 312
//1 스트라이크0 볼
//User: 307
//2 스트라이크0 볼
//User: 306
//정답
//시도횟수: 3
//게임 끝난 시간: 09:00:6.324초
//게임 끝난 시간: 00:00:6.324초
Method 생성
메소드의 형식:
[접근권한지정자] [static] 리턴타입 메소드 이름([인수, 인수 ...]) { 메소드가 실행할 조건문들 }
[]안의 목록들은 생략 가능한 목록들
예시: public static int yeardays(year){
return year*365;
static을 사용하면 사용 시 마다 객체를 new로 불러올 필요가 없고 .을 찍어서 생성한 변수를 바로 사용이 가능하다.
// 달력 작업의 메소드를 모아놓은 class
public class MyCalendarTest {
// 메소드 형식 - []는 생략가능한 부분 > 인수가 필요없을때는 void = 동작만 하는 메소드
// [접근권한지정자] [static] 리턴타입 메소드 이름([인수, ...]) {
// 메소드가 실행할 문장
// }
// [return 값]
// 접근권한지정자의 (강약) 순서: private > protected > package > public
// private: 클래스 외부에서 접근 금지
// protected: 현재 class와 현재 class를 상속받은 자식 class에서만 접근 가능
// package: 접근 권한 지정자 생략 시 같은 패키지 안에서는 public처럼 사용되고 다른 패키지에서는 private으로 사용
// public: 현재 클래스 내부 외부 어디서나 자유롭게 사용 가능
// static (정적) 메서드를 선언하면 class의 객체를 선언하지 않아도 .을 찍어서 바로 접근할 수 있다.
// > 자주 사용하는 매소드는 static으로 정적 선언할 것
// 계속 Scanner scanner = new Scanner같이 new로 선언하지 않고 Scanner.로 클래스 변수 선언 가능
// 예시: Math. 썼을 때 녹색 동그라미 s가 표시된 것이 static 메서드. sf있는건 변수(녹색구슬에 구멍뚤려있음)
// f의 의미는 final
// a의 의미는 추상 class = abstract
// 리턴타입: 메소드가 실행되고 난 결과를 되돌려줄 때 결과의 자료형을 적어준다.
// 만약 결과값이 int 값이면 int로 적어줘야 한다.
// 메소드를 실행한 후 결과를 되돌려줄 필요가 없으면 return을 생략하고 void라고 적음
// year 을 인수로 넘겨받아 윤년, 평년을 판단해 윤년이면 true 평년이면 false 리턴
// 논리값을 기억하는 변수나 리턴 타입이 논리값인 메소드의 이름은 is로 시작하는 것이 관행
public static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100!=0 || year %400 == 0;
}
// 년, 월을 인수로 넘겨받아 그 달의 마지막 날짜를 리턴하는 메소드
public static int LastDay(int year, int month){
int[] m = {31,28,31,30,31,30,31,31,30,31,30,31};
m[1] = isLeapYear(year) ? 29:28;
return m[month-1];
}
// 년, 월, 일을 인수로 넘겨받아 1년 1월 1일부터 지난 날짜를 리턴하는 메소드
public static int DayPassed(int year, int month, int day) {
int sum = year - 1 * 365 + (year-1) / 4 - (year -1) / 100 + (year - 1) / 400;
for(int i = 1; i<=(month-1); i++) {
sum += LastDay(year, i);
}
return sum + day;
}
// 년 월 일을 인수로 넘겨받아 요일을 숫자로 리턴하는 메소드
public static int weekDay(int year, int month, int day) {
return DayPassed(year, month, day) % 7;
}
}
마방진 게임
아래 규칙에 맞춰서 프로그래밍
public class MagicSquare {
public static void main(String[] args) {
// 마방진 만들기
// 마방진의 원리
// 최초의 1이 채워지는 자리는 첫 줄 정 가운데열
// 채워진 숫자가 행렬의 차수(n)의 배수면 아래줄에 다음 숫자를 채운다
// > 3*3 마방진이면 2가 3의 배수면 아래줄 다음 숫자
// > 행 + 1
// 채워진 숫자가 행렬의 차수(n)의 배수가 아니면 오른쪽 위에 다음 숫자를 채운다
// > 오른쪽 위 (행 -1, 열 +1)
int [][] num = new int[3][3];
// 1행 2열은 1이다
int i = 0; //행
int j = 1; //열
// for(int i = 1; i<=(num.length * num[0].length); i++) {
for(int k = 1; k<=9; k++) { //Math.pow = 거듭제곱 5^2 라는 의미
// 마방진에 숫자를 채운다
num[i][j] = k;
// 방금 채운 숫자가 3의 배수면 아래줄 or 3의 배수가 아니면 오른쪽 위 방향으로 숫자를 채운다
if(k % 3 == 0) {
i++;
}
else {
i--;
// 행을 계속 줄이다가 -1이 되면 마지막 행으로 수정한다.
if(i == -1) {
i = 2;
}
j++;
// 열이 계속 늘어나면 첫번째 열로 수정한다
if(j == 3) {
j = 0;
}
}
}
for(int row = 0; row<3; row++) {
for(int col = 0; col<3; col++) {
System.out.printf("%2d ",num[row][col]);
}
System.out.println();
}
}
}
728x90
반응형
'국비과정 > 자바 선행학습 (1-17~1-21,22)' 카테고리의 다른 글
자바 선행학습 5일차 (마지막) - class, 생성자, 메소드 (0) | 2022.01.22 |
---|---|
자바 선행학습 5일차 (마지막) - ArrayList (0) | 2022.01.22 |
자바 선행학습 3일차 - Random, refactoring, 더블 for문, while & do-while, Date, SimpleDateFormat, equals(), String method (0) | 2022.01.19 |
자바 선행학습 2일차 - for , 향상된 for, switch random (0) | 2022.01.19 |
자바 선행학습 1일차 - 기본 문법 (print, scanner, if, else) (0) | 2022.01.17 |