투로드
Coder ToLoad
투로드
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 알고리즘
  • CS
  • GITHUB
  • 태그
  • 분류 전체보기 (69)
    • Toy Project (0)
      • EternalSNS (0)
    • Algorithm (46)
      • BaekJoon (38)
      • Programmers (7)
      • Code Tree (1)
    • Computer Science (13)
      • JAVA (7)
      • DataBase (4)
    • Backend (7)
      • Spring (2)
      • JPA (2)
      • Django (3)
    • Mobile (2)
      • Android (2)
    • Unity (1)

인기 글

최근 글

hELLO · Designed By 정상우.
투로드

Coder ToLoad

Algorithm/BaekJoon

[JAVA] 백준 16567 : 바이너리 왕국

2021. 8. 24. 00:26
문제
 

16567번: 바이너리 왕국

첫째 줄에 바이너리 길의 칸의 개수 N, 시련의 개수 M이 주어진다. (1 ≤ N, M ≤ 1,000,000) 둘째 줄에 N개의 현재 바이너리 길의 상태가 주어진다. 그다음 M개의 줄에 걸쳐서 시련이 주어진다. 이때 0

www.acmicpc.net

 

해결 방법

간단한 문제인데 조건을 빼먹어서 오래 걸렸습니다.

처음에 바닥의 상태가 주어질 때 연속으로 더러운지 아닌지 확인하면서 카운트를 증가시켜줘야합니다.

 

다음에 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
    'Algorithm/BaekJoon' 카테고리의 다른 글
    • [JAVA] 백준 1194 : 달이 차오른다, 가자.
    • [JAVA] 백준 2636 : 치즈
    • [JAVA] 백준 1637 : 날카로운 눈
    • [JAVA] 백준 13913 : 숨바꼭질 4
    투로드
    투로드
    훌륭한 프로그래머가 되어가는 과정을 담아보는 중입니다.

    티스토리툴바