24723번: 녹색거탑

Naver D2를 아시나요? D2는 For Developers, By Developers의 약자로, 개발자들을 위해 개발자들이 직접 만들어 가고 있는 네이버 개발자 지원 프로그램입니다. 네이버가 축적한 기술과 지식을 공유하고, 외

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
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 i = Integer.parseInt(br.readLine());
        bw.write((int)(Math.pow(2, i))+"");
 
        bw.flush();
        bw.close();
 
    }
}
 
 

🤔 해설

1. Math.pow(2, i)

    - 2의 i승

 

😮  외의 풀이

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
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 sum = 1;
        for (int i = 0; i < N; i++) {
            sum *= 2;
        }
 
        bw.write(sum + "");
 
        bw.flush();
        bw.close();
    }
}
 
 

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[백준 알고리즘] 백준 24723번 녹색거탑 자바(JAVA)

츄르사려고 코딩하는 코집사입니다. 1. [백준 알고리즘] 백준 24723번 녹색거탑 자바(JAVA) 1) 문제번호 : 24723번 2) 문제 출처 https://www.acmicpc.net/problem/24723 24723번: 녹색거탑 Naver D2를 아시나요? D2는 For

yongku.tistory.com

 

 

15439번: 베라의 패션

베라는 상의 N 벌과 하의 N 벌이 있다. i 번째 상의와 i 번째 하의는 모두 색상 i를 가진다. N 개의 색상은 모두 서로 다르다. 상의와 하의가 서로 다른 색상인 조합은 총 몇 가지일까?

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
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 i = Integer.parseInt(br.readLine());
        bw.write((i*(i-1))+"");
 
        bw.flush();
        bw.close();
 
    }
}
 
 
 

🤔 해설

1. i * (i - 1)

    - 상의와 하의의 색깔이 달라야함

 

😮 이 외의 풀이

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
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;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (i != j)
                    cnt++;
            }
        }
 
        bw.write(cnt + "");
 
        bw.flush();
        bw.close();
    }
}
 
 

 

 

 

🔗 소스 코드
GitHub

 

 

1269번: 대칭 차집합

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어

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
45
46
47
48
49
50
51
52
53
54
55
56
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
 
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));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        Set<Integer> set1 = new TreeSet<>();
        StringTokenizer stN = new StringTokenizer(br.readLine());
        while (N-- > 0) {
            set1.add(Integer.parseInt(stN.nextToken()));
        }
 
        Set<Integer> set2 = new TreeSet<>();
        StringTokenizer stM = new StringTokenizer(br.readLine());
        while (M-- > 0) {
            set2.add(Integer.parseInt(stM.nextToken()));
        }
 
        int A = return_size(set1, set2);
        int B = return_size(set2, set1);
 
        bw.write((A + B) + "");
 
        bw.flush();
        bw.close();
 
    }
 
    public static int return_size(Set<Integer> set1, Set<Integer> set2) {
        int cnt = 0;
        for (int i : set2) {
            if (!set1.contains(i)) {
                cnt++;
            }
 
        }
 
        return cnt;
    }
 
}
 
 

🤔 해설

1. set1.add(Integer.parseInt(stN.nextToken()));

    - 첫 번째 입력값을 set1에 저장

 

2. set2.add(Integer.parseInt(stM.nextToken()));

    - 두 번째 입력값을 set2에 저장

 

3. if (!set1.contains(i)) { cnt++; }

    - set2 요소 값이 set1에 있을 경우, cnt 증가 후 return

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
 
public class Main {
 
