본문 바로가기

programming/Gukbi

국비 교육 10일차 - 달력만들기 + 숫자 야구 게임

728x90
반응형

오전에는 먼저 배열+제어문 활용을 마저 하고 오후부터 method 기초부터 배우기 시작했다

 

양이 꽤 많아서 같이 포스팅하는건 효율이 떨어질 것 같아서 프로그램 만든 코드들 부터 복습해보고자 한다. 

그리고 중복없는 숫자 만드는거 복습 안해주셨다... ㄱ-

 

따로 해야할덧.......

 

일단 달력만드는 로직부터 복습 고

 

import java.util.Scanner;
public class 달력만들기연습 {

	public static void main(String[] args) {
		
		Scanner scan=new Scanner(System.in);
		System.out.print("년도를 입력하세요:");
		int year = scan.nextInt();
		
		System.out.print("달을 입력하세요:");
		int month = scan.nextInt();
		System.out.println();
	
		
		System.out.printf("%d년 %d월의 달력", year, month);
		
		
		System.out.println();
		String [] weekStr = {"일", "월", "화", "수", "목", "금", "토"};
		for(String i : weekStr)
		{
			System.out.printf("%s \t",i);
		}
		System.out.println();
		/*
		 * 
		 * 	1. 1년 1월 1일부터 전년도 12월 31일까지 날짜의 합
		 * 	2. 바로 전달까지의 합
		 * 	3. +1 (1일부터 달력을 출력해야하기 때문)
		 * 
		 */
		
		// 1. 전년도 12월 31일까지의 합
		int total;
		total=365*(year-1)+(year-1)/4
						  -(year-1)/100
						  +(year-1)/400;
		
		int[] lastDay = {31, 28, 31, 30, 31,
						30, 31, 31, 30, 31, 30, 31};
		
		// 윤달 있을 경우 계산해줌
		if((year%4==0&&year%100!=0)||(year%400==0))
		{
			lastDay[1]=29;
		}
		else
		{
			lastDay[1]=28;
		}
		
		// 바로 전달까지의 합
		for(int i =0; i<(month-1); i++)
		{
			total+=lastDay[i];
		}
		
		// +1
		total++;
		
		// 이번달 1일이 무슨 요일인지 구해주기, 0이면 일요일 1이면 월요일... 
		int week=total%7;
		
		// 출력...
		// 1일부터 이번달 날짜 만큼 for문 돌려주기 
		// 대신 1일 이면 시작하는 요일에 맞춰 공백을 줘야함 (if문 처리)
		// 그 다음에 날짜 출력
		// week를 하나씩 더해줌 (요일 +1)
		// 요일이 6이 (토요일)이 넘어가면 0(일요일)로 다시 셋팅해주고, 한줄 띄어줌 
		// 그 다음날 (2일)부터 다시 for문 돌림->출력 
		
		for(int i =1; i<=lastDay[month-1]; i++)
		{
			if(i==1)
			{
				for(int j =0; j<week; j++)
				{
					System.out.print("\t");
				}
			}
			System.out.printf("%d\t", i);
			week++;
			if(week>6)
			{
				week=0;
				System.out.println();
			}
		}
	
	}
	}

하 진짜... 윤달 계산까진 어떻게 대충 외워서 알겠는데

요일 맞춰서 출력하는 저 로직이 너무... 헷갈렸다. 

그래서 진짜 한줄 한줄 보고 생각하면서 썼다. 

지금은 이해했는데 하루 지나면 또 까먹을 것 같은 느낌이 온다... 일단 미래의 내가 보라고 친절히 한줄한줄 적어놨다

 

꼴랑 이 달력하난 출력한다고 한시간 넘게 머리 싸맸다...

2020년이 윤달이었던걸 기억하고 2020년 2월을 찍어봤는데 29일이 안나와서 또 엄청 당황했다

알고보니 lastDay 로직에 오타가 하나 있어서 또 급히 수정했다

안찍어봤으면 절대 몰랐을듯

 

 

아 숫자 게임까지 해야하는데 벌써 힘 다썼다.....

 

 

 

숫자야구게임이 더 쉬웠음

 

import java.util.Scanner;
public class 숫자야구게임연습 {

	public static void main(String[] args) {
			
		int[] com = {3, 6, 9};
		int[] user = new int [3];
		
		
		Scanner scan=new Scanner(System.in);
		
		//비교
		while(true) 
		{
			System.out.print("\n세자리 정수를 입력하세요:");
			int input=scan.nextInt();
			
			
			if(input>999||input<100) {
				System.out.println("세자리 정수를 입력하라니까.. 또 말 안듣죠?");
				continue;
			}
			
			user[0]=input/100;
			user[1]=(input%100)/10;
			user[2]=input%10;
			
			
			
			if(user[0]==user[1]||user[1]==user[2]||user[2]==user[0])
			{
				System.out.println("중복된 수는 입력할 수 없습니다.");
				continue;
			}
		
			
			System.out.print("님이 입력한 값은");
			for(int i : user)
			{
				System.out.print(i);
			}
			System.out.println("입니다.");
			
			int s=0;
			int b=0;
			
			for(int i =0; i<3; i++)
			{
				for(int j =0; j<user.length; j++)
				{
					if(com[i]==user[j])
					{
						if(i==j)
							s++;
						else
							b++;
					}
				}
			}
			
			//힌트 출력
			System.out.printf("Input Number: %d Result: %dS-%dB", input, s, b);
			if(s==3)
			{
				System.out.println("\n-End-");
				break;
			}
				
		}
		
		
		
	}

}

예외처리 해주는것 말고는 크으으게 헷갈리는건 없는데

역시 2중 for문 돌려주는게 좀 헷갈린다

 

com[i], user[j] 중에 같은게 있으면 이라는 조건문을 걸어서

자리수가 같지 않아도 b처리를 해줄 수 있게 만드는것만 조심해서 만들면 될 것 같다. 

 

이제 끗

 

 

 

메소드 복습은 내일 한꺼번에 할란다...

 

 

 

 

728x90
반응형

'programming > Gukbi' 카테고리의 다른 글

국비 교육 12일차 - Class 변수  (0) 2021.01.11
국비 교육 11일차 - Method  (0) 2021.01.10
국비 교육 9일차 - 배열 활용  (2) 2021.01.06
국비 교육 8일차 - 배열  (0) 2021.01.05
국비 교육 7일차 - 2차 for문  (0) 2021.01.04