자바 선행학습 4일차 - class & method & 반복문게임

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