코테/백준

[백준/JAVA] 2138번: 전구와 스위치

imname1am 2024. 7. 11. 23:50
반응형

📖 문제

https://www.acmicpc.net/problem/2138

 

 

 

💡  풀이 방식

• 그리디

- 스위치의 성격 상(on/off) 매 순간의 선택이 최적의 선택이 될 수 있으므로 그리디 사용 가능.

 

1. 첫 번째 전구의 스위치를 [켜는 / 끄는] 경우 모두 고려해야 한다.

2. 2~N번째 전구까지 반복하며, i-1번째 인덱스의 현재값 != i-1번째 인덱스의 기댓값이면 스위치를 켠다.

3. 1번의 2가지 경우 모두 불가능하다면 -1을 출력하고, 아니라면 2개 중 최솟값을 출력한다.

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    static int N;
    static boolean[] goalArr;
    static int min = Integer.MAX_VALUE;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        N = Integer.parseInt(br.readLine());
        String now = br.readLine();
        String goal = br.readLine();
        
        boolean[] b1 = new boolean[N];  // 1번 전구 스위치 켠 상태
        boolean[] b2 = new boolean[N];  // 1번 전구 스위치 끈 상태
        goalArr = new boolean[N];
        
        for(int i = 0 ; i < N ; i++) {
            b1[i] = now.charAt(i) != '0';
            b2[i] = now.charAt(i) != '0';
            goalArr[i] = goal.charAt(i) != '0';
        }
        
        // 1번째 전구 스위치 사용하지 않고 진행
        greedy(10, b1);
        
        // 1번째 전구 스위치 사용하고 진행
        greedy(11, useSwitch(0, b2));
        
        System.out.println(min == Integer.MAX_VALUE ? -1 : min);
    }
    
    private static void greedy(int idx, int cnt, boolean[] b) {
        if(idx == N) {
            if(b[idx-1== goalArr[idx-1]) {
                min = Math.min(min, cnt);
            }
            return;
        }
        
        if(b[idx-1!= goalArr[idx-1])  // 같지 않으면 스위치 사용하기
            greedy(idx+1, cnt+1, useSwitch(idx, b));
        else    // 같으면 스위치 사용하지 않고 다음 인덱스로 넘어가기
            greedy(idx+1, cnt, b);
    }
    
    // 스위치 켜는 함수
    private static boolean[] useSwitch(int idx, boolean[] b) {
        for(int i = idx-1 ; i <= idx+1 ; i++) {
            if(0 <= i && i < N)
                b[i] = !b[i];
        }
        
        return b;
    }
}
cs

 

 

 

➕ 다른 풀이 방식

 

[백준 - 2138][Gold 5] - 전구와 스위치 (JAVA)

문제 링크https://www.acmicpc.net/problem/2138 문제N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 N개의 전구들의 현재 상태와 우리가

khnemu.tistory.com

 

 

[백준]2138: 전구와 스위치(java)

https://www.acmicpc.net/problem/2138 2138번: 전구와 스위치 N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1,

koguri.tistory.com

 

 


💦 어려웠던 점

- 그리디임을 캐치하는 것

- 해결 아이디어를 생각해 내는 것,,

 

 

🧐 새로 알게 된 내용

- 해결 아이디어,,

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[JAVA] 백준 알고리즘 2138번 (전구와 스위치)

문제 이번에 다뤄볼 문제는 2138번 문제 ' 전구와 스위치'입니다. 문제에서 연습해야 하는key-point는 그리디 알고리즘 입니다. 그리디 알고리즘(욕심쟁이 알고리즘, Greedy Algorithm)이란 "매 선택에서

colin-sh.tistory.com

 

[알고리즘] 백준 2138 전구와 스위치 Java

문제 정보플랫폼 : 백준분류 : 그리디 알고리즘난이도 : 실버2링크 : https://www.acmicpc.net/problem/2138풀이본인은 그리디 알고리즘과 DP에 약하다... 풀이를 쓰려면 내가 먼저 이해해야 하기 때문에, 문

velog.io

 

반응형