안녕하세요.
취업을 했지만 실무를 하면서, 효율성과 가독성 떨어지는 코드를 보고 스스로 기초 개념이 부족하다고 느껴져 알고리즘 공부를 해야겠다 결심했습니다.
논리적인 생각이 잘 안되다 보니 소스코드도 길어지고 시간이 오래 걸리더라구요.
냄비 끓듯 금방 식을 열정 말고, 살살 스며들어 오래 공부할 수 있도록 노력해보려고 합니다.
참고한 도서는 Do it! 자료구조와 함께 배우는 알고리즘 입문(자바) 입니다.
http://www.yes24.com/Product/Goods/60547893
Do it! 자료구조와 함께 배우는 알고리즘 입문 자바 편 - YES24
IT 기업, 모든 시험에서 기초가 되는 자료구조와 알고리즘의 개념을 한 권에 모두 담았다!국내 IT 기업의 면접, 코딩 시험에서 중요하게 생각하는 역량 가운데 하나는 자료구조와 알고리즘이다.
www.yes24.com
참고로, 분철 옵션으로 구매하시면 좀 더 편하게 보실 수 있어요. 😄
1장 <기본 알고리즘>
- 알고리즘의 개념
- 소스코드의 실행 구조
- 키보드로 사용자 입력 받기
- 값의 대소 구분
- 조건 판단과 분기
01-1. 알고리즘이란?
알고리즘
: 주어진 문제를 해결하기 위해 필요한 여러가지 단계들을 체계적으로 명시해놓은 것
컴퓨터를 이용해 주어진 문제를 해결하는 방법(알고리즘) 중 가장 효율적인 알고리즘을 찾는 것이 중요하다.
알고리즘이 가져야 할 7가지 주요 특성들
입력 (input)
: 문제를 풀기 위한 입력이 있어야 한다.출력 (output)
: 문제를 해결했을 때 그 답이 나와야 한다.유한성 (finiteness)
: 유한 번의 명령이 수행된 후에는 반드시 끝나야 한다.정확성 (correctness)
: 주어진 문제를 정확하게 해결해야 한다.확정성 (definiteness)
: 각 단계가 실행된 후에는 결과가 확정되어야 한다.일반성 (generality)
: 같은 유형의 문제에 모두 적용될 수 있어야 한다.효율성 (effectiveness)
: 정확하면서도 효율적이어야 한다.
(김대수 저 <이산수학 Express> 참고)
순차적 구조와 선택적 구조
순차적(concatenation) 구조
: 코드가 위에서부터 아래로 순차적으로 실행되는 구조선택적(selection) 구조
: 조건에 따른 결과에 따라 프로그램의 실행 흐름을 변경하는 구조
package chap01;
import java.util.Scanner;
class Max3 {
public static void main(String[] args) {
// 순차적 구조
Scanner stdIn = new Scanner(System.in);
System.out.println("세 정수의 최댓값을 구합니다.");
System.out.print("a의 값:"); int a = stdIn.nextInt();
System.out.print("b의 값:"); int b = stdIn.nextInt();
System.out.print("c의 값:"); int c = stdIn.nextInt();
int max = a;
if (b > max) max = b; // 선택적 구조
if (c > max) max = c;
System.out.println("최댓값은 " + max + "입니다.");
}
}
[실습 1-1] Max3.java
Scanner : 키보드로 숫자와 문자열 입력하기
키보드로 어떤 값을 입력 받기 위해서는, 키보드와 연결된 표준 입력 스트림인 System.in
을 사용한다.Scanner
객체의 변수 stdIn은 연결된 표준 입력 스트림에서 문자나 숫자를 꺼내는 장치 역할을 한다.
- Scanner 클래스에 포함되어 있는 메소드
- 범위는 next()와 nextLine() 외에 표기하지 않겠다. 기본 자료형의 범위와 동일하다.
메소드 | 자료형 | 입력값의 범위 |
---|---|---|
nextBoolean() | boolean | |
nextByte() | byte | |
nextShort() | short | |
nextInt() | int | |
nextLong() | long | |
nextFloat() | float | |
nextDouble() | double | |
next() | String | 문자열(스페이스, 줄 바꿈 문자로 구분) |
nextLint() | String | 문자열 1줄 |
메소드 매개변수 활용하기
public class Max3m {
static int max3(int a, int b, int c){
int max = a;
if(b > max) max = b;
if(c > max) max = c;
System.out.println("max3 : " + max);
return max;
}
public static void main(String[] args) {
System.out.println("max3(3,2,1) = " + max3(3, 2, 1));
System.out.println("max3(3,2,2) = " + max3(3, 2, 2));
System.out.println("max3(3,1,2) = " + max3(3, 1, 2));
System.out.println("max3(3,2,3) = " + max3(3, 2, 3));
System.out.println("max3(2,1,3) = " + max3(2, 1, 3));
System.out.println("max3(3,3,2) = " + max3(3, 3, 2));
System.out.println("max3(3,3,3) = " + max3(3, 3, 3));
System.out.println("max3(2,2,3) = " + max3(2, 2, 3));
System.out.println("max3(2,3,1) = " + max3(2, 3, 1));
System.out.println("max3(2,3,2) = " + max3(2, 3, 2));
System.out.println("max3(1,3,2) = " + max3(1, 3, 2));
System.out.println("max3(2,3,3) = " + max3(2, 3, 3));
System.out.println("max3(1,2,3) = " + max3(1, 2, 3));
}
}
[실습 1-2] Max3m.java
![](https://blog.kakaocdn.net/dn/bnEmqg/btrxB5pmzwO/Np65MJmMRCRMnKoZvCez9K/img.png)
![](https://blog.kakaocdn.net/dn/KSDM2/btrxziV1fu2/3GSCc8BgC6QxChT4sCgzHk/img.png)
![](https://blog.kakaocdn.net/dn/X7bfL/btrxr3ZsuIN/hMbkQbr7xHRcN9Uvu8jmJk/img.png)
세 값의 대소관계
세 값의 대소 관계의 조합은 13가지가 있다. 이 조합을 나열하면 나무 모양과 유사하다 하여 결정트리
라고 한다.
진행방향은 왼->오. 조건 성립하면 위, 성립하지 않으면 아래.
a,b,c 의 대소관계를 따져볼려고 그려봤는데, 쉬울 줄 알았는데 생각보다 헷갈렸다.
트리를 그리는 것과 같은 원리로 생각하면 된다. 중앙값이 무엇이 될지 케이스를 생각하는 게 시간이 좀 걸리긴 했으나
우선 똑같이 a와 b를 비교, b와 c를 비교, c와 a를 비교 하는 식으로 진행했다.
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(c>=a) return a;
else return c;
} else {
// a<b
if(a>c) return a;
else if(b>c) return c;
else return b;
}
}
public static void main(String[] agrs) {
Scanner sc = new Scanner(System.in);
System.out.println("세 정수의 중앙값 구하기");
System.out.print("a : "); int a = sc.nextInt();
System.out.print("b : "); int b = sc.nextInt();
System.out.print("c : "); int c = sc.nextInt();
System.out.println("중앙값은 " + med3(a,b,c) + " 입니다.");
}
}
[실습 1C-1] Median.java
public static void main(String[] args) {
System.out.println("세 정수의 중앙값 구하기");
System.out.println("med3(3,2,1) = " + med3(3, 2, 1));
System.out.println("med3(3,2,2) = " + med3(3, 2, 2));
System.out.println("med3(3,1,2) = " + med3(3, 1, 2));
System.out.println("med3(3,2,3) = " + med3(3, 2, 3));
System.out.println("med3(2,1,3) = " + med3(2, 1, 3));
System.out.println("med3(3,3,2) = " + med3(3, 3, 2));
System.out.println("med3(3,3,3) = " + med3(3, 3, 3));
System.out.println("med3(2,2,3) = " + med3(2, 2, 3));
System.out.println("med3(2,3,1) = " + med3(2, 3, 1));
System.out.println("med3(2,3,2) = " + med3(2, 3, 2));
System.out.println("med3(1,3,2) = " + med3(1, 3, 2));
System.out.println("med3(2,3,3) = " + med3(2, 3, 3));
System.out.println("med3(1,2,3) = " + med3(1, 2, 3));
}
[연습문제4] 세 값의 대소 관계 13종류의 모든 조합에 대해 중앙값을 구하여 출력하는 프로그램
조건 판단과 분기
아래 코드에서 if문 중, 마지막 else if 문을 else 문으로 변경하면, 분기하는 모습이 다르다.
마지막에 3이 아닌 4나 -8이 입력 되어도, 출력은 이 수는 3
으로 된다.
즉, 원래 문장은 else 를 포함한 네 가지로 분기하지만, if(n==3) 을 생략한 문장은 세 가지로 분기 및 잘못된 결과를 출력하여 if문의 구조가 달라지므로
else if 문을 else 문으로 생략할 수 없다.
import java.util.Scanner;
public class JudgeSign {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("정수를 입력하세요.");
int n = sc.nextInt();
if(n==1)
System.out.println("이 수는 1");
else if(n==2)
System.out.println("이 수는 2");
else if(n==3)
System.out.println("이 수는 3");
}
}
// else if(n==3) 을 else 로 바꾸면
if(n==1)
System.out.println("이 수는 1");
else if(n==2)
System.out.println("이 수는 2");
else
System.out.println("이 수는 3");
// 사실은 이렇습니다.
if(n==1)
System.out.println("이 수는 1");
else if(n==2)
System.out.println("이 수는 2");
else if(n==3)
System.out.println("이 수는 3");
else
; // 아무것도 하지 않음
연산자와 피연산자
단항 연산자
: 피연산자 1개 ex) a++이항 연산자
: 피연산자 2개 ex) a>b삼항 연산자
: 피연산자 3개 ex) a ? b : c
자바의 조건 연산자 ? :
는 유일하게 삼항 연산자
이다. a가 참이면 b, a가 거짓이면 c 를 출력한다.
잘 사용하면 if문 대신 조금 더 간략하게 사용 가능하다.
순서도 (flowchart)
데이터(data)
: 데이터의 입력과 출력처리(process)
: 여러 종류의 처리 기능 수행. 연산이나 연산군 실행, 또는 몇가지 흐름 가운데 하나의 방향 결정하는 연산이나 연산군미리 정의한 처리(predefined process)
: 서브루틴 및 모듈 등 다른 곳에서 이미 정의한 하나 이상의 연산 또는 처리판단(decision)
: 하나의 입구와 하나 이상을 선택할 수 있는 출구, 정의한 조건을 판단해 출구 선택하는 판단 기능루프 범위(loop limit)
: 두 부분으로 구성되어 루프의 시작과 종료 나타냄. 루프 이름과 함께변수(i):초깃값,증갓값,종룟값
으로 표기
기본적으로 아는 내용이라 빨리 넘어가고 싶었지만, 기본이 가장 중요하다는 점을 계속해서 유의해야겠습니다.
자만하지말고 내일도 계속해서 공부해야겠다. 더 나은 내일을 위해 😊
읽어주셔서 감사합니다.