0%

Baekjoon Online Judge - 10845

Review

  • 제출하면서 맞왜틀이 된 문제.
  • 한 시간동안 헤매서 답을 풀었다.
  • 이유는 출력시 자료형이 달라서 그런 거였다. object로 return했는데 자꾸 틀리는 바람에 int로 죄다 바꿔서 출력하니까 성공.
  • 몰랐던 나는 예외처리 잘못한 줄 알고 엉뚱한 거 계속 고치고 있었다. 진짜 에바…

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import java.io.*;

public class Main {
public static void main(String args[]) throws IOException {

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();

int n = Integer.parseInt(bf.readLine());
Queue queue = new Queue(n);

while(n-->0) {
String[] input = bf.readLine().split(" ");

if(input[0].equals("push")) {
queue.push(Integer.parseInt(input[1]));
} else if(input[0].equals("pop")) {
sb.append(queue.pop() + "\n");
} else if(input[0].equals("size")) {
sb.append(queue.size() + "\n");
} else if(input[0].equals("empty")) {
sb.append(queue.empty() + "\n");
} else if(input[0].equals("front")) {
sb.append(queue.front() + "\n");
} else if(input[0].equals("back")) {
sb.append(queue.back() + "\n");
}
}
System.out.println(sb);
}

static class Queue {
private int[] array;
private int rear;
private int item;

public Queue(int size) {
rear = -1;
array = new int[size];
}

public void push(int item) {
array[++rear] = item;
}

public int pop() {
if (rear==-1) {
return -1;
} else {
item = array[0];
for (int i = 0; i < rear; i++) {
array[i] = array[i+1];
}
rear--;
return item;
}
}

public int size() {
return rear+1;
}

public int empty() {
if(rear==-1) {
return 1;
} else {
return 0;
}
}

public int front() {
if(rear==-1) {
return -1;
}
return array[0];
}

public int back() {
if(rear==-1) {
return -1;
}
return array[rear];
}
}
}

백준 강의 정리 - BigInteger

목차

  1. 1. BigInteger
  2. 2. 기본 사용 방법
  3. 3. 여러가지 사칙 연산
  4. 4. 입력 받기
  5. 5. 같은 값인지 판단하기
  6. 6. 예시1 - 큰 수 A+B
  7. 7. 예시1 - a^b

1. BigInteger

  • 큰 정수를 나타낼 때 사용하는 클래스
  • java.math.*; 에 들어있음.
  • 자바에서만 존재하는 자료구조이다.

2. 기본 사용 방법

1
2
3
4
5
6
7
BigInteger a = new BigInteger("10000");
BigInteger b = new BigInteger("1000");
// a+b와 같은 연산이 되지않기 때문에 덧셈은 아래와 같이 처리
BigInteger c = a.add(b);
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);

3. 여러가지 사칙 연산

1
2
3
4
5
6
7
8
9
10
11
12
13
System.out.println("a+b = " + a.add(b)); //덧셈
System.out.println("a-b = " + a.subtract(b)); //뺄셈
System.out.println("a*b = " + a.multiply(b)); //곱하기
System.out.println("a/b = " + a.divide(b)); //나누기
System.out.println("a%b = " + a.remainder(b)); //나머지
System.out.println("gcd(a,b) = " + a.gcd(b)); //최대공약수
System.out.println("-a = " + a.negate()); //부호 변경
System.out.println("a^10 = " + a.pow(10)); //제곱

// 0, 1, 10은 따로 만들 필요 없이 바로 사용할 수 있음
System.out.println("ZERO = " + BigInteger.ZERO);
System.out.println("ONE = " + BigInteger.ONE);
System.out.println("TEN = " + BigInteger.TEN);

4. 입력 받기

1
2
3
4
5
6
7
8
9
10
11
BigInteger a = sc.nextBigInteger();
BigInteger b = sc.nextBigInteger();
int c = a.compareTo(b);
if (c < 0) { // 음수
System.out.println("<");
} else if (c == 0) { // 0
System.out.println("==");
} else { // 크다
System.out.println(">");
}
System.out.println("compareTo = " + c);

