본문 바로가기

Java 웹 개발

21.08.20 - 웹 개발 입문 8일차

8일차 과제 피드백

package condition;

import java.lang.*;
import java.util.Scanner;

public class Test12 {
	public static void main(String[] args) {

		// 입력
		Scanner sc = new Scanner(System.in);
		System.out.println("연도를 입력하세요");
		int year = sc.nextInt();
		System.out.println("월을 입력하세요");
		int month = sc.nextInt();
		sc.close();

		// 처리
		int day;
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
			day = 31;
		} else if (month == 4 || month == 6 || month == 9 || month == 11) {
			day = 30;
		} else {
			boolean is400 = year % 400 == 0;
			boolean is4 = year % 4 == 0;
			boolean is100 = year % 100 == 0;
			if (is400 || is4 && !is100) {
				day = 29;
			} else {
				day = 28;
			}
		}
		// 결과
		System.out.println(day + "일 까지입니다.");

	}
}

 

 

if문의 단점

규칙이 없는 경우 조건식이 매우 길어진다
순차적으로 질의하므로 하단의 구문이 느리게 실행된다.

이러한 단점들을 보완할 수 있는 구문이 switch~case 구문

package condition2;
import java.lang.*;
public class Test01 {
	public static void main(String[] args) {
		
		int value = 10;
		switch(value) {
		case 5:
			System.out.println("5");
			break;
		case 10:
			System.out.println("10");
			break;
		default:	
			System.out.println("기타");
			break;
		}
	}
}

- 정답

10

 

 

switch의 특징
break 키워드 사용 가능(안쓰면 끝날 때까지 실행)

package condition2;
import java.lang.*;
public class Test02 {
	public static void main(String[] arms){

		int month = 11;
		
		switch(month) {//month의 값에 따라 특정 지점으로 이동시키도록 하겠다!
		case 1: // month == 1인 경우 이동할 지점(책갈피)
			System.out.println(31);
			break;
		case 2: // month == 2인 경우 이동할 지점(책갈피)
			System.out.println(28);
			break;
		case 3:
			System.out.println(31);
			break;
		case 4:
			System.out.println(30);
			break;
		case 5:
			System.out.println(31);
			break;
		case 6:
			System.out.println(30);
			break;
		case 7:
			System.out.println(31);
			break;
		case 8:
			System.out.println(31);
			break;
		case 9:
			System.out.println(30);
			break;
		case 10:
			System.out.println(31);
			break;
		case 11:
			System.out.println(30);
			break;
		case 12:
			System.out.println(31);
			break;
		}
		
		
	}
}

- 정답

30

 

case의 순서는 마음대로 조정 가능

package condition2;
import java.lang.*;
public class Test02_1 {
	public static void main(String[] args) {

		int month = 7;

		switch(month) {//month의 값에 따라 특정 지점으로 이동시키도록 하겠다!
		case 1: case 3:	case 5:	case 7:	case 8:	case 10: case 12:
			System.out.println(31);
			break;
		case 2://month == 2인 경우 이동할 지점(책갈피)
			System.out.println(28);
			break;
		case 4:	case 6:	case 9:	case 11:
			System.out.println(30);
			break;
		}
	}
}

- 정답

31

 

 

default는 case로 처리되지 않을 경우 실행(기본위치)

package condition2;
import java.lang.*;
public class Test02_2 {
	public static void main(String[] args) {
	
		int month = 7;

		switch(month) {//month의 값에 따라 특정 지점으로 이동시키도록 하겠다!
		case 2://month == 2인 경우 이동할 지점(책갈피)
			System.out.println(28);
			break;
		case 4:		case 6:		case 9:		case 11:
			System.out.println(30);
			break;
		default:
			System.out.println(31);
			break;
		}
	}
}

- 정답

31

 

더 깔끔하게 표현하기

package condition2;
import java.lang.*;
public class Test02_3 {
	public static void main(String[] args) {

		int month = 7;

		int day;
		switch(month) {
		case 2: 
			day = 28; 
			break;
		case 4: case 6: case 9: case 11:
			day = 30; 
			break;
		default:
			day = 31;
			break;
		}
		System.out.println(day);
	}
}

- 정답

31

 

 

조건 구문

상황에 따라 다른 내용이 실행될 수 있도록 만들어주는 구문

 

조건 구문의 종류
if 구문
- 논리를 기반으로 한 분기를 수행하는 구문
- 순차적으로 조건을 검사하여 결과 블록 1개를 실행
- 하단의 구문은 실행 속도가 다소 느리다(티 날 정도는 아니다)
- switch-case 구문
- 값을 기반으로 한 분기를 수행하는 구문
- 값은 byte, short, char, int, String 만 가능
- 한 번의 검사를 통해 특정 지점으로 이동하여 탈출 명령(break) 전까지 실행
- 모든 지점이 동일한 속도로 실행된다

 

 

 

