1436번: 영화감독 숌

666은 종말을 나타내는 수라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워

www.acmicpc.net

 

Language: 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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int N = Integer.parseInt(br.readLine());
 
        int i = 0;
        int cnt = 0;
        for (i = 666; cnt != N; i++) {
            if (String.valueOf(i).contains("666")) {
                cnt++;
            }
        }
 
        bw.write((i - 1+ "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 
1. for 반복문
  - 666부터 시작해서 숫자를 1씩 증가시키면서 확인
  - String.valueOf 후, contains로 666이 있는지 검사
  - cnt==N일 경우에 i는 이미 1 증가했으므로 최종 출력 시에는 -1 계산
 
 
 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

 

Language: 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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int n = Integer.parseInt(br.readLine());
        
        int sum = 0;
        int count = 0;
        for(int i=1;;i++) {
            sum += i;
            count ++;
            if(sum>n) {
                break;
            }
        }
 
        List<String> fractionList = new ArrayList<>();
 
        for (int i = 2; i <= count; i++) {
            for (int j = 1; (i-j) >0; j++) {
                fractionList.add(j + "/" + (i-j));
            }
        }            
 
        bw.write(fractionList.get(n-1+ "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🚨 fractionList를 만들기 위해 count전까지의 모든 분수를 생성하므로 메모리 초과 발생

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int N = Integer.parseInt(br.readLine());
 
        int cnt = 0;
 
        int i = 1;
        int j = 1;
        Loop: for (i = 1;; i++) {
            for (j = 1; j <= i; j++) {
                cnt++;
                if (cnt == N) {
                    break Loop;
                }
            }
        }
 
        if (i % 2 == 0) {
            bw.write(j + "/" + (i + 1 - j));
        } else {
            bw.write((i + 1 - j) + "/" + j);
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

규칙을 찾아서 분수를 반환

대각선 n번째 줄 분자 + 분모 순번
1 2 1
2 3 2 3
3 4 4 5 6
4 5 7 8 9 10
5 6 11 12 13 14 15
6 7 16 17 18 19 20 21

1. 대각선의 몇번째 줄에 있는지 확인

예시1: 10번 → 4번째 줄에 위치

예시2: 5번 3번째 줄에 위치

2. 대각선에서 몇 번째 순서인지 확인

예시1: 10번 4번째 줄의 4번째 순서에 위치

예시2: 5번 3번째 줄의 2번째 순서에 위치

3. 경우의 수에 따라 분수 출력

대각선 줄이 짝수일 경우, 순번이 커질수록 분자 ↑ && 분모 ↓

대각선 줄이 홀수일 경우, 순번이 커질수록 분자 ↓ && 분모 ↑

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

[백준] 1193번 : 분수찾기 - JAVA [자바]

https://www.acmicpc.net/problem/1193 1193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net 문제 분수를 찾는 것 자체는 그렇게 어려운 문제는 아니다. 다만 순서에 유의하여야 한다. 2가

st-lab.tistory.com

 

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

Language: 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.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        List<Integer> intList = new ArrayList<>();
 
        while (cnt-- > 0) {
            intList.add(Integer.parseInt(br.readLine()));
        }
 
        Collections.sort(intList);
 
        for (int i = 0; i < intList.size(); i++) {
            if (i == intList.size() - 1) {
                bw.write(intList.get(i) + "");
            } else {
                bw.write(intList.get(i) + "\n");
            }
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🚨 List를 Collections 함수 sort로 정렬 시, 메모리 초과 발생

 

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        long cnt = Integer.parseInt(br.readLine());
 
        List<Integer> intList = new ArrayList<>();
 
        while (cnt-- > 0) {
            intList.add(Integer.parseInt(br.readLine()));
        }
 
        intList.sort(Comparator.naturalOrder());
          
        for (int i = 0; i < intList.size(); i++) {
            if (i == intList.size() - 1) {
                bw.write(intList.get(i) + "");
            } else {
                bw.write(intList.get(i) + "\n");
            }
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🚨 List를 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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        int[] intArr = new int[cnt];
 
        for(int i=0; i<cnt; i++) {
            intArr[i] = Integer.parseInt(br.readLine());
        }
 
        Arrays.sort(intArr);
        
        for(int i : intArr) {
            bw.write(i+"\n");
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🤔 해설

- int[]를 선언해서 Arrays 라이브러리에 sort 메서드 사용

 

⭐ ArrayList와 int[] 차이

1. ArrayList

    - 가변적 크기

    - 데이터 추가, 삭제 시, 메모리를 재할당하므로 속도가 Array보다 느림

    - 다차원 불가

2. Array(int[])

    - 고정된 크기

    - 초기화 시, 메모리에 할당되어 ArrayList보다 속도가 빠름

    - 다차원 가능(int[][])

 

Integer는 Wrapper class로 객체가 기본 데이터 유형을 래핑하거나 포함하므로 int형에 비해 큰 저장 공간이 필요

→ Integer에서 int로 변경 시, 메모리 점유가 낮아져 초과 문제를 해결할 수 있음

 

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        StringBuffer sb = new StringBuffer();
 
        int[] iArr = new int[10001];
 
        for (int i = 0; i < cnt; i++) {
            iArr[Integer.parseInt(br.readLine())]++;
        }
 
        for (int i = 0; i < iArr.length; i++) {
            if (iArr[i] > 0) {
                for (int j = 0; j < iArr[i]; j++) {
                    sb.append(i).append("\n");
                }
            }
        }
 
        bw.write(sb + "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

- 계수 정렬(Counting Sort) 사용

    - if 조건문: 입력값이 있는 경우에만 출력되도록 설정

    - 내부 for 반복문: 중복값이 존재하므로 Count된 횟수만큼 출력되도록 설정

 

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        StringBuffer sb = new StringBuffer();
 
        int[] iArr = new int[10001];
 
        for (int i = 0; i < cnt; i++) {
            iArr[Integer.parseInt(br.readLine())]++;
        }
 
        for (int i = 0; i < iArr.length; i++) {
            while (iArr[i]-- > 0) {
                sb.append(i).append("\n");
            }
        }
 
        bw.write(sb + "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

- 계수 정렬(Counting Sort) 사용2

    - if 조건문과 내부 for 반복문을 while문으로 교체하여 코드 간결화

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

Array와 ArrayList의 차이

배열(Array)과 ArrayList의 차이점 Array ArrayList 사이즈 초기화시 고정 int[] arr = new int[3]; 초기화시 사이즈를 표시하지 않음. 크기가 가변적임 ArrayList arrList = new ArrayList(); 속도 초기화시 메모리에 할당

dev-coco.tistory.com

 

[백준] 10989번 : 수 정렬하기 3 - JAVA [자바]

www.acmicpc.net/problem/10989 10989번: 수 정렬하기 3 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. www.acmic

st-lab.tistory.com

 

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

Language: 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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        List<Integer> intList = new ArrayList<>();
 
        while (cnt-- > 0) {
            intList.add(Integer.parseInt(br.readLine()));
        }
 
        Collections.sort(intList);
 
        for (int i = 0; i < intList.size(); i++) {
            if (i == intList.size() - 1) {
                bw.write(intList.get(i) + "");
            } else {
                bw.write(intList.get(i) + "\n");
            }
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🤔 해설

1. while 반복문

    - 입력될 숫자 개수를 1씩 감소시키면서 반복문 진행

2. Collections Lib

    - ArrayList를 사용하여 Collections 라이브러리에 있는 sort 사용

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        StringBuffer sb = new StringBuffer();
 
        boolean[] bArr = new boolean[2000001];
 
        for (int i = 0; i < cnt; i++) {
            bArr[Integer.parseInt(br.readLine()) + 1000000= true;
        }
 
        for (int i = 0; i < bArr.length; i++) {
            if (bArr[i]) {
                sb.append(i - 1000000).append("\n");
            }
        }
 
        bw.write(sb + "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

1. boolean[]

    - 입력값의 범위만큼 boolean[] 생성

    - 중복값이 없으므로 값이 입력될 경우, false → true 변경

2. StringBuffer

    - 입력된 값의 boolean[]값이 true이므로 true일 경우에만 sb에 append

    - 배열 위치 지정 시, 절대값을 양수화하기위해 +1,000,000 했으므로 append 시에는 다시 실제 숫자를 반영하기 위해 -1,000,000 처리

 

⭐ 계수 정렬을 활용하면, 처리 속도가 1/2배가 된다!

* 계수 정렬(Counting Sort): 데이터 값을 직접 비교하지 않고, 단순하게 각 숫자가 몇 개 있는지 개수를 세어 저장한 후에 정렬하는 알고리즘

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

[Java] ArrayList 정렬하기 (오름차순, 내림차순, 사용자 정의)

Collections.sort() 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 List.sort() - Java 8 이후 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 사

hianna.tistory.com

 

[백준] 2751번 : 수 정렬하기 2 - JAVA [자바]

www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.

st-lab.tistory.com

 

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

Language: 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.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int kg = Integer.parseInt(br.readLine());
 
        int i = 0;
        int j = 0;
 
        boolean b = false;
 
        Loop: for (i = 0; i <= kg / 3; i++) {
            for (j = 0; j <= kg / 5; j++) {
                if (3 * i + 5 * j == kg) {
                    b = true;
                    break Loop;
                }
            }
        }
 
        if (b) {
            bw.write((i + j) + "");
        } else {
            bw.write("-1");
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🤔 해설

1. 일차방정식

    - i와 j의 범위를 줄이기 위해 입력값/3, 입력값/5로 조정

    - boolean 타입의 변수를 활용하여, 해가 있을 경우와 없을 경우 구분

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int kg = Integer.parseInt(br.readLine());
 
        int cnt = 0;
        while (true) {
            if (kg % 5 == 0) {
                bw.write(((kg / 5+ cnt) + "");
                break;
            } else if (kg < 0) {
                bw.write("-1");
                break;
            }
            kg -= 3;
            cnt++;
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

1. if 조건문

    - 최대한 5kg을 활용하기 위해 while 반복문 안에서 if 조건문을 첫번째로 검사

    - 3kg을 이용할 때마다, cnt를 추가하여 총 봉지 개수 변경

2. else if 조건문

    - 3kg에 담고도 남을 경우, 즉 정확한 kg를 맞출 수 없는 경우 -1 출력

3. cnt

    - 5kg 봉지 개수는 나눗셈의 몫을, 3kg 봉지 개수는 cnt을 활용

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

백준 2839번 java 자바 설탕배달 (수학 1)

설탕은 3kg봉지 5kg봉지 가 있는데 n(입력)kg를 배달해야 하고 가장 적은 봉지를 들고가야 하는 알고리즘이다. 뭐 간단하게 5kg로 최대한 들고 가고 남은 것을 3kg로 들고가면 된다고 생각이 된다. 뭐

hellodoor.tistory.com