5. 같은 값인지 판단하기

1
2
3
4
5
6
7
boolean e = a.equals(b);
if (e) {
System.out.println("==");
} else {
System.out.println("!=");
}
System.out.println("equals = " + e);

6. 예시1 - 큰 수 A+B

1
2
3
4
5
6
7
8
9
10
11
import java.math.*;
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
BigInteger a, b;
a = sc.nextBigInteger();
b = sc.nextBigInteger();
System.out.println(a.add(b));
}
}

7. 예시2 - a^b

  • 여기서 a는 실수가 된다.
  • 실수 a와 정수 b가 주어졌을 때 어떻게 정확하게 할까?
  • BigDecimal을 사용하면 된다.
  • toString()을 사용하면 정확한 값을 출력할 수 없다. toPlainString()을 사용하자.
1
2
3
4
5
6
7
8
9
10
11
import java.math.*;
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
BigDecimal a = sc.nextBigDecimal();
int b = sc.nextInt();
BigDecimal c = a.pow(b);
System.out.println(c.toPlainString());
}
}

Baekjoon Online Judge - 1406

Review

  • 스택 2개로 풀었다.
  • L: stackA -> stackB로 옮김
  • P: StackA.push()
  • B: StackA.Pop()
  • D: stackB -> StackA로 옮김
  • 요런 식으로 풀면 된다.
  • 아직 자바로 입출력 받고 문자열 처리하는 게 어렵다. 수련이 더 필요함.

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
import java.io.*;

public class Main {
public static void main(String args[]) throws IOException {

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();

Stack<String> stackA = new Stack<String>();
Stack<String> stackB = new Stack<String>();

String word = bf.readLine();
int n = Integer.parseInt(bf.readLine());

for(int i = 0; i < word.length(); i++) {
stackA.push(word.charAt(i)+"");
}

while (n-->0) {
String[] input = bf.readLine().split(" ");
if(input[0].equals("L")) {
if(!stackA.empty()) {
stackB.push(stackA.pop());
}
} else if(input[0].equals("D")) {
if(!stackB.empty()) {
stackA.push(stackB.pop());
}
} else if(input[0].equals("B")) {
if(!stackA.empty()) {
stackA.pop();
}
} else if(input[0].equals("P")) {
stackA.push(input[1].charAt(0)+"");
}
}

while(!stackB.empty()) {
stackA.push(stackB.pop());
}

while(!stackA.empty()) {
sb.append(stackA.pop());
}

System.out.println(sb.reverse());
}
}

Baekjoon Online Judge - 15552

Review

  • 입출력 연습하는 문제.
  • BufferedReader를 통해서 입력을 받으면 된다.
  • 출력은 StringBuilder와 BufferedWriter를 각각 사용해서 풀었다.

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.*;

public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();

int n = Integer.parseInt(bf.readLine());
int res = 0;

for(int i = 0; i < n; i++) {
String[] line = bf.readLine().split(" ");
res = Integer.parseInt(line[0]) + Integer.parseInt(line[1]);
sb.append(res + "\n");
}

System.out.println(sb);
}
}

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.*;

public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

int n = Integer.parseInt(bf.readLine());
String res;

for(int i = 0; i < n; i++) {
String[] line = bf.readLine().split(" ");
res = (Integer.parseInt(line[0]) + Integer.parseInt(line[1])) + "\n";
bw.write(res);
}
bw.flush();
}
}

백준 강의 정리 - 정렬

  • 배열은 Arrays.sort, 콜렉션은 Collections.sort를 사용한다.

목차

  1. 오름차순 정렬

  2. 좌표 정렬하기

  3. 좌표 정렬하기 2

1. 오름차순 정렬

1.1 ArrayList를 이용하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<Integer> a = new ArrayList<Integer>();
// n개의 수를 입력받아 저장
for (int i=0; i<n; i++) {
int temp = sc.nextInt();
a.add(temp);
}

