경험의 기록

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 

 

 

풀이

0. 문제해석

문제가 꽤 길지만 읽어보면 쉽게 이해되는 구현 문제이다.

문제에서 주어진 대로

남학생이면 스위치 번호의 배수 스위치의 상태를 전부 바꿔주고,

여학생이면 스위치의 대칭여부를 비교해가며 상태를 바꿔준다.

 

1. 스위치 입력

스위치 번호가 1부터 시작하므로

배열의 크기에 1을 더해주어 인덱스 1부터 시작한다.

 

2. 학생 스위치 처리

성별과 스위치 번호를 입력받아

남학생, 여학생 분기 처리해준다.

 

3. 남학생

배열의 끝까지 배수로 탐색하여

스위치를 반대로 변경해준다.

 

4. 여학생

일단 현재 입력받은 위치 번호를 반대로 변경해주고,

좌우 1번째 스위치 끼리 비교하여 대칭이라면 변경,

그 이후 2번째 스위치 끼리 비교하여 변경,

이 작업을 반복하여 대칭이 아니거나 범위를 벗어날때 까지 처리해준다.

 

5. 출력

배열을 전부 출력해주는데

문제에서 주어진대로 20개의 스위치 마다 공백 처리를 해준다.

 

6. 전체코드

// [백준] 1244. 스위치 켜고 끄기 (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Solution {
	static int num; // 스위치 개수
	static int[] state; // 스위치 상태
	static int student; // 학생 수
	
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  
        // 스위치 개수 입력
        num = Integer.parseInt(br.readLine());
        
        // 스위치 상태 입력
        state = new int[num + 1];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 1; i < state.length; i++) {
        	state[i] = Integer.parseInt(st.nextToken());
        }
        
        // 학생수 입력
        student = Integer.parseInt(br.readLine());
        
        // 학생 스위치 처리
        for(int i = 0; i < student; i++) {
        	st = new StringTokenizer(br.readLine());
        	
        	int gender = Integer.parseInt(st.nextToken());
        	
        	// 남자
        	if(gender == 1) {
        		man(Integer.parseInt(st.nextToken()));
        	}
        	// 여자
        	else if(gender == 2) {
        		women(Integer.parseInt(st.nextToken()));
        	}
        }
        
        for(int i = 1; i < state.length; i++) {
        	System.out.print(state[i] + " ");
        	if(i % 20 == 0) {
        		System.out.println();
        	}
        }
        br.close();
    }
    
    public static void man(int x) {
    	int cur = x;
    	// 배수 번호 스위치 상태 반대로 변경
    	while(cur < state.length) {
    		if(state[cur] == 0) {
    			state[cur] = 1;
    		}
    		else if(state[cur] == 1) {
    			state[cur] = 0;
    		}
    		cur += x;
    	}
    }
    
    public static void women(int x) { 	
    	// 현재 위치 스위치 상태 반대로 변경
    	if(state[x] == 0) {
			state[x] = 1;
		}
		else if(state[x] == 1) {
			state[x] = 0;
		}
    	
    	// 대칭 스위치 반대로 변경
    	int count = 1;
    	while((x - count) > 0 && (x + count) < state.length) {
    		if(state[x + count] == state[x - count]) {
    			
    			if(state[x + count] == 0) {
    				state[x + count] = 1;
    				state[x - count] = 1;
    			}
    			else if(state[x + count] == 1) {
    				state[x + count] = 0;
    				state[x - count] = 0;
    			}
    			count++;
    			
    		}
    		else {
    			break;
    		}
    	}
    }
}

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading