본문 바로가기
백준

[백준] 알고리즘 분류(구현,JAVA)1244번, 스위치 켜고 끄기

by 열정적인 이찬형 2023. 1. 9.

문제 링크

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

이 문제에 핵심

 

1. 1~N까지 스위치가 존재하며 각 스위치의 상태가 주어집니다.

2. 성별에 따라 스위치를 작동하는 방법이 달라집니다.

3. 스위치 작동을 마친 뒤에 스위치 정보를 결과로 출력합니다.

 

알고리즘 진행 순서.

 

1. 입력된 정보를 저장합니다.

 

2. 남학생, 여학생의 스위치 변경을 진행합니다.

 

3. 스위치 변경이 끝난 뒤 스위치 상태를 결과로 출력합니다.

 

 

스위치 변경

 

남학생일 때

 

숫자의 배수에 위치한 스위치를 변경!

 

여학생일 때

 

숫자 기준 좌우 대칭이 되는 값까지 스위치 변경!

 

예제입력 1.

 

1. 입력된 정보를 저장합니다.

 

스위치 개수 = 8

 

스위치 정보

 

0 1 0 1 0 0 0 1

 

학생 수 : 2명

 

1 3 : 남학생, 숫자 3

2 3 : 여학생, 숫자 3

 

 

2. 남학생, 여학생의 스위치 변경을 진행합니다.

스위치 변경 진행!

 

1 3 : 남학생, 숫자 3

 

0 1 1 1 0 1 0 1
 
 
 

 

2 3 : 여학생, 숫자 3

 

0 1 1 1 0 1 0 1

3번 스위치 기준 (1, 2)와 (4, 5) 대칭!

1 ~ 5까지 변경!

 

1 0 0 0 1 1 0 1

 

3. 스위치 변경이 끝난 뒤 스위치 상태를 결과로 출력합니다.

 

1 0 0 0 1 1 0 1

 

1 0 0 0 1 1 0 1을 결과로 출력합니다.

 

  • BufferedReader를 사용하여 입력되는 정보를 저장합니다.
  • StringTokenizer를 이용하여 스위치, 학생 정보를 띄어쓰기 기준 나누었습니다.
  • 남학생과 여학생의 여부에 따라 스위치 변경 진행합니다.
  • 변경된 스위치 정보를 결과로 BufferedWriter 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.
  • manCheck함수는 남학생이 스위치를 변경하는 것을 진행합니다.
  • womanCheck함수는 여학생이 스위치를 변경하는 것을 진행합니다.

 

결과코드

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

public class Main {
    static int[] switchValue;	//스위치 정보 배열
    public static void main(String[] args) throws IOException {
        //입력값 처리하는 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //결과값 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine());
        switchValue = new int[N+1];
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        //스위치 정보 저장
        for(int i=1;i<=N;i++)
            switchValue[i] = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(br.readLine());
        //학생들 스위치 변경 진행!
        for(int i=0;i<K;i++){
            st = new StringTokenizer(br.readLine()," ");
            int gender = Integer.parseInt(st.nextToken());
            int num = Integer.parseInt(st.nextToken());
            if(gender == 1)	//남학생일 때
                manCheck(num, N);
            else		//여학생일 때
                womanCheck(num, N);
        }
        //스위치 정보 BufferedWriter 저장
        for(int i=1;i<=N;i++){
            if(i % 20 == 1 && i > 1)
                bw.newLine();
            bw.write(switchValue[i] + " ");
        }
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
    //남학생일 때 스위치 변경 함수
    static void manCheck(int num, int N){
        //숫자 배수의 스위치 변경
        for(int i=num;i<=N;i+=num)
            switchValue[i] = switchValue[i] == 1 ? 0 : 1;
    }
    //여학생일 때 스위치 변경 함수
    static void womanCheck(int num, int N){
        int start = num-1;	//범위 시작 위치
        int end = num+1;	//범위 끝 위치
        //대칭 확인 및 범위 변경
        while(start > 0 && end <= N){
            if(switchValue[start] == switchValue[end]){
                start--;
                end++;
            }else
                break;
        }
        start++;
        end--;
        //대칭 범위에 스위치 변경
        for(int i=start;i<=end;i++)
            switchValue[i] = switchValue[i] == 1 ? 0 : 1;
    }
}

댓글