// ArrayList에 있는 모든 요소를 오름차순으로 정렬
Collections.sort(a);

//출력
for (int x : a) {
System.out.println(x);
}
}
}

1.2 정수 배열을 이용하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];

// 삽입
for (int i=0; i<n; i++) {
a[i] = sc.nextInt();
}

// 정렬
Arrays.sort(a);

// 출력
for (int x : a) {
System.out.println(x);
}
}
}

2. 좌표 정렬하기

  • (x,y)가 여러 개 있을 때, x가 증가하는 순으로, 같으면 y가 증가하는 순으로 정렬하는 문제.
  • Comparator나 Comparable을 작성해야 한다.
  • Comparable는 compareTo를 구현하는데, 내츄럴한 순서를 정의한다. (예를 들면 문자열은 사진 순)
  • Comparator는 다른 순서로 정렬하고 싶을 때 사용한다. (예를 들면 문자열을 길이 순으로 정렬하고 싶을 때)

2.1 Comparable

CompareTo를 작성할 때는 조심해야 할 것이 세 가지가 있다. CompareTo를 작성할 때는 이 세 가지 조건을 전부 만족해야 한다. 만약 세 가지 중 하나에 위배되는 경우 정렬을 계속하지 않고 프로그램의 실행을 중지하게 된다. (런타임 에러)

  1. sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
    • 여기서 sgn은 부호를 나타낸다. x를 y를 서로 비교했을 때 부호가 서로 같아야 한다.
  2. x.compareTo(y)>0 && y.compareTo(z)>0) implies x.compareTo(z)>0
    • x랑 y를 비교했을 때 양수고, y랑 z를 비교했을 때 양수라면 x랑 z를 비교했을 때도 양수가 나와야 한다.
  3. x.compareTo(y)==0 implies that sgn(x.compareTo(z)) == sgn(y.compareTo(z))
    • x와 y가 같다면, x를 z랑비교한 것, 그리고 y를 z에 비교한 것의 부호가 서로 같아야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int compareTo(Point that) { 
if (this.x < that.x) {
return -1;
} else if (this.x == that.x) {
if (this.y < that.y) { // 작으면
return -1;
} else if (this.y == that.y) { // 같으면
return 0;
} else { // 크면
return 1;
}
} else {
return 1;
}
}

좌표 정렬하기 문제 풀어보기 - Comparable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
import java.io.*;

// Comparable implement 하기
class Point implements Comparable<Point> {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}

// compareTo 메소드 작성
public int compareTo(Point that) {
if (this.x < that.x) {
return -1;
} else if (this.x == that.x) {
if (this.y < that.y) {
return -1;
} else if (this.y == that.y) {
return 0;
} else {
return 1;
}
} else {
return 1;
}
}
}
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
Point[] a = new Point[n];
for (int i=0; i<n; i++) {
String[] temp = bf.readLine().split(" ");
int x = Integer.parseInt(temp[0]);
int y = Integer.parseInt(temp[1]);

// 알아서 정렬이 된다.
a[i] = new Point(x, y);
}
Arrays.sort(a);
StringBuilder sb = new StringBuilder();
for (Point p : a) {
sb.append(p.x + " " + p.y + "\n");
}
System.out.print(sb);
}
}

2.2 Comparator

두 번째 인자로 어떻게 compare할지를 나타내는 함수를 넣어놓으면 된다.

1
2
3
4
5
Arrays.sort(a, new Comparator<Point>() {
public int compare(Point p1, Point p2) {
return p1.compareTo(p2);
}
});

좌표 정렬하기 문제 풀어보기 - Comparator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
import java.io.*;
class Point implements Comparable<Point> {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public int compareTo(Point that) {
if (this.x < that.x) {
return -1;
} else if (this.x == that.x) {
if (this.y < that.y) {
return -1;
} else if (this.y == that.y) {
return 0;
} else {
return 1;
}
} else {
return 1;
}
}
}
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
Point[] a = new Point[n];
for (int i=0; i<n; i++) {
String[] temp = bf.readLine().split(" ");
int x = Integer.parseInt(temp[0]);
int y = Integer.parseInt(temp[1]);
a[i] = new Point(x, y);
}

