백준 Silver4 1244 - 스위치 켜고 끄기

JH·2022년 9월 30일
0

백준 알고리즘

목록 보기
15/29
post-thumbnail

문제

입력

출력

예제

idea

나는 반례찾기를 잘 못하는것 같다..ㅜ
알고리즘 구현까지는 쉬운데 그 후에 세부적인 반례에서 자꾸 오래걸린다..

이 코드는 알고리즘은 어렵지 않았다.
일부러 배열을 index+1로 한 후 0번째를 비워두고 1~index까지 이용했다.
입력을 차례차례 받은 후
남자일 경우 배수만큼 0->1 1->0 해주고
여자일 경우 f(n+1) == f(n-1) 일 경우 반대 해주는 식으로 썼다.

이 문제의 키포인트는 알고리즘 구현이 아닌.. 세부적인 범위 조절이었던 것 같다.

Code

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

public class Main {

	public static void main(String[] args) throws IOException {
	
	     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));	    
	     StringTokenizer st = new StringTokenizer(br.readLine());
	   
	    int x =Integer.parseInt(st.nextToken());
	    int swt[]=new int[x+1];
	    int sex, num,stu;
	    
	    st = new StringTokenizer(br.readLine());
	    for(int i=1;i<=x;i++) {   	
	    	swt[i]=Integer.parseInt(st.nextToken());
	    }
	    
	    st = new StringTokenizer(br.readLine());
	    stu =Integer.parseInt(st.nextToken());
	  
  
	    for(int i=1;i<=stu;i++) {
	    	st = new StringTokenizer(br.readLine());
	 	    sex =Integer.parseInt(st.nextToken());
	 	    num =Integer.parseInt(st.nextToken());
	 	    int num_2;
	 	    if(sex==1) {
	 	    	num_2=num;
	 	    	while(num_2<=x) {
	 	    		swt[num_2]=opposite(swt[num_2]);
	 	    		num_2+=num;
	 	    	}
	 	    }    
	 	    else if(sex==2) {
	 	    	swt[num]=opposite(swt[num]);
	 	    	int t=1;
	 	 
	 	    	while((((num-t)>0)&&((num+t)<=x)&&swt[num-t]==swt[num+t])) {
	 	    		swt[num-t]=opposite(swt[num-t]);
	 	    		swt[num+t]=opposite(swt[num+t]);
	 	    		t++;
	 	    		
	 	    	}
	 	    }	    	
	    }			
	    for(int i=1;i<=x;i++) {
	    	if(i!=1 && i%20==1)
	    		System.out.print("\n"); 
	    	System.out.print(swt[i]+" ");
	    	   
	    }
	}
	
	public static int opposite(int x) {
		if (x==0)
			x=1;
		else if (x==1)
			x=0;
		
		return x;
		
	}
}

결과

0개의 댓글