/ BOJ

BOJ_1244_스위치켜고끄기_JAVA

문제 : 스위치켜고끄기

링크 : BOJ_1244_스위치켜고끄기

접근 방식

문제에서 말하는대로 구현하면 되는 시뮬레이션 문제이다.

입력되는 값은 다음과 같다.

첫 줄에 스위치의 개수가 주어진다.

두번째 줄에 각 스위치의 상태, 만약 스위치의 개수가 8이라면 1 0 1 0 1 0 1 0 과 같은 방식이다.

세번째 줄에는 학생 수가 주어진다.

네번째 줄부터 마지막 줄까지는 각 학생의 성별, 받은 수가 주어진다. 남학생이고 3을 받았다면, 1 3 과 같은 방식이다.

출력은 스위치를 한 줄에 20개씩 출력해야한다.

입출력은 위와 같고, 문제는 다음과 같은 방식으로 푼다.

만약 학생이 남학생이라면, 학생에게 주어지는 수의 배수가 되는 스위치 번호를 변동시킨다. 변동의 의미는 1이면 0으로, 0이면 1로 바꾸는 것을 의미한다.

만약 학생이 여학생이라면, 학생에게 주어지는 수를 중심으로 좌우 스위치를 체크해서, 좌우가 대칭인 가장 많은 스위치를 포함하는 구간을 찾아, 그 구간에 속한 스위치를 변동시킨다.

문제에서 주는 정보는 이정도이다. 위 내용을 구현하면 된다.

풀이 방법

  1. 스위치 개수를 읽어들여 스위치 정보를 담을 배열을 생성하고, 각 스위치의 상태를 저장한다.

  2. 학생 수를 입력받아, 학생 수만큼 반복하는 반복문을 돌린다.

  3. 학생의 정보, 성별과 숫자를 변수에 저장한다.

  4. 남학생일 경우, 주어진 숫자로 스위치 번호를 탐색하며 나머지 연산하여, 나누어 떨어지는 경우(나머지가 0인 경우) 스위치를 변동시킨다. 나는 스위치를 정수형으로 선언했기 때문에, 기존 수에서 +1하여 2로 나머지 연산해준다.

  5. 여학생일 경우에는 내부 반복문으로 while를 써준다.

  6. 여학생인 경우, 주어진 숫자를 기준으로 각각 좌표를 +,- 해주며 두 값이 같은지를 계속해서 비교한다.

  7. 두 값이 달라지는 순간이 오면, 반복문을 나가고, 좌표값을 한 칸씩 안쪽으로 당겨준다. -해주던 값은 1 더해주고, +해주던 값은 1 빼준다.

    • 한 좌표에서 +한 좌표까지 반복하며 스위치를 변동시켜준다.
  8. 모든 변동이 끝난 후, 스트링 빌더를 이용하여 20개의 수가 출력될 때마다 개행을 해주어 출력하도록 한다.

소스 코드


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

public class BOJ_1244_스위치켜고끄기 {

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

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(in.readLine());

		int[] arr = new int[N + 1];

		StringTokenizer st = new StringTokenizer(in.readLine(), " ");

		for (int i = 1; i <= N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		int S = Integer.parseInt(in.readLine());

		for (int i = 0; i < S; i++) {
			st = new StringTokenizer(in.readLine(), " ");
			int gender = Integer.parseInt(st.nextToken());
			int num = Integer.parseInt(st.nextToken());
			// 남자일때
			if (gender == 1) {
				for (int j = 1; j <= N; j++) {
					if (j % num == 0) {
						arr[j] = (arr[j] + 1) % 2;
					}
				}
				// 여자일때
			} else {
//				arr[num] = (arr[num] + 1) % 2;
				int x = num;
				int y = num;

				while (true) {
					if (x > 0 && y <= N && arr[x] == arr[y]) {
						x--;
						y++;
					} else {
						break;
					}
				}
				x++;
				y--;
				for(int j=x;j<=y;j++) {
					arr[j] = (arr[j]+1)%2;
				}
			}
		}

		StringBuilder sb = new StringBuilder();
		sb.append(arr[1]).append(" ");
		for (int i = 2; i <= N; i++) {
			if (i % 20 == 1) {
				sb.setLength(sb.length() - 1);
				sb.append("\n");
			}
			sb.append(arr[i]).append(" ");
		}
		sb.setLength(sb.length() - 1);
		System.out.print(sb);
	}

}