// sort메소드에 어떻게 정렬할 건지를 두 번째 인자로 넣어주면 된다.
Arrays.sort(a, new Comparator<Point>() {
public int compare(Point p1, Point p2) {
return p1.compareTo(p2);
}
});
StringBuilder sb = new StringBuilder();
for (Point p : a) {
sb.append(p.x + " " + p.y + "\n");
}
System.out.print(sb);
}
}

3. 좌표 정렬하기 2

  • (x,y)가 여러 개 있을 때, y가 증가하는 순으로, 같으면 x가 증가하는 순으로 정렬하는 문제.
  • Comparator를 사용해야 의미적으로 올바른 구현을 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.*;
import java.io.*;
class Point implements Comparable<Point> {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public int compareTo(Point that) {
if (this.x < that.x) {
return -1;
} else if (this.x == that.x) {
if (this.y < that.y) {
return -1;
} else if (this.y == that.y) {
return 0;
} else {
return 1;
}
} else {
return 1;
}
}
}
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
Point[] a = new Point[n];
for (int i=0; i<n; i++) {
String[] temp = bf.readLine().split(" ");
int x = Integer.parseInt(temp[0]);
int y = Integer.parseInt(temp[1]);
a[i] = new Point(x, y);
}
Arrays.sort(a, new Comparator<Point>() {
public int compare(Point p1, Point p2) {
if (p1.y < p2.y) {
return -1;
} else if (p1.y == p2.y) {
if (p1.x < p2.x) {
return -1;
} else if (p1.x == p2.x) {
return 0;
} else {
return 1;
}
} else {
return 1;
}
}
});
StringBuilder sb = new StringBuilder();
for (Point p : a) {
sb.append(p.x + " " + p.y + "\n");
}
System.out.print(sb);
}
}

Baekjoon Online Judge - 2839

Review

  • 3을 계속 빼다 5의 배수인 경우 5로 전부 나누면 된다.

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;

public class Main {

public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
int cnt = 0;
int ans = 0;

// 입력이 5의 배수가 아닌 경우, 0보다 같거나 클 경우
while(input % 5 !=0 && input >= 0) {
// 3씩 뺌
input -=3;
cnt++;

}

ans = input < 0 ? -1 : cnt + input/5;
System.out.println(ans);

}

}

백준 강의 정리 - Collections

  • Collections의 Stack, Queue 등을 사용하면 구현 없이 사용할 수 있다.

목차

  1. ArrayList

  2. LinkedList

  3. Stack

  4. Set

  5. Map

  6. Queue

1. ArrayList

  • 배열이다.
  • Array와 같은 역할을 하지만, 길이가 정해져 있지 않고 변한다.
  • C++에서는 vector에 해당된다.
  • java.util에 들어있다.
  • 그래프 문제의 인접 리스트를 만들 때 가장 많이 사용한다.
1
2
3
4
5
6
7
8
9
import java.util.*;

public class Main {
public static void main(String args[]) {
ArrayList<Integer> a = new ArrayList<Integer>();
// capacity가 40, 자료형은 정수
ArrayList<Integer> b = new ArrayList<Integer>(40);
}
}

1.1 ArrayList의 주요 메소드

  1. boolean add(E e)
    • 새로운 element e를 추가
  2. void add(int index, E element)
    • O(n)
    • index번째에 새로운 element e를 추가
  3. void clear()
    • ArrayList를 완전히 비움
  4. boolean Contains(Object o)
    • O(n)
    • Object o가 들어있는지 아닌지를 판단
  5. E get(int index)
    • index번째를 데려옴
    • arr[index]는 arr.get와 같은 표현이다.
  6. boolean isEmpty()
    • ArrayList가 비어있는지 아닌지 판단
  7. E remove(int index)
    • O(n)
    • index번째 삭제
  8. E set(int index, E element)
    • index번째를 새로운 element로 바꿈
    • arr[index] = element와 같다
  9. Object[] toArray()
    • Array로 바꾸기