for의 형태

for(선언문; 조건부; 증감부) {
코드
}
실행순서 : 선언부->조건부->코드->증감부->코드->증감부->...

		for(int i = 1 ; i <= 5; i = i +1) {
			System.out.println("Hello World");
		}

 

 

Q. 1부터 10까지 1씩 증가하는 데이터

package loop;

import java.lang.*;

public class Test02 {
	public static void main(String[] args) {

		for (int i = 1; i <= 10; i += 1) {
			System.out.println(i);
		}
	}
}

- 정답

1
2
3
4
5
6
7
8
9
10

 

 

Q : 사용자에게 숫자를 하나 입력받아서 해당하는 숫자의 구구단을 출력해보세요

package loop;

import java.lang.*;
import java.util.Scanner;

public class Test04 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.println("숫자를 입력하세요");
		int num = sc.nextInt();
		sc.close();

		for (int i = 1; i < 10; i++) {
			System.out.println(num + " X " + i + " = " + (num * i));
		}

	}
}

- 정답

숫자를 입력하세요
3
3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

 

 

 

Q. 1부터 100사이에 있는 "7의 배수"를 출력

package loop;

//import java.lang.*;

public class Test07 {
	public static void main(String[] args) {

		for (int i = 1; i <= 100; i++)

			if (i % 7 == 0) {
				System.out.println("7의 배수 = " + i);
			}

	}
}

- 정답

7의 배수 = 7
7의 배수 = 14
7의 배수 = 21
7의 배수 = 28
7의 배수 = 35
7의 배수 = 42
7의 배수 = 49
7의 배수 = 56
7의 배수 = 63
7의 배수 = 70
7의 배수 = 77
7의 배수 = 84
7의 배수 = 91
7의 배수 = 98

 

 

 

Q. 1부터 99사이에 있는 "5가 들어간 숫자"를 출력

규칙을 찾아본다

5 15 25 35 45 65 75 85 95        - 1의 자리가 5 ( i % 10 == 5 )

50 51 52 53 54 55 56 57 58 59  - 10의 자리가 5 ( i / 10 == 5 )

package loop;

//import java.lang.*;

public class Test08 {
	public static void main(String[] args) {

		for (int i = 1; i < 100; i++) {
			boolean first = i / 10 == 5; // 10의 자리가 5;
			boolean second = i % 10 == 5; // 1의 자리가 5;
			if (first || second) {
				System.out.println("i = " + i);
			}
		}

	}
}

- 정답

i = 5 i = 15 i = 25 i = 35 i = 45 i = 50 i = 51 i = 52 i = 53 i = 54

i = 55 i = 56 i = 57

i = 58 i = 59 i = 65 i = 75 i = 85 i = 95

 

 

 

Q. 1부터 99사이에 있는 숫자를 이용하여 369게임을 실시한 결과를 출력
369게임은 숫자에 3, 6, 9가 있다면 해당 개수만큼 박수를 치는게임
시물레이션 결과를 예상하여 화면에 출력

3, 6, 9 가 한 개이면 짝 / 3, 6, 9 가 두 개이면 짝짝

 

조건을 찾아본다

10의 자리가 3, 6, 9

1의 자리가 3, 6, 9

package loop;

//import java.lang.*;

public class Test09 {
	public static void main(String[] args) {

		for (int i = 1; i < 100; i++) {
			boolean first = i / 10 == 3 || i / 10 == 6 || i / 10 == 9; // 10의 자리가 3, 6, 9;
			boolean second = i % 10 == 3 || i % 10 == 6 || i % 10 == 9; // 1의 자리가 3, 6, 9;
			if (!(first || second)) { // 10의자리, 1의자리에도 없는경우
				System.out.println(i);
			} else if (first && second) { // 3 6 9 가 두 개 있다면
				System.out.println("짝짝");
			} else { // 3 6 9 가 한개 있다면
				System.out.println("짝");
			}

		}

	}
}

- 정답

1 2 짝 4 5 짝 7 8 짝 10 11 12 짝 14 15 짝 17 18 짝 20
21 22 짝 24 25 짝 27 28 짝 짝 짝 짝 짝짝 짝 짝 짝짝 짝 짝 짝짝 40
41 42 짝 44 45 짝 47 48 짝 50 51 52 짝 54 55 짝 57 58 짝 짝
짝 짝 짝짝 짝 짝 짝짝 짝 짝 짝짝 70 71 72 짝 74 75 짝 77 78 짝 80