    static StringTokenizer st;
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        st = new StringTokenizer(br.readLine());
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < N; i++) {
            set.add(Integer.valueOf(st.nextToken()));
        }
 
        st = new StringTokenizer(br.readLine());
        int cnt = 0;
        for (int i = 0; i < M; i++) {
            int num = Integer.valueOf(st.nextToken());
            cnt = set.contains(num) ? cnt + 1 : cnt;
            set.add(num);
        }
 
        bw.write((set.size() - cnt) + "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 

1. static StringTokenizer st;

    - StringTokenizer 전역 변수 선언

 

2. cnt = set.contains(num) ? cnt + 1 : cnt;

    - cnt: 입력값1과 입력값2의 공통 요소 개수

 

3. bw.write((set.size() - cnt) + "");

    - 중복이 제거된 set에서 중복된 값인 cnt 차감

 

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
 
public class Main {
 
    static StringTokenizer st;
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        StringTokenizer st;
 
        st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        Set<Integer> setN = new HashSet<>();
        Set<Integer> setM = new HashSet<>();
 
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            setN.add(Integer.parseInt(st.nextToken()));
        }
 
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < M; i++) {
            setM.add(Integer.parseInt(st.nextToken()));
        }
 
        int cnt = 0;
        for (int i : setN) {
            cnt = !setM.contains(i) ? cnt + 1 : cnt;
        }
        for (int i : setM) {
            cnt = !setN.contains(i) ? cnt + 1 : cnt;
        }
 
        bw.write(cnt + "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[BOJ] 1269 - 대칭 차집합 JAVA

www.acmicpc.net/problem/1269 1269번: 대칭 차집합 첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모

codeung.tistory.com

 

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

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
45
46
47
48
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
 
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));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        Set<String> set = new HashSet<>();
        for (int i = 0; i < N; i++) {
            set.add(br.readLine());
        }
 
        int cnt = 0;
        Set<String> result = new TreeSet<>();
        while (M-- > 0) {
            String s = br.readLine();
            if (set.contains(s)) {
                cnt++;
                result.add(s);
            }
        }
 
        bw.write(cnt + "\n");
        for(String s : result) {
            bw.write(s+"\n");
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 

🤔 해설

1. Set<String> set = new HashSet<>();

   - 들은 적 없는 사람을 set에 저장

 

2. if (set.contains(s)) { ... }

    - 본적도 없는 사람이 set(들은 적 없는 사람)에 존재 할 경우,

        - cnt + 1 && result에 추가

    - Set<String> result = new TreeSet<>();

        - 사전순 정렬을 위해 Treeset 활용

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
 
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));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        Map<String, Boolean> map = new HashMap<>();
 
        for (int i = 0; i < N; i++) {
            map.put(br.readLine(), false);
        }
 
        while (M-- > 0) {
            String s = br.readLine();
            if (map.containsKey(s)) {
                map.replace(s, true);
            }
        }
 
        Set<String> set = new TreeSet<>();
 
        for (String s : map.keySet()) {
            if (map.get(s)) {
                set.add(s);
            }
        }
 
        StringBuilder sb = new StringBuilder();
        
        sb.append(set.size()).append("\n");
        
        for (String s : set) {
            sb.append(s).append("\n");
        }
 
        bw.write(sb.toString());
 
        bw.flush();
        bw.close();
    }
}
 
 

- HashMap + TreeSet 사용

 

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
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
 
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));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 
        Map<String, Boolean> map = new HashMap<>();
 
        for (int i = 0; i < N; i++) {
            map.put(br.readLine(), false);
        }
 
        while (M-- > 0) {
            String s = br.readLine();
            if (map.containsKey(s)) {
                map.put(s, true);
            }
        }
 
        List<String> list = new ArrayList<>();
 
        for (String s : map.keySet()) {
            if (map.get(s)) {
                list.add(s);
            }
        }
 
        StringBuilder sb = new StringBuilder();
 
        sb.append(list.size()).append("\n");
 
        Collections.sort(list);
 
        for (String s : list) {
            sb.append(s).append("\n");
        }
 
        bw.write(sb.toString());
 
        bw.flush();
        bw.close();
    }
}
 
 

- HashMap + ArrayList 사용

 

 

 

🔗 소스 코드
GitHub

 

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
 
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());
 
        Queue<Integer> queue = new LinkedList<>();
 
        for (int i = 1; i <= N; i++) {
            queue.add(i);
        }
 
        while (queue.size() > 1) {
            queue.remove();
            queue.add(queue.poll());
        }
 
        bw.write(queue.peek().toString());
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 

🤔 해설

1. for (int i = 1; i <= N; i++) { ... }

    - 1~N까지 queue에 입력

 

2. while (queue.size() > 1) { ... }

    - 최종으로 값이 1개 남을 때까지 반복문 진행

    - queue.remove();

        - 선입선출에 의해 첫번째 입력값 제거

    - queue.add(queue.poll());

        - 선입선출에 의해 첫번째 입력값 제거 후 마지막에 입력

 

* remove(): 큐가 비어있을 때 호출 시, NoSuchElementException 발생

  poll(): 큐가 비어있을 때 호출 시, 예외를 발생시키지 않고 null 반환

 

3. bw.write(queue.peek().toString());

    - 최종으로 남은 값 출력

 

😮 이 외의 풀이

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 N = Integer.parseInt(br.readLine());
 
        int[] iQueue = new int[N * 2];
 
        for (int i = 1; i <= N; i++) {
            iQueue[i] = i;
        }
 
        int idx_first = 1;
        int idx_last = N;
        while (N-- > 1) {
            idx_first++;
            idx_last++;
            iQueue[idx_last] = iQueue[idx_first];
            idx_first++;
        }
 
        bw.write(iQueue[idx_first] + "");
 
        bw.flush();
        bw.close();
 
    }
}
 
 

1. int[] iQueue = new int[N * 2];

    - 배열: 1부터 시작

    - 배열 삭제를 구현하지 않고, 마지막 요소의 뒤이어 추가 예정

        - 최종 1개는 출력만 하면되므로 2N-1이 될 수 있지만, 인덱스를 1부터 시작하므로 필요한 배열 공간은 2N

 

2. while (N-- > 1) { ... }

    - idx_first++, idx_last++

        - 2번째 값을 맨 마지막의 다음 칸에 입력해야하므로 1씩 증가

    - idx_first++

        - 삭제 후 맨 처음값을 맨 뒤로 옮겼으므로, 그 다음 값은 단순 삭제 대상이므로 idx_first 1 증가

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[백준] 2164번 : 카드2 - JAVA [자바]

www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있

st-lab.tistory.com