1.2 예제

  • ArrayList에 element 넣어서 출력하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import java.util.*;
    public class Main {
    public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    ArrayList<Integer> a = new ArrayList<Integer>();
    for (int i=0; i<n; i++) {
    int temp = sc.nextInt();
    a.add(temp);
    }
    // 정렬하기
    Collections.sort(a);
    for (int x : a) {
    System.out.println(x);
    }
    // 이렇게도 출력 가능
    // for (int i=0; i<n; i++) {
    // System.out.println(a.get(i));
    // }
    }
    }
  • 그래프 문제의 인접 리스트 만들기

1
2
3
4
5
6
7
8
9
10
11
12
ArrayList<Integer>[] a = (ArrayList<Integer>[]) new ArrayList[n+1];

for (int i=1; i<=n; i++) {
a[i] = new ArrayList<Integer>();
}
for (int i=0; i<m; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
// 인접한 간선 만들기
a[u].add(v);
a[v].add(u);
}

2. LinkedList

  • 이중 연결 리스트라고 한다.
  • java.util에 들어있다.
  • 대회 문제나 알고리즘 문제에서는 사용하는 경우가 드물다.

3. Stack

  • java.util에 들어있다.
  • 가장 많이 사용하는 메소드 중 하나이다.
  • 한쪽 끝에서만 자료를 넣고 뺄 수 있는 구조이다.
  • 마지막으로 넣은 것이 가장 먼저 나오기 때문에 Last In First Out(LIFO)라고도 한다.

3.1 Stack의 주요 메소드

  1. E push(E item)
    • 스택에 자료를 넣는 연산
  2. E pop()
    • 스택에서 자료를 빼는 연산
    • return값이 있다 (C++에서는 없음)
  3. E peek()
    • 스택의 가장 위에 있는 자료를 보는 연산
  4. bool empty()
    • 스택이 비어있는지 아닌지를 알아보는 연산
  5. int size()
    • 스택에 저장되어있는 자료의 개수를 알아보는 연산

4. Set

  • 인터페이스이다.
  • 중복된 원소를 포함하지 않는다.
  • Set을 구현한 것으로 HashSet, TreeSet, LinkedHashSet이 있다.
  • 일반적인 경우에는 HashSet을 사용하고, 순서가 중요한 경우에는 TreeSet, 입력으로 넣은 순서가 중요한 경우에는 LinkedHashSet을 사용한다.

4.1 Set의 주요 메소드

  1. boolean add(E e)
    • 새로운 element e를 추가
  2. void clear()
    • Set을 완전히 비움
  3. boolean contains(Object o)
    • Object o가 들어있는지 아닌지를 판단
  4. boolean isEmpty()
    • Set이 비어있는지 아닌지 판단
  5. boolean remove(Object o)
    • Object o 삭제
  6. int size()
    • Set 크기 알아보기
  7. Object[] toArray()
    • Array로 바꾸기

4.2 HastSet

  • 해시 테이블을 이용해서 구현되어 있다.
  • 삽입/삭제/제거 연산의 시간 복잡도가 O(1)이다.
  • 순서가 보장되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class Main {
public static void main(String args[]) {
HashSet<Integer> d = new HashSet<Integer>();
for (int i=10; i>=1; i--) {
d.add(i);
}
for (int x : d) {
// 순서를 모른다.
System.out.print(x + " ");
}
}
}

4.3 TreeSet

  • 이진 검색 트리(레드 블랙 트리)로 이루어져 있다.
  • 삽입/삭제/제거 연산의 시간 복잡도가 O(log N)이다.
  • 순서가 보장된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class Main {
public static void main(String args[]) {
TreeSet<Integer> d = new TreeSet<Integer>();
for (int i=10; i>=1; i--) {
d.add(i);
}
for (int x : d) {
// 1 2 3 4 5 6 7 8 9 10
System.out.print(x + " ");
}
}
}

