문제
해결 방법
간단한 문제인데 조건을 빼먹어서 오래 걸렸습니다.
처음에 바닥의 상태가 주어질 때 연속으로 더러운지 아닌지 확인하면서 카운트를 증가시켜줘야합니다.
다음에 M개의 명령이 주어질 때 0의 경우일 때는 카운트를 출력하고
1의 경우일 때는 총 4가지를 생각해야합니다.
1. index가 0일 때 자신의 다음 칸이 깨끗하다면 카운트를 1증가
2. index가 마지막일 때 자신의 이전 칸이 깨끗하다면 카운트를 1증가
3. 그 외의 경우에는 자신의 양쪽 칸이 깨끗하다면 카운트를 1증가
4. 자신의 양쪽 칸이 더럽다면 카운트를 1 감소
이 4가지 경우의 수만 생각하면 해결 할 수 있습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] status = new int[N];
st = new StringTokenizer(br.readLine());
// 초기 상태 확인
int cnt = 0;
boolean conti = false;
for (int i = 0; i < N; i++) {
status[i] = Integer.parseInt(st.nextToken());
if (status[i] == 1 && !conti) {
cnt++;
conti = true;
} else if (status[i] == 0) {
conti = false;
}
}
// 명령 확인
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int trial = Integer.parseInt(st.nextToken());
if (trial == 0) {
sb.append(cnt + "\n");
} else {
int index = Integer.parseInt(st.nextToken()) - 1;
if (status[index] == 1) continue;
else status[index] = 1;
if (index == 0) {
if (status[index + 1] == 0) cnt++;
} else if (index == N - 1) {
if (status[index - 1] == 0) cnt++;
} else {
if (status[index - 1] == 0 && status[index + 1] == 0) {
cnt++;
} else if (status[index - 1] == 1 && status[index + 1] == 1) {
cnt--;
}
}
}
}
System.out.println(sb);
}
}
'Algorithm > BaekJoon' 카테고리의 다른 글
[JAVA] 백준 1194 : 달이 차오른다, 가자. (0) | 2021.09.29 |
---|---|
[JAVA] 백준 2636 : 치즈 (0) | 2021.09.06 |
[JAVA] 백준 1637 : 날카로운 눈 (0) | 2021.08.01 |
[JAVA] 백준 13913 : 숨바꼭질 4 (0) | 2021.07.07 |
[JAVA] 백준 16946 : 벽 부수고 이동하기 4 (0) | 2021.06.02 |