본문 바로가기
알고리즘/📌백준

백준 : 스위치 켜고 끄기

by IMSfromSeoul 2021. 8. 2.

🏆 문제 정보

난이도 : 중하

문제 유형 : 시물레이션 ( 구현 )

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

📌 문제

남학생 여학생 다르게 동작

남학생 -> 자기가 받은 수의 배수들 on off 반대
여학생 -> 받은 수를 대칭점으로 양쪽이 대칭이 되는 최대 구간을 찾아서 해당 스위치의 상태를 모두 바꾼다. ( 대칭점도 포함 )

스위치의 마지막 상태 출력

20개가 넘는다면 21번째부터는 둘 째줄 맨 앞
(20개씩출력)

남학생 -> 그냥 반대로 바꾸기

여학생 -> 구간찾기
항상 홀수

Index = 0
While ( target + index < length && target - index >=0 && check(index) )
Index ++

For <- taget-index <= I <= target + index:
	switch(i)

📌 생각

1. 들어오는 input값을 ENUM형태로 대문자로 선언해서 받으니까 가시적으로 되게 좋았다.

2. array나 전역적으로 사용될 수 있는 값은 static 으로 선언하자.

3. 어떤 일을 한다~ => 메소드로 뽑으면 확실히 코드가 깔끔해진다.

 

🔥 주의점

⚡️ 1. while문안의 변수

while(SWITCH_NUMBER+add <= arr.length-1 && SWITCH_NUMBER - add >0 && check(SWITCH_NUMBER,add)){
    add+=1;
}
if(add>=1) add--;

예제에서, add가 2여야 하는데 3이 돼서 출력값이 달랐다. 이유가 뭐지? 하고 디버깅을 돌려봤는데

내가 원하는 add 값은 2지만, while문에서 add가 3이어야 ( false 여야 ) while문을 빠져나온다. 그래서 해당 값에서 -1을 해주어야 한다.

 

⚡️2. 배열의 시작값

 

해당 문제는 index의 시작값이 1부터이다. 그래서 0번부터 시작하면 문제가 헷갈려지므로, 0번에는 쓰레기 값을 넣고, 1~N 범위의 배열을 쓰는게 좋다.

📌 코드

package in_class.hw_210802;

import java.io.FileNotFoundException;
import java.util.Scanner;

public class SwitchTurnOff {

    static int[] arr;

    public static void main(String[] args) throws FileNotFoundException {
//        System.setIn(new FileInputStream("in_class/hw_210802/input.txt"));
        Scanner sc = new Scanner(System.in);

        int SWITCH_NUMS = sc.nextInt();
        arr = new int[SWITCH_NUMS+1];

        for(int i=1;i<=SWITCH_NUMS;i++){
            arr[i] = sc.nextInt();
        }
        int PEOPLE_NUMS = sc.nextInt();

        for(int T=0;T<PEOPLE_NUMS;T++){
            int GENDER = sc.nextInt();
            int SWITCH_NUMBER = sc.nextInt();

            int index = 1;
            if( GENDER == 1){
                while(index*SWITCH_NUMBER <= arr.length-1){
                    transfer(index*SWITCH_NUMBER);
                    index+=1;
                }
            }else if (GENDER == 2){
                int add = 0;
                while(SWITCH_NUMBER+add <= arr.length-1 && SWITCH_NUMBER - add >0 && check(SWITCH_NUMBER,add)){
                    add+=1;
                }
                if(add>=1) add--;
                for(int i=SWITCH_NUMBER-add;i<=SWITCH_NUMBER+add;i++){
                    transfer(i);
                }
            }
        }
        int LINE_COUNT = 20;

        for(int i=1;i<arr.length;i++){
            if(LINE_COUNT<i){
                System.out.println();
                LINE_COUNT+=20;
            }
            System.out.print(arr[i] + " ");
        }
    }

    private static boolean check(int SWITCH_NUMBER, int add) {
        return arr[SWITCH_NUMBER+add] == arr[SWITCH_NUMBER-add];
    }

    private static void transfer(int target) {
        if(arr[target] == 1){
            arr[target] = 0;
        }else{
            arr[target] = 1;
        }
    }
}

'알고리즘 > 📌백준' 카테고리의 다른 글

백준: Z  (0) 2021.08.20
백준: 배열돌리기 3  (0) 2021.08.12
백준: 크로아티아 알파벳  (0) 2021.08.12
백준 : 2493번 탑  (0) 2021.08.05
백준 : 재귀함수가 뭔가요?  (0) 2021.08.02

댓글