4.4 LinkedHashSet

  • 해시테이블과 연결리스트를 이용해서 구현되어 있다.
  • 삽입/삭제/제거 연산의 시간 복잡도가 O(1)이다.
  • 추가한 순서가 보장된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class Main {
public static void main(String args[]) {
LinkedHashSet<Integer> d = new LinkedHashSet<Integer>();
for (int i=10; i>=1; i--) {
d.add(i);
}
for (int x : d) {
// 10 9 8 7 6 5 4 3 2 1
System.out.print(x + " ");
}
}
}

5. Map

  • 인터페이스이다.
  • 중복된 Key를 포함하지 않는다.
  • Key-Value 쌍을 이룬다. (사전과 비슷)
  • Map을 구현한 것으로 HashMap, TreeMap, LinkedHashMap이 있다.

5.1 Map의 주요 메소드

  1. void clear()
    • Map을 완전히 비움
  2. boolean containsKey(Object key)
    • key가 들어있는지 아닌지 확인
  3. boolean containsValue(Object value)
    • 어떤 value를 가지고있는지 아닌지를 확인
  4. Set<Map.Entry<K,V>> entrySet()
    • Key-Value 쌍을 이용한 Set을 만들어줌
  5. V get(Object key)
    • Key를 넣으면 Key에 해당하는 Value 리턴
  6. boolean isEmpty()
    • Map이 비어있는지 아닌지 판단
  7. Set keySet()
    • Key를 이용해서 만든 Set을 만들어줌
  8. V put(K key, V value)
    • Key에 해당하는 Value를 넣음
  9. boolean remove(Object o)
    • Object o 삭제
  10. int size()
    • Map의 크기 알아보기

6. Queue

  • 한쪽 끝에만 자료를 넣고 다른 한쪽 끝에서만 뺄 수 있는 자료구조.
  • 먼저 넣은 것이 가장 먼저 나오기 때문에 First In First Out(FIFO)라고도 한다.
  • 인터페이스이다.
  • 구현한 클래스로는 ArrayDeque, LinkedList, PriorityQueue가 있다.
  • 뒤에 무슨 데이터가 있는지 알아보는 메소드는 존재하지 않는다. 중요하지 않기 때문이다.

6.1 Queue의 주요 메소드

  1. boolean offer(E e)
    • 큐에 자료를 넣는 연산(push)
  2. E poll()
    • 큐에서 자료를 빼는 연산(pop)
    • return값이 있다 (C++에서는 없음)
  3. E peek()
    • 큐의 가장 앞에 있는 자료를 보는 연산
  4. bool isEmpty()
    • 큐가 비어있는지 아닌지를 알아보는 연산
  5. int size()
    • 큐에 저장되어있는 자료의 개수를 알아보는 연산

6.2 PriorityQueue

  • 우선 순위 큐라고 한다.
  • 큐에 들어있는 아이템들 중 우선순위가 높은 아이템부터 pop이 된다.
  • 최대 힙이나 최소 힙으로 구현하게 되는 경우가 많다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//최소 힙을 구하는 소스
import java.util.*;

public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
PriorityQueue<Integer> q = new PriorityQueue<Integer>();
int n = sc.nextInt();
while (n-- > 0) {
int x = sc.nextInt();
if (x == 0) {
if (q.isEmpty()) {
System.out.println(0);
} else {
System.out.println(q.poll());
}
} else {
q.offer(x);
}
}
}
}

백준 강의 정리 - 입/출력

목차

  1. 입력받기
  2. 출력하기

1. 입력받기

1.1 Scanner

  • 입력을 편하게 받을 수 있다.
  • “next자료형”을 이용해서 입력을 받을 수 있다.
  • “hasNext자료형”을 이용해서 입력받을 수 있는 자료형이 있는지 구할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;

public class Main {

public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int sum = 0;
while(sc.hasNextInt()) {
sum += sc.nextInt();
}
System.out.println(sum);

}

}

