안드 공부를 해볼까?

[Java] 백준 스위치 켜고 끄기 본문

알고리즘/백준

[Java] 백준 스위치 켜고 끄기

문바리 2022. 8. 20. 20:08
728x90

1. 문제분석

처음은 스위치의 개수와 정보를 주고 남학생과 여학생, 스위치의 위치가 주어진다.

남자는 쉽게 풀 수 있다. 만약 위치가 3이라면 3, 6, 9.. 이런식으로 스위치의 정보를 바꾼다.

 

반면 여자의 경우는 조금 생각을 해야한다.

테스트 케이스를 보자. 여자면서 3번 스위치가 주어졌다.

3번을 기준으로 왼쪽, 오른쪽 대칭을 확인한다. 만약 대칭이라면 변경한다.

또한 대칭이 아에 없다면 3번만 꺼주면 된다. 밑의 그림을 보고 확인하자.

여학생일때 바뀌는 정보

그대로 구현해주면 되는 문제지만 필자는 계속 시간초과가 났다.

필자는 처음 구현할 때, 인덱스 범위만 맞는다면 while을 진행시켰다. 하지만 시간초과가 났다.

분명 정보도 많이 없을텐데 왜 시간초과가 날까 생각해 데이터를 조금 정제할 필요가 있다고 생각했다.

 

여기서 만약 대칭이 아니라면, 즉 exclusive or을 사용해서 break을 해주었다.

그러더니 바로 통과가 되었다.

2. 구현

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int size = Integer.parseInt(br.readLine());
        boolean[] arr = new boolean[size + 1];

        //데이터 넣어주기
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= size; i++) {
            if (st.nextToken().equals("1")) {
                arr[i] = true;
            }
        }
        //학생별 전등 변화
        int pSize = Integer.parseInt(br.readLine());
        for (int i = 0; i < pSize; i++) {
            st = new StringTokenizer(br.readLine());
            int sex = Integer.parseInt(st.nextToken());
            int pos = Integer.parseInt(st.nextToken());

            //남자
            if (sex == 1) {
                for (int j = pos; j <= size; j += pos) {
                    arr[j] = !arr[j];
                }
            }
            //여자
            else {
                int left = pos - 1;
                int right = pos + 1;
                arr[pos] = !arr[pos];
                while (true) {
                    //인덱스 오류거나, 다르거나
                    if(left < 1 || right > size || arr[left] ^ arr[right]){
                        break;
                    }
                    else {
                        arr[left] = !arr[left];
                        arr[right] = !arr[right];
                        left--;
                        right++;
                    }
                }
            }
        }
        //출력은 20개씩 끊어서
        for(int j = 1; j<=size; j++){
            if(arr[j]){
                System.out.print(1 + " ");
            }
            else{
                System.out.print(0 + " ");
            }
            if(j % 20 == 0){
                System.out.println();
            }
        }
    }
}

배열 정보는 0, 1밖에 없기 때문에 boolean으로 구현했다.

남자는 쉬우니 넘어가고 여자의 경우는 left와 right로 점차 영역을 넓혀나갔다.

만약 인덱스를 넘어가거나, 대칭이 아니라면 break로 바로 나오게 구현했다.

3. 마무리

실버3의 문제였다. 이번도 문제를 잘 보지 않았다. 20개씩 출력인데...

또, 나름 실버네? 하면서 풀었는데 문제 출저가 초등학교 문제란다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ..

요즘 초등학생들은 공부 잘하나보다..

 

반응형
Comments