알고리즘이란?
- 알고리즘: 문제를 해결하기 위한 것으로, 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어진 집합
- 순차적 구조: 여러 문장이 순차적으로 실행되는 구조를 순차적 구조라고 함
- 선택 구조: 식의 평가 결과에 따라 실행 흐름을 변경하는 if문과 같은 구조
import java.util.Scanner;
class A {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
stdIn.nextInt();
}
}
- 키보드로 숫자와 문자열을 입력하기 위해서는 java.util.Scanner클래스를 프로그램에 포함시키고,
- main메서드에 키보드 값을 입력받기 위해 Scanner객체를 생성하여 표준 입력으로부터 해당 숫자/문자를 입력 받습니다.
- System.in : 키보드와 연결된 표준 입력 스트림에서 문자나 숫자를 꺼내는 장치 역할을 함
- * Scanner의 경우 버퍼를 사용하여 입력을 받는 BufferedReader보다 속도가 6배가량 느리므로, 웬만하면 BufferedReader를 사용하는게 낫다고 합니다.
package basic;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class StringTokenizerTemplate {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int studentCount = Integer.parseInt(br.readLine());
}
}
다음은 세 정수의 중앙 값을 구하는 기본 알고리즘으로, 순차적 구조와 선택 구조가 적용되었습니다.
package doit.chap01;
import java.util.Scanner;
public class Median {
static int med3(int a, int b, int c) {
if (a >= b)
if (b >= c)
return b;
else if (a <= c)
return a;
else
return b;
else if(a > c)
return a;
else if(b > c)
return c;
else
return b;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("세 정수의 중앙값을 구합니다.");
System.out.println("a의 값: ");
int a = stdIn.nextInt();
System.out.println("b의 값 : ");
int b = stdIn.nextInt();
System.out.println("c의 값: ");
int c = stdIn.nextInt();
System.out.println("중앙값은" + med3(a, b, c) + "입니다.");
}
}
사전 판단 반복문
- 어떤 조건이 성립하는 동안 처리를 반복하여 실행하는 것을 반복구조라 하며 일반적으로 loop라 부릅니다.
- while문 처럼 실행 전에 반복을 계속할지 판단하는 구조를 '사전 판단 반복 구조'라고 부릅니다.
package doit.chap01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
public class SumWhile {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("1부터 n까지의 합을 구합니다.");
System.out.print("n의 값 : ");
int n = Integer.parseInt(br.readLine());
int sum = 0;
int i = 1;
while (i <= n) {
sum += i;
i++;
}
System.out.println("1부터" + n + "까지의 합은 " + sum + "입니다.");
}
}
- for문 반복
- for(초기화 부분; 제어식; 업데이트 부분) 명령문
package doit.chap01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
public class SumWhile {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("1부터 n까지의 합을 구합니다.");
System.out.print("n의 값 : ");
int n = Integer.parseInt(br.readLine());
int sum= 0;
for(int i =1; i<=n; i++)
sum+= i;
System.out.println("1부터" + n + "까지의 합은 " + sum + "입니다.");
}
}
사후 판단 반복
- do while문 : do문 while(제어식);
- do문은 일단 루프를 한번 실행한 다음 계속 반복할 것인지를 판단하는 사후 판단 반복문
- 제어식을 평가한 값이 true,즉 1이면 루프 본문의 명령문이 반복된다.
package doit.chap01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class SumForPos {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n;
System.out.println("1부터 n까지의 합을 구합니다.");
do{
System.out.print("n의 값: ");
n = Integer.parseInt(br.readLine());
}while (n <= 0);
int sum = 0;
for(int i=1;i<=n;i++)
sum+=i;
System.out.println("1부터 " + n + "까지의 합은 " + sum + "입니다.");
}
}
사전 판단 반복문인 while과 for문은 제어식을 평가한 결과가 0이면 루프 본문은 한 번도 실행되지 않습니다.
반면 사후 판단 반복문인 do문은 루프 본문이 반드시 한 번은 실행됩니다.
- 논리곱
x | y | x && y |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
- 논리합
x | y | x || y |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
- 드모르간 법칙 : 각 조건을 부정하고 논리곱을 논리합으로, 논리합을 논리곱으로 바꾸고 다시 전체를 부정하면 원래의 조건과 같다
- x && y = (!x || !y)
- x || y = (!x && !y)
do {
} while( no < 10 || no >99);
do{
}while(!(no>=10 && no <= 99)
- 위 제어식 (no < 10 || no > 99) 는 반복을 계속하는 계속 조건, !(no >= 10 && no<=99)는 반복을 종료하는 종료조건의 부정임
- 이 두식은 결론적으로 같음
다중루프
- 반복 안에서 다시 반복할 수 있는 것
- 이중 루프, 삼중 루프
package doit.chap01;
public class Multi99Table {
public static void main(String[] args) {
System.out.println("----곱셈표----");
for(int i=1; i<=9; i++){
for(int j=1; j<=9;j++)
System.out.printf("%3d", i * j);
System.out.println();
}
}
}
'Algorithm > 자료 구조 및 개념 정리' 카테고리의 다른 글
Array와 LinkedList의 차이 (0) | 2022.07.10 |
---|---|
LinkedList (0) | 2022.07.10 |
문자열 검색 (0) | 2022.05.01 |
집합 (0) | 2022.04.17 |
검색 알고리즘 (0) | 2022.03.15 |