알고리즘/구현 & 그리디 & 브루트포스

[백준]JAVA - 1244번: 스위치 켜고 끄기

K.두부 2023. 3. 15. 14:22
반응형

1244번: 스위치 켜고 끄기 (acmicpc.net)

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

풀이

딱히 풀이라고 할 게 없는 문제다.

그냥 문제에서 시키는대로 해주면 된다.

 

번호가 주어졌을 때 남학생일 경우 번호의 배수에 해당하는 스위치 상태를 변경해주면 된다.

예를 들어 3이 주어졌다면 3, 6, 9, ··· 를 변경해준다.

 

여학생일 경우 번호의 양 옆 스위치 상태를 확인하고 서로 다를 때까지 비교해준다.

두 개의 스위치 값이 같다면 변경해주고, 다르면 탐색을 중단한다.

예를 들어 3이 주어졌다면 [2, 4], [1, 5], ··· 를 순서대로 비교 후에 변경, 다른 값이 나왔다면 그대로 중단시키면 된다.

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
		
        int N = Integer.parseInt(br.readLine()); // 스위치 개수
        int[] bulb = new int[N+1];
		
        st = new StringTokenizer(br.readLine());
        for (int i=1; i<=N; i++) {
            bulb[i] = Integer.parseInt(st.nextToken());
        }
		
        int studentCnt = Integer.parseInt(br.readLine()); // 학생 수
        for (int i=1; i<=studentCnt; i++) {
            st = new StringTokenizer(br.readLine());
			
            int gender = Integer.parseInt(st.nextToken()); // 1: 남학생  2: 여학생
            int number = Integer.parseInt(st.nextToken()); // 주어진 번호
			
            if (gender == 1) {
                for (int j=1; j<=N; j++) {
                    if (j%number == 0) {
                        bulb[j] = bulb[j] == 0 ? 1 : 0;
                    }
                }
            } else {
            	// 주어진 번호는 무조건 변경
                bulb[number] = bulb[number] == 0 ? 1 : 0;
                for (int j=1; j<=N/2; j++) {
                    int left = number - j;
                    int right = number + j;
					
                    // 범위를 벗어났다면 그대로 종료
                    if (right > N || left < 1) break;
                    
                    // 값이 같을 경우 변경, 다를 경우 종료
                    if (bulb[left] == bulb[right]) {
                        bulb[left] = bulb[left] == 0 ? 1 : 0;
                        bulb[right] = bulb[right] == 0 ? 1 : 0;
                    } else {
                        break;
                    }
                }
            }
        }
		
        // 20번째마다 다음 줄에 출력
        for (int i=1; i<=N; i++) {
            System.out.print(bulb[i] + " ");
            if (i % 20 == 0) System.out.println();
        }
    }
}

 

반응형