[백준 - 실버4]스위치 켜고 끄기 - Java

iamjinseo·2023년 2월 7일
0

문제풀이-Java

목록 보기
15/53

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


문제 설명

너무 길어


풀이

package silver4;

import java.util.*;
import java.io.*;

public class B1244_스위치켜고끄기 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		// 스위치 입력받기
		int N = Integer.parseInt(br.readLine()); // 스위치 개수
		StringTokenizer st = new StringTokenizer(br.readLine());
		int[] ss = new int[N];
		for (int i = 0; i < N; i++) {
			ss[i] = Integer.parseInt(st.nextToken());
		}

		// 학생 입력받기
		int students = Integer.parseInt(br.readLine()); // 학생수
		for (int i = 0; i < students; i++) {
			st = new StringTokenizer(br.readLine()); // 성별과 스위치 입력
			int gender = Integer.parseInt(st.nextToken()); // 성별
			int s = Integer.parseInt(st.nextToken()); // 스위치

			if (gender == 1) { // 남자
				for (int j = s - 1; j < N; j += s)
					ss[j] = ss[j] == 0 ? 1 : 0; // 스위치 상태 바꾸기
			} else { // 여자
				int idx1 = s-1, idx2 = s-1; // 변경가능 스위치 인덱스 1,2
				while (true) { // 범위 확장하며 대칭검사
					int n1 = idx1 - 1; // 변경가능 스위치 인덱스로부터 1씩 범위 넓히기
					int n2 = idx2 + 1;

					//범위 밖이거나 대칭 아닐때 
					if (n1<0 || n2>=N || ss[n1] != ss[n2]) { 
						for (int j = idx1; j <= idx2; j++) // 가능 범위까지의 상태 바꾸기
							ss[j] = ss[j] == 0 ? 1 : 0; // 스위치 상태 바꾸기
						break;
					} else { // 대칭임
						// 변경가능 스위치 인덱스 재조정
						idx1 = n1;
						idx2 = n2;
					}
				}
			} // 여자 남자 검사 끝

		} /// 테스트케이스 끝
		for (int i = 1; i <= N; i++) {
			sb.append(ss[i-1]).append(" ");
			if(i%20==0) sb.append("\n");
		}
		System.out.println(sb);
	}
}
  • 만약에 남자면
    - for from i-1 to 배열끝 do i+i-1
    - 상태바꾸기
  • 만약 여자면
    변경가능 스위치 인덱스1, 2 = 초기인덱스, 초기인덱스
    현재위치에서 -1, +1 대칭 검사. 배열 벗어나면 안됨
    다름 -> 변경가능 스위치 인덱스 1,2 범위의 스위치 바꾸기
    같음 -> 변경 가능 스위치 인덱스1, 2, 저장. -> 무한반복

결과

후기

재귀로 풀 수 있는데 안함..

profile
일단 뭐라도 해보는 중

0개의 댓글