[백준] 1244 스위치 켜고 끄기

jyleever·2022년 7월 29일
0

알고리즘

목록 보기
17/26

문제

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

풀이

문제 풀이

  • 남학생
    자기가 받은 수의 배수인 스위치 번호의 상태를 바꿈
  • 여학생
    자기가 받은 수의 스위치 번호를 중심으로 좌우 대칭되는 가장 많은 구간의 스위치를 포함하는 구간을 찾아 모두 바꿈

입력

첫째 줄에는 스위치 개수 int [1, 100]
둘째 줄에는 각 스위치의 상태가 주어진다.

  • 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩 있음

셋째 줄에는 학생 수 int [1, 100]
넷째 줄부터 마지막 줄까지 한 줄에 한 학생의 성별, 학생이 받은 수

  • 남학생은 1로, 여학생은 2로 표시
  • 학생이 받은 수는 스위치 개수 이하인 양의 정수이다.
  • 학생의 성별과 받은 수 사이에 빈칸이 하나씩 있다.

출력

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력
예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.

문제 풀이 순서

  1. 스위치 정보를 입력 받는다
  2. 학생수 만큼 반복문을 반복한다.
  • 남자인 경우
    번호의 배수의 인덱스인 스위치들을 0->1, 1->0
    continue
  • 여자인 경우
    여자의 번호를 i로 하고 대칭 정보를 찾아야 한다.
    left = i-1
    right = i+1
    우선 스위치[i] : 0 <-> 1
    if(left가 0보다 크고 AND right가 스위치 개수보다 작거나 같고 AND 스위치[left] == 스위치[right]) 인 경우 스위치[left] : 0 <-> 1, 스위치[right] : 0 <-> 1
  1. 변화된 스위치 정보를 출력한다
    이 때 한줄에는 20개만큼만 출력해야 한다.

코드

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

public class Main {

	public static void main(String[] args) throws IOException{
		
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 스위치 개수
		int switchCnt = Integer.parseInt(br.readLine());
		int[] switchInfo = new int[switchCnt+1];
		
		StringTokenizer st;
		
		// 스위치 정보
		st = new StringTokenizer(br.readLine(), " ");
		for(int i=1; i<=switchCnt; i++) {
			switchInfo[i] = Integer.parseInt(st.nextToken());
		}
		
		StringBuilder sb = new StringBuilder();
		
		// 학생 수
		int studentCnt = Integer.parseInt(br.readLine());
		
		while(studentCnt-- > 0) {
			
			st = new StringTokenizer(br.readLine(), " ");
			int sex = Integer.parseInt(st.nextToken());
			int index = Integer.parseInt(st.nextToken());
			
			if(sex == 1) {
				// 남자라면
				for(int i=1; i<=switchCnt; i++) {
					if(i % index == 0) {
						switchInfo[i] = switchInfo[i] == 0 ? 1 : 0;
					}
				}
			} else if(sex == 2) {
				// 여자라면
				
				switchInfo[index] = switchInfo[index] == 0 ? 1 : 0;
				
				int left = index - 1;
				int right = index + 1;
				
				while(left > 0 && right <= switchCnt && switchInfo[left] == switchInfo[right])
				{
					switchInfo[left] = switchInfo[left] == 0 ? 1 : 0;
					switchInfo[right] = switchInfo[right] == 0 ? 1 : 0;
					left--;
					right++;
				}

			}
		}
		
		// 20개씩 출력
		//한 줄에 20개씩 출력
		
		sb = new StringBuilder();
		for(int i=1; i<=switchCnt; i++) {
			sb.append(switchInfo[i]+" ");
			if(i % 20 == 0) sb.append("\n");
		}
		
		System.out.println(sb);
	}

}

0개의 댓글