정리정돈 개발블로그~
[3일차] 국비교육 본문
6.비트연산자
bit: 컴퓨터 중간값을 인식 못함, 0과1로만 구성
하드웨어를 제어하거나 영상처리, 음성처리
package 비트연산;
//비트 연산이란 : 0과 1로 구성된 1개의 비트끼리 연산을 수행
//& (&&일반 논리연산) : bit And, 값이 둘다 1이면 1
//| : bit OR, 둘 중 하나만 1이면 1
//^ : XOR, (하드웨어 설계 시 사용 많음), 두개의; 비트값이 다르면 1
//~ : 비트를 반전(0이면 1, 1이면 0으로 ..)
//<< : 왼쪽으로 지정된 수만큼 비트를 이동 시킴
//>> : 오른쪽으로 지정된 수만큼 비트를 이동 시킴
public class BitOpEx1 {
public static void main(String args[]){
int num1 = 10;
int num2 = 12;
System.out.println(num1 & num2);
System.out.println(num1 | num2);
System.out.println(num1 ^ num2);//달라야 1이 됨(1,0일 경우)
System.out.println(~num1);//최상위 비트가 1이면 양수. 0이면 음수
System.out.println(num1 << 1);// X2한 것과 같음 , 옛날엔 컴파일러에 *,/연산자 없었음
System.out.println(num1 >> 1);
}
}
7. 조건문
1) if 문
package 조건문;
import java.util.Scanner;
//if(조건식){수행할 문장}
//만약에 조건식에 수행할 문장이 한줄이면 {}생략 할 수 있음
public class IfExMain {
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력 : ");
int n = sc.nextInt();
if(n >= 0){
System.out.println("양수 입니다.");
}
}
}
2) if / else 문
public class IfExMain {
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력 : ");
int n = sc.nextInt();
if(n > 100){
System.out.println("100보다 커요.");
}else if(n<100){
System.out.println("100보다 작아요.");
}else{
System.out.println("100과 같아요.");
}
}
}
3) if / else if / else 문
public class IfExMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("문자를 입력 하세요 : ");
char ch = sc.next().charAt(0); //문자열에서 0번째 문자를 추출
if (ch >= 'a' && ch <= 'z') {// 문자는 내부적으로 ascii(unicode)값으로 판단 함
System.out.println("입력하신 알파벳은 소문자입니다.");
}else if (ch >= 'A' && ch <= 'Z') {
System.out.println("입력하신 알파벳은 대문자입니다.");
}else{
System.out.println("알파벳이 아닙니다.");
}
}
}
활용 문제 1 백준 2884번))
package 상근이알람;
import java.util.Scanner;
// 상근이 알람 설정하기 (시간과 분은 각각의 변수로 따로 받음), nextInt() 2번 사용
// 24시간제이고 입력 받은 시간에서 45분 빼서 시간을 설정
// 힌트 : 시간을 분으로 환산하고 계산 다시 시간과 분으로 변경
// 0 :30과 같은 경우를 고민 if 문으로 처리가 가능
// 필요 문법 : 나머지 연산자, 나눗셈 연산자, 조건문
// 출력은 시간과 분으로 출력
public class AlarmEx1 {
public static void main(String[] args){
/* Scanner sc= new Scanner(System.in);
System.out.print("상근이 알람 시간입력 : ");
int h = sc.nextInt();
int m = sc.nextInt();
if(h>0){
h--;
if(m>=45){
m = m -45;
}else{
m = 60-(45-m);
}
System.out.println("알람 맞출 시간 : "+ h);
System.out.println("알람 맞출 시간 : "+ m);
}
if(h<=0){
h=23;
if(m>=45){
m = m -45;
}else{
m = 60-(45-m);
}
System.out.println("알람 맞출 시간 : "+ h);
System.out.println("알람 맞출 시간 : "+ m);
}
*/
Scanner sc= new Scanner(System.in);
System.out.print("상근이 알람 시간입력 : ");
int hour, min, calc; //시간, 분 , 시간과 분을 분으로 환산
hour = sc.nextInt();
min = sc.nextInt();
calc = (hour * 60) + min;
if(calc < 45) calc =(24 * 60) + min;
calc -=45;//calc = calc -45;
System.out.println("알람 : " + (calc / 60) + "시" + (calc % 60 )+ "분");
}
}
주석부분이 내가 푼 부분
활용 문제 2))
package 조건문예제2;
import java.util.Scanner;
//시험 성적을 입력 받아서 90점 이상 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D
//나머지는 F
//입력 받은 시험성적이 0 ~ 100 사이가 아니면 "성적이 잘못입력 되었습니다."
public class GradeEx1 {
public static void main(String args[]){
int score;//성적을 입력 받는 변수
Scanner sc = new Scanner(System.in);
System.out.print("성적을 입력하세요. : ");
score = sc.nextInt();// 성적을 입력 받아 score변수에 대입
if(score < 0 || score > 100) {
System.out.println("성적을 잘 못 입력 하였습니다.");
return;//반환값이 없어도 써도 됨. 프로그램 종료를 의미, 자바에서는 없어도 가능
}
// System.out.printf("등급을 결정하는 코드 구현 부");
if(score >=90 && score<=100 ){
System.out.print("A");
}if(score >= 80 && score <90){
System.out.print("B");
}if(score >= 70 && score <80) {
System.out.print("C");
}if(score >= 60 && score <70){
System.out.print("D");
}else if(score < 60){
System.out.print("F");
}
}
}
4)switch 문
- 정수 문자 문자열이 변수로 올 수 있음
- default 나머지 조건 해당
- break를 만나야 해당 케이스만 실행
public class SwitchEx1 {
public static void main (String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("계산식을 입력 하세요 : ");
int a = sc.nextInt();
char op = sc.next().charAt(0);
int b = sc.nextInt();
switch (op) {
case '+': //각 case는 :을 사용
System.out.printf("덧셈 : %d\n", a + b);
break;
case '-':
System.out.printf("뺄셈 : %d\n", a - b);
break;
case '*':
System.out.printf("곱셈 : %d\n", a * b);
break;
case '/':
System.out.printf("나눗셈 : %d\n", a / b);
break;
default:
System.out.printf("해당 연산자는 없습니다.\n");
}
}
}
Scanner sc = new Scanner(System.in);
System.out.print("성별을 입력하세요 : ");
char gender = sc.next().charAt(0);
switch (gender){
case 'M':
case 'm':
System.out.println("남성 입니다.");
break;
case 'F':
case'f':
System.out.println("여성 입니다.");
break;
default :
System.out.println("성별을 잘 못 입력하셨습니다. 다시 입력하세요.");
}
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("성별을 입력하세요 : ");
char gender = sc.next().charAt(0);
switch (gender) {
case 'M':
case 'm':
System.out.println("남성 입니다.");
break;
case 'F':
case 'f':
System.out.println("여성 입니다.");
break;
default:
System.out.println("성별을 잘 못 입력하셨습니다. 다시 입력하세요.");
continue;//반복문으로 다시 돌아감
}
break;
}//while 문 무한루프, break 문으로 탈출가능
----> 잘 못 입력 하였을 경우 다시 입력 받는 것을 while문으로 구현
어제 했던 예제))최댓값 찾기
if (a>b) {
if (a > c) System.out.println(a);
else System.out.println(c);
} else {
if (b>c) System.out.println(b);
else System.out.println(c);
//다른 풀이
// if (a>b) System.out.println(Math.max(a,c));
//else System.out.println(Math.max(b,c));
}
8.반복문
- for문 반복할 횟수가 정해졌을 때
- while문 반복할 횟수가 정해지지 않을때
public class WhileEx1 {
public static void main(String[] args) {
int age;//나이를 입력 받기 위한 변수
Scanner sc = new Scanner(System.in);
while(true){
System.out.print("나이를 입력 하세요: ");
age = sc.nextInt();
if(age > 0 && age <200) break;
System.out.println("나이를 잘못 입력 하셨습니다.");
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력 :");
int n = sc.nextInt();
int sum = 0; //값을 안 넣으면 쓰레기 값으로 시작하게 됨
//while 문 조건식에 정수값만 받아서 참 판별 허용 하지 않음
//0이 아니면 무조건 참임 다른 언어의 경우
for (int i = 1; i <= n; i++){
sum += 1;
}
/* for(;;){
sum += i;
if(i == n)break;
i++;
}*/
System.out.println("합계 : " + sum);
}
}
public class WhileEx1 {
public static void main(String[] args) {
int age;//나이를 입력 받기 위한 변수
Scanner sc = new Scanner(System.in);
/* while(true){
System.out.print("나이를 입력 하세요: ");
age = sc.nextInt();
if(age > 0 && age <200) break;
System.out.println("나이를 잘못 입력 하셨습니다.");
}*/
boolean isFirst = true; //is First : 첫번째 진입인가?
do {
if(!isFirst /*isFirst == false*/) System.out.println("나이를 잘못 입력 하셨습니다.");
System.out.print("나이를 입력 하세요 :");
age = sc.nextInt();
isFirst = false;
}while(age <= 0 || age >= 200);
}
첫번째는 무조건 do문 실행 후
while문에 해당하지만 처음이 아닐때는 "나이를 잘못 입력하셨습니다"를 실행하고
(while문에 해당 되어야 do문을 실행하기때문에 --> 맞게 입력하면 빠져 나감(실행 종료)
다시 "나이를 입력하세요"를 입력 받는다.
(주석값과 코드값은 같은 결과값이지만 다른 문법 사용)
예제))while문과 for문
package While반복문;
import java.util.Scanner;
public class WhileEx1 {
public static void main(String[] args) {
/* int treeHit = 0;
while(treeHit < 10) {
treeHit++;
System.out.println("나무를 " + treeHit + "번 찍었습니다.");
if(treeHit == 10){
System.out.println("나무가 넘어 갑니다.");
}*/
// }
for(int i = 1 ;i <= 10; i++){
System.out.println("나무를 " + i + "번 찍었습니다.");
}
System.out.println("나무가 넘어 갑니다.");
}
}
예제))한줄에 10개씩 찍기
package for반복문;
//for(초기식;최종식;증가식) { 참인 동안 수행되는 문장 }
public class ForEx1 {
public static void main (String[] args){
for(int i = 1; i <= 100; i++){
System.out.printf("%4d", i);
//한줄에 10개씩 찍기
if(i % 10 == 0){
System.out.println();
}
}
System.out.println();
}
}
예제)) 1~1000사이의 7의 배수를 구하고 한줄에 10개씩 출력
ublic class ForEx1 {
public static void main (String[] args){
for(int i = 1; i <= 1000; i++){
if(i % 7 == 0 ) System.out.printf("%4d",i);
//한줄에 10개씩 찍기
if(i % 70 == 0) System.out.println();
}
System.out.println();
}
}
예제))
//정수 n을 입력 받아 n * n 출력 (1부터 시작 ~~)
//Input n : 3
//output
//123
//456
//789
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력하세요. : ");
int n = sc.nextInt();
for(int i = 1; i <= n * n; i++){
System.out.printf("%4d", i);
if(i%n == 0) {
System.out.println();
n*n 중요----> 대신 square로 입력해서 사용가능
예제))
//정수 n 입력을 받음. 입력 과목 수 만큼의 성적 입력 받기, 총점과 평균 구하기
public class ForEx1 {
public static void main (String[] args) {
//정수 n 입력을 받음. 입력 과목 수 만큼의 성적 입력 받기, 총점과 평균 구하기
Scanner sc = new Scanner(System.in);
int total = 0; //총점을 구하는 변수
int score;
System.out.print("과목 수 입력하세요. : ");
int n = sc.nextInt();
for(int i = 0; i < n; i++) {
score = sc.nextInt();
total += score;
}
System.out.println("총점: " + total);
System.out.printf("평균 : %.2f\n" , (double)total/n);
}
}
*면접 시 필요할 수 있음
빅오표기법
O(1) ---> 가장 이상적이지만 달성할 수 없음
처리해야 할 데이터양과 상관없이 항상 일정한 실행 시간을 갖는 알고리즘
O(logN)
처리해야 할 데이터양이 증가할수록 실행 시간도 약간 증가하는 알고리즘이다. 일반적으로 효율이 높은 검색 알고리즘이 해당 된다.
(반으로 잘라서 값을 찾기, 한번 찾을 때마다 크기가 반으로 줄어 듦)
O(N)
처리해야 할 데이터양과 비례해 실행 시간이 증가하는 경우 (1부터 100까지 더하는 반복문)
재귀호출도 여기에 해당 된다.
O(NlogN)
처리해야 할 데이터양보다 실행 시간이 좀 더 빠르게 증가한다. 효율이 높은 정렬 알고리즘이 해당 된다.
퀵 정렬
O(N2)
반복문이 2번 중첩된 경우의 알고리즘
버블정렬
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
}
}
O(N3)
반복문이 3번 중첩된 경우의 알고리즘
데이터양이 증가하면 실행 시간은 그의 세제곱만큼 증가하므로 좋은 알고리즘이라고 볼 수 없다.
이중 for문
예제)) 별찍기
package 이중for문;
public class DoubleFor {
public static void main(String[] args){
for(int i = 0; i < 10; i++){
System.out.printf("|i = %d|",i);//행을 나타냄
for(int j = 0; j < 10; j++){
System.out.print("* ");//열을 나타냄
}
System.out.println();
}
}
}
예제))구구단
package 이중for문;
//구구단
public class DoubleFor {
public static void main(String[] args) {
for (int i = 2; i < 10; i++) {
for (int j = 1; j < 10; j++) {
System.out.printf("%d x %d = %d\n", i, j, (i * j));
}
System.out.println("-------------------------");
}
}
}
예제))별찍기
package 이중for문;
//정수 n을 입력 받아서 별찍기
//*
//* *
//* * *
//* * * *
import java.util.Scanner;
public class DoubleFor {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력 :");
int n =sc.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.printf("* ");
}
System.out.println( );
}
}
}
예제))주사위
int num1, num2;
while (true) {
//1 부터 6까지의 난수가 만들어 짐
num1 = (int)((Math.random() * 6)) + 1;
num2 = (int)((Math.random() * 6)) + 1;
System.out.println("주사위의 합 : " +( num1 + num2));
if((num1+num2) == 12 ) break;
예제))소수판별
package 이중for문;
//입력 받은 수가 소수인지 아닌지 판별하기
//소수란? 1과 자기자신이외의 수로는 나누어 지지 않는 수를 의미함
//Ex)2,7,5,3
//n의 수를 입력 받아서 범위내의 소수의 합을 구하기 : 12미만 (2 + 3+ 5 + 7 + 11)
import java.util.Scanner;
public class DoubleFor {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean isPrime = true; //소수를 판별할 논리형 변수
System.out.print("정수 입력 :");
int n = sc.nextInt();
//1은 소수도 합성수도 아니므로 i는 2부터 시작한다.
//2의 경우 반복문이 실행되지 않으므로 default값(boolean isPrime = true)으로 실행된다.
for (int i = 2; i < n; i++){
//나누어지는 수가 있을 경우 isPrime의 값을 false로 바꾼다.
if(n % i == 0) isPrime = false;
//n/i(ex)n=5 5/1, 5/2, 5/3, 5/4 나머지가 다 있음(나누어 떨어지지 않음)를 했을때
//나머지가 없는 경우 소수임 isPrime = true로 유지
//한 번이라도 이 조건문이 실행될 경우 n은 소수가 아니므로 반복문을 빠져나온다
}
if(isPrime)System.out.println(n+"은 소수 입니다.");
else System.out.println(n+"은 소수가 아닙니다.");
}
}
**소수 판별 :에네토스테네스의 체를 이용(n% i ==0)
예제))n의 수를 입력 받아서 범위내의 소수의 합을 구하기 : ex)12미만(2 + 3 + 5 + 7+ 11)
package 이중for문;
//입력 받은 수가 소수인지 아닌지 판별하기
//소수란? 1과 자기자신이외의 수로는 나누어 지지 않는 수를 의미함
//Ex)2,7,5,3
//n의 수를 입력 받아서 범위내의 소수의 합을 구하기 : 12미만 (2 + 3+ 5 + 7 + 11)
import java.util.Scanner;
public class DoubleFor {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0;
System.out.print("정수 입력 :");
int n = sc.nextInt();
for (int i = 2; i < n; i++){
sum += funcPrime(i);
}
System.out.println("소수의 합 :" +sum);
}
static int funcPrime(int n) {
boolean isPrime = true;
for(int i = 2; i < n; i++){
if(n % i == 0) isPrime = false;
}
if(isPrime) return n;
else return 0;
}
}
'국비학원 교육 일지' 카테고리의 다른 글
[8일차] 국비교육 (0) | 2022.07.28 |
---|---|
[7일차] 국비교육 (0) | 2022.07.27 |
[6일차] 국비교육 (0) | 2022.07.26 |
[5일차] 국비교육 (0) | 2022.07.25 |
[4일차]국비교육 (0) | 2022.07.22 |