81 82 짝 84 85 짝 87 88 짝 짝 짝 짝 짝짝 짝 짝 짝짝 짝 짝 짝짝

 

 

 

Q. 1부터 99사이에 있는 "5가 들어간 숫자"를 출력 하고 숫자 카운트, 합계도 출력

 

조건을 구해보자

10의 자리가 5

1의 자리가 5

package loop;

//import java.lang.*;

public class Test11 {
	public static void main(String[] args) {

		int total = 0;
		int count = 0;
		for (int i = 1; i < 100; i++) {
			boolean first = i / 10 == 5; // 10의 자리가 5;
			boolean second = i % 10 == 5; // 1의 자리가 5;
			if (first || second) {
				System.out.println("i = " + i);
				count++;
				total += i;

			}
		}

		System.out.println("카운트 = " + count);
		System.out.println("합계 = " + total);
	}
}

- 정답

i = 5 i = 15 i = 25 i = 35 i = 45 i = 50 i = 51 i = 52 i = 53 i = 54 i = 55
i = 56 i = 57 i = 58 i = 59 i = 65 i = 75 i = 85 i = 95
카운트 = 19
합계 = 990

 

 

과제

Q. 몸짱이 되기 위해서 오늘부터 30일간 푸시업을 하려고 합니다
첫날은 힘드니까 10개만 하고, 둘째날부터는 전날보다 3개씩 더 하려고 합니다
(1) 30일간 매일마다 하게될 푸시업 개수를 계산하여 출력하시고
(2) 30일간 하게되는 총 푸시업 개수를 계산해서 출력하세요

package loop;

public class Test12 {
	public static void main(String[] args) {

		int day30 = 0;
		int pushUp = 10;
		for (int i = 1; i <= 30; i++) {
			System.out.println(i + "일 = " + pushUp + "개");
			day30 += pushUp;
			pushUp += 3;
		}
		System.out.println("총 푸시업 개수 = " + day30 + "개");
	}
}

- 정답

1일 = 10개
2일 = 13개
3일 = 16개
4일 = 19개
5일 = 22개
6일 = 25개
7일 = 28개
8일 = 31개
9일 = 34개
10일 = 37개
11일 = 40개
12일 = 43개
13일 = 46개
14일 = 49개
15일 = 52개
16일 = 55개
17일 = 58개
18일 = 61개
19일 = 64개
20일 = 67개
21일 = 70개
22일 = 73개
23일 = 76개
24일 = 79개
25일 = 82개
26일 = 85개
27일 = 88개
28일 = 91개
29일 = 94개
30일 = 97개
총 푸시업 개수 = 1605개

 

 

Q. 고대 그리스에 아주 현명한 노인이 살고 있었습니다
어느날 소문을 들은 왕이 노인을 찾아가서 이렇게 말했습니다
"가지고 싶은게 있다면 다 줄테니 어디 말해봐라~"
노인이 다음과 같이 말했습니다
"저는 많은건 필요없습니다. 첫째날 1원만 주시고 둘째날부터 전날의 두 배를 주실 수 있으십니까?"
(1) 만약 30일간 노인이 원하는 것을 왕이 해주려면 매일 얼마씩 줘야 하는지 계산해서 출력하세요
(2) 30일동안 노인이 받게되는 총 금액을 출력하세요
(3) 30일이 아니라 40일로 기간이 늘어나게 된다면 얼마를 받게되는지 출력하세요

package loop;

public class Test13 {
	public static void main(String[] args) {
		long day30 = 0;
		long day40 = 0;
		long money = 1;
		for (int i = 1; i <= 30; i++) {
			System.out.println(i + "일 = " + money + "원");
			day30 += money;
			money *= 2;
		}
		for (int i = 1; i <= 40; i++) {
			day40 += money;
			money *= 2;
		}
		System.out.println("");
		System.out.println("30일 총 금액 = " + day30 + "원");
		System.out.println("40일 총 금액 = " + day40 + "원");
	}
}

- 정답

1일 = 1원
2일 = 2원
3일 = 4원
4일 = 8원
5일 = 16원
6일 = 32원
7일 = 64원
8일 = 128원
9일 = 256원
10일 = 512원
11일 = 1024원
12일 = 2048원
13일 = 4096원
14일 = 8192원
15일 = 16384원
16일 = 32768원
17일 = 65536원
18일 = 131072원
19일 = 262144원
20일 = 524288원
21일 = 1048576원
22일 = 2097152원
23일 = 4194304원
24일 = 8388608원
25일 = 16777216원
26일 = 33554432원
27일 = 67108864원
28일 = 134217728원
29일 = 268435456원
30일 = 536870912원

30일 총 금액 = 1073741823원
40일 총 금액 = -1073741824원