[2138번] 전구와 스위치 ( 그리디, 규칙 찾기, 문자열로 받자, 타입 일치시키기 )

Loopy·2024년 1월 13일
0

코테 문제들

목록 보기
82/113

이 문제는 0과 1이 서로 같은지 비교해주어야 하므로 char로 입력받자.
참고 블로그


✅ 규칙

그리디 (탐욕법, greedy)
하나의 규칙을 적용해 최선의 답을 도출해낸다.
규칙을 찾아보자.

1번 스위치가 바뀌냐 안 바뀌냐에 따라 2가지로 나누어주고 시작한다.
이런 그리디 풀 때 규칙 어떻게 찾지????
문제마다 다 다른데????


✅ 코드
0과 1을 바꿀 때 항상 !!!!char이면 '0' '1'로 써줘야 한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	static int N, cnt1, cnt2;
	static char[] AInput;
	static char[] BInput;
	static char[] Output;

	static int[] dx = {-1, 0, 1};

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());

		String s1 = br.readLine();
		String s2 = br.readLine();

		AInput = s1.toCharArray();
		BInput = s1.toCharArray();
		Output = s2.toCharArray();

		int result = Integer.MAX_VALUE;

		changeBulb(AInput, 0);
		cnt1++;

		for (int i = 1; i < N; i++) {
			if (AInput[i - 1] != Output[i - 1]) {
				changeBulb(AInput, i);
				cnt1++;
			}
			if (BInput[i - 1] != Output[i - 1]) {
				changeBulb(BInput, i);
				cnt2++;
			}
		}

		if (AInput[N - 1] == Output[N - 1]) {
			result = Math.min(result, cnt1);
		}


		if (BInput[N - 1] == Output[N - 1]) {
			result = Math.min(result, cnt2);
		}

		if (result == Integer.MAX_VALUE) {
			System.out.println(-1);
		} else {
			System.out.println(result);
		}


	}

	private static void changeBulb(char[] input, int index) {
		for (int k = 0; k < 3; k++) {
			int nowX = index + dx[k];
			if (nowX >= 0 && nowX < N) {
				if (input[nowX] == '0') {
					input[nowX] = '1';
				} else {
					input[nowX] = '0';
				}
			}
		}
	}


}

profile
잔망루피의 알쓸코딩

0개의 댓글