본문 바로가기
코딩/백준-자바

[자바] 백준 1244번: 스위치 켜고 끄기

by 철없는민물장어 2023. 2. 25.
728x90
반응형

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

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class P1244 {

	static int n;
	static int[] arr;

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		arr = new int[n + 1]; // 스위치의 상태를 저장할 배열

		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 1; i <= n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		int studentNum = Integer.parseInt(br.readLine());

		for (int i = 0; i < studentNum; i++) {
			st = new StringTokenizer(br.readLine());
			int gender = Integer.parseInt(st.nextToken());
			int num = Integer.parseInt(st.nextToken());

			if (gender == 1) {
				boy(num);

			} else if (gender == 2) {
				// 여학생
				girl(num);
			}
		}

		for (int i = 1; i <= n; i++) {
			bw.append(arr[i] + " ");
			if(i%20==0) {
				bw.append("\n");
			}
		}
		bw.flush();
		br.close();
		bw.close();
	}

	static void toggle(int idx) {
		if (arr[idx] == 1)
			arr[idx] = 0;
		else
			arr[idx] = 1;
	}

	static void boy(int num) {
		for (int i = num; i <= n; i += num) {
			toggle(i);
		}
	}

	static void girl(int num) {
		toggle(num);
		int left = num - 1;
		int right = num + 1;
		while (left >= 1 && right <= n) {
			if (arr[left] == arr[right]) {
				toggle(left);
				toggle(right);
				left--;
				right++;
			} else {
				break;
			}
		}
	}
}

남학생, 여학생의 경우를 각각 함수 boy(), girl()로 만들었다.

 

문제에서 언급한 조건대로 다 구현하면 되는데,

arr에 스위치들의 정보를 저장해서 사용했다.

이 때 arr[0]은 사용하지 않고 1번인덱스부터 사용했는데,

0번인덱스를 사용하지 않는다는것을 간과하고, 여학생 girl()함수를 작성하다가 오류가 났다.

while (left >= 1 && right <= n) {

이런 조건문이 있었는데, left>=0으로 적으면 사용하지 않는 0번인덱스까지 보게되니 left>=1로 했어야됐다.

728x90
반응형

댓글