1.2 BufferedReader

  • Scanner는 느린 경우가 많아서, 입력이 많은 경우에는 BufferedReader를 사용하는 것이 좋다.
  • read와 readLine만 있기 때문에 정수는 파싱을 해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.*;

public class Main {

public static void main(String args[]) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] line = bf.readLine().split(" ");

String a = line[0] + line[1];
String b = line[2] + line[3];
// 문제 제한 때문에 결과값이 int의 범위를 넘어가게 돼서 long으로 형변환
long ans = Long.valueOf(a) + Long.valueOf(b);
System.out.println(ans);
}

}

1.3 StringTokenizer

  • 문자열을 토큰으로 잘라야 할 때 사용하면 편하다.
  • 어떤 문자열이 있을 때 공백이나 콤마 등으로 잘라야 할 때 좋다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.*;
import java.util.*;

public class Main {

public static void main(String args[]) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String line = bf.readLine();

// 첫번째 인자는 무엇을 자를 것인지 결정
// 두번째 인자는 무엇을 기준으로 나눌 것인지 결정
StringTokenizer st = new StringTokenizer(line, ",");

int sum = 0;

// 토큰이 있는지 없는지를 확인
while (st.hasMoreTokens()) {
// 정수 형태로 형변환
sum += Integer.valueOf(st.nextToken());
}
System.out.println(sum);
}

}

2. 출력하기

2.1 print, println, printf

  • print
  • println
  • printf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {

public static void main(String args[]){
// 줄바꿈하지 않고 출력
System.out.print("Hello world");

// 줄바꿈해서 출력
System.out.println("Hello world");

// 출력 서식 + 출력할 내용
System.out.printf("%.3f", 1.234567f);

}

}

2.2 StringBuilder

  • 출력해야 할 것이 많은 경우에는 StringBuilder를 이용해 문자열을 만들고 출력하는 것이 좋다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {

public static void main(String args[]) {
Scanner sc = new Scanner(System.in);

int n = sc.nextInt();
StringBuilder sb = new StringBuilder();

for(int i=1; i<=n; i++) {
sb.append(i + "\n");
}
System.out.println(sb);
}

}

Baekjoon Online Judge - 1924

Review

  • 이전 년도의 날수를 전부 더한다.
  • 해당 날짜까지의 일수를 추가한 다음에 7로 나눈 나머지를 구하면 되는 문제.

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;

public class Main {

public static void main(String args[]){
Scanner sc = new Scanner(System.in);

int m = sc.nextInt();
int d = sc.nextInt();

String[] day = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
int[] month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int preYear = 2006;
int res;

// 이전 년도의 날수 구하기
int totalDays = (preYear)*365 + (preYear/4 - preYear/100 + preYear/400);

// 이전 월의 날짜 전부 더하기
for(int i = 0; i < m-1; i++) {
totalDays += month[i];
}

totalDays += d;
res = totalDays % 7;

System.out.println(day[res]);
sc.close();

}

}

Baekjoon Online Judge - 4344

Review

  • 일단 평균을 먼저 구하기
  • 배열 요소들이 평균보다 크면 count 증가
  • count / m * 100 값 출력
  • 푸는 데에 10분 입력 부분 고치는 데에 1시간 걸렸다
  • 자바로 형변환하는 게 아직 어색하다
  • 입력 받는 건 아직도 어렵다
  • 쉬운 문제인 줄 알았는데 여러모로 반성하게 되는 문제

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double arr[];
int count, m;
double res, sum, avg;

for(int i = 0; i < n; i++) {
m = sc.nextInt();
arr = new double[m];

sum = 0;
count = 0;
res = 0;

for(int j = 0; j < m; j++) {
arr[j] = sc.nextInt();
sum += arr[j];
}

avg = sum / m;

for(int k = 0; k < arr.length; k++) {
if(avg < arr[k]) {
count++;
}
}

res = (double) count / m * 100;
System.out.printf("%.3f", res);
System.out.println("%");
}

}

}