본문 바로가기
알고리즘

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

by Kwoncorin 2021. 9. 17.
728x90

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

1. 문제 설명

 

문제

  • 1부터 연속적으로 번호가 붙어있는 스위치들이 있다.
  • 스위치는 켜져 있거나 '1', 꺼져 있는 상태 '0'이다.
  • 학생 몇명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다.
  • 학생들은 자신의 성별과 받은 수에 따라 스위치를 조작한다.
  • 남학생의 경우 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다.
  • 여학생의 경우 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다.
  • 스위치들의 마지막 상태를 출력하라.

조건

  • 스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다.
  • 스위치 개수와 학생 수는 100 이하인 양의 정수

 

2. 풀이

 

 

문제 그대로 구현하면 된다.

 

스위치의 개수와 학생의 수가 100 이하이므로 완전 탐색을 하더라도 최대 100*100으로 충분히 문제 풀이가 가능하다.

 

스위치를 전환할 때는 "1-스위치"의 식을 통해서 스위치의 상태를 전환했다.

 

 

*로직

1. 남학생의 경우 자기가 받은 수의 배수일때 스위치 전환 (1-스위치)

2. 여학생의 경우 자기가 받은 수를 중심으로 움직이면서 좌우가 대칭인지 확인하고, 대칭이면 스위치 전환(1-스위치) 아닐 경우 탐색 종료

3. 한 줄에 20개씩 스위치 출력

 

3. 코드

// JAVA 11 , 메모리 : 14244KB, 시간 : 132ms

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

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int switchNum,studentNum,sep,swit;
        int[] status;

        switchNum = Integer.parseInt(br.readLine());
        status = new int[switchNum+1];

        StringTokenizer st = new StringTokenizer(br.readLine());

        for (int x = 1; x <= switchNum; x++) {
            status[x] = Integer.parseInt(st.nextToken());
        }

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

        for (int x = 0; x < studentNum; x++) {
            st = new StringTokenizer(br.readLine());

            sep = Integer.parseInt(st.nextToken());
            swit = Integer.parseInt(st.nextToken());

            if(sep==1){
                // 남학생

                for(int y=swit;y<=switchNum;y+=swit){
                    status[y] = 1 - status[y];
                }

            }else{
                // 여학생

                status[swit] = 1 - status[swit];

                for(int y=1;swit-y>0 && swit+y<=switchNum;y++){
                    if (status[swit - y] == status[swit + y]) {
                        status[swit - y] = 1 - status[swit - y];
                        status[swit + y] = 1 - status[swit + y];
                    } else {
                        break;
                    }
                }
            }
        }

        for (int x = 1; x <= switchNum; x++) {
            if(x!=1 && x%20==1)
                bw.write("\n");
            bw.write(String.valueOf(status[x]) + " ");
        }

        bw.flush();


    }


}
728x90

'알고리즘' 카테고리의 다른 글

[JAVA]백준 6118번: 숨바꼭질  (0) 2021.09.17
[JAVA]백준 2841번: 외계인의 기타 연주  (0) 2021.09.17
[JAVA]백준 3184번: 양  (0) 2021.09.16
[JAVA]백준 1743번: 음식물 피하기  (0) 2021.09.16
[JAVA]백준 10775번: 공항  (0) 2021.09.10