1. 문제

www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

2. 접근방법

간단한 시뮬레이션 문제

인덱스 관리를 할때 조금만 신경써주면 되는 문제다.

스위치 번호는 1번부터 시작인데

이걸 번호에 -1을 해서 0번 인덱스부터 시작으로 한다면

 

남자가 배수만큼씩 스위치 상태를 변화 시킬때 문제가 생긴다.

예를 들어 3번 스위치를 받았을 때 배수를 구하면

3 6 9 12 15 18 ... 인데

 

-1 하고 배수를 구하면

2 4 6 8 10 ...이 되어버린다.

 

그래서 나는 이 문제를 3 6 9 12 15 18 ... 을 구하고

스위치에 적용할 때 -1을 해서 2 5 8 11 14 17 ...로 해결했다.

 

여자는 start end 포인터로 한칸씩 전진하면서 같으면 바꾸고 같으면 바꾸고 반복했다.

 

마지막으로 출력할 때 출력양식에 조심해서 출력해야한다.

 

3. 자바 코드

package Silver;

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

public class P1244스위치켜고끄기 {
	
	public static void main(String[] args) throws Exception{
		//남학생은 배수 번호 스위치 상태 바꾸기
		//여학생은 번호로 부터 양옆 대칭인 스위치 상태 바꾸기
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		
		boolean switchlist[] = new boolean [N];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < N ; i++) {
			char status = st.nextToken().charAt(0);
			if(status == '1')
				switchlist[i] = true;
		}
		
		int SN = Integer.parseInt(br.readLine());
		for(int i = 0 ; i < SN ; i++) {
			st= new StringTokenizer(br.readLine());
			int gender = Integer.parseInt(st.nextToken());
			int place = Integer.parseInt(st.nextToken());
			
			if(gender == 1) {
				for(int j = 1 ; place*j-1 < N ; j++) {
					int newplace = place*j-1;
					switchlist[newplace] = !switchlist[newplace];
				}
			}
			else {
				int start = place-1;
				int end = place-1;
				switchlist[start] = !switchlist[end];
				if(--start <0)
					continue;
				if(++end >=N)
					continue;
				while(switchlist[start] == switchlist[end]) {
					switchlist[start] = !switchlist[start];
					switchlist[end] = !switchlist[end];
					if(--start <0)
						break;
					if(++end >=N)
						break;
				}
			}
		}
		for(int i = 0 ; i < N-1 ; i++) {
			if(switchlist[i])
				System.out.print(1 +" ");
			else
				System.out.print(0+" ");
			if(i%20 == 19)
				System.out.println();
		}
		if(switchlist[N-1])
			System.out.println(1);
		else
			System.out.println(0);
	}
}

 

4. 마치며

문제가 어렵지는 않은데 

인덱스 관리나 출력양식 부분을 조금 신경써줘야 했던 문제

문제 자체는 재밌었다.

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준] 10158 개미  (0) 2020.09.23
[백준] 2477 참외밭  (1) 2020.09.23
[백준] 2564 경비원  (1) 2020.09.19
[백준] 2563 색종이  (0) 2020.09.19
[백준] 17135 캐슬디펜스  (0) 2020.09.13

+ Recent posts