뚱땅뚱땅

[문제] 백준 1244번 스위치 켜고 끄기 본문

알고리즘/백준

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

양순이 2021. 2. 1. 22:31
728x90

* 출처: www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

내 생각

 

재귀함수를 복습하는 김에 재귀로 풀어봤다. 시간이 좀 걸렸던 이유는 문제를 잘 안 읽은 게 크다.

출력부분을 보면, 한줄에 20개의 스위치번호를 출력하도록 써있는데, 이걸 보지 못했다.

 

그리고 boy() 부분에서 ball += ball;을 해서 계속 틀렸었다.

문제 좀 더 주의깊게 좀 읽자!!

 

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

public class BJ_1244 {
	static int sArr[] = new int[101]; // 스위치 배열
	static int num; // 스위치 개수

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder("");

		num = Integer.parseInt(in.readLine());

		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		for (int i = 1; i <= num; i++) {
			sArr[i] = Integer.parseInt(st.nextToken());
		}

		// 학생 수
		int student = Integer.parseInt(in.readLine());

		for (int i = 0; i < student; i++) {
			st = new StringTokenizer(in.readLine(), " ");
			int gender = Integer.parseInt(st.nextToken());	// 1: 남자, 2: 여자
			int ball = Integer.parseInt(st.nextToken()); // 받은 공 넘버

			if (gender == 1) {
				boy(ball, ball);
			} else if (gender == 2) {
				girl(ball, 0);
			}
		}
		// 결과 출력
		for (int i = 1; i <= num; i++) {
			sb.append(sArr[i]).append(" ");
			if(i%20 == 0) sb.append("\n");
		}
		System.out.print(sb);
	}

	static void boy(int ball,int d) {
		
	//1. 반복문으로 풀기	
//		int d = ball;
//		while(ball<=num) {
//			sArr[ball] ^= 1;
//			ball+= d;
//		}
		
	// 2. 재귀로 풀기
		if(ball>num) return;
		sArr[ball] ^= 1;
		ball += d;
		boy(ball,d);
	}

	//재귀
	static void girl(int ball, int d) {
		if (ball - d < 1 || ball + d > num)	// 범위 넘어가면
			return;

		if (d == 0) {
			sArr[ball] ^= 1;
		} else {
			if (sArr[ball - d] == sArr[ball + d]) {
				sArr[ball - d] ^= 1;
				sArr[ball + d] ^= 1;
			} else {
				return;
			}
		}

		girl(ball, d + 1);
	}
}

두번쨰 풀이: for문

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

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(in.readLine());
		int[] state = new int[N+1];
		StringTokenizer st = new StringTokenizer(in.readLine()," ");
		for(int i=1;i<=N;i++) {
			state[i] = Integer.parseInt(st.nextToken());
		}
		
		int student = Integer.parseInt(in.readLine());
		for(int i=0;i<student;i++) {
			st = new StringTokenizer(in.readLine()," ");
			int gender = Integer.parseInt(st.nextToken());
			int num = Integer.parseInt(st.nextToken());
			if(gender == 1) {
				for(int j=num; j<= N; j+= num) {
					state[j] ^= 1;
				}
				
			}else if(gender == 2) {
				state[num] ^= 1;
				for(int j=1;j<N;j++) {
					int left = num - j;
					int right = num + j;
					if(left>0 && right <=N) {
						if(state[left] == state[right]) {
							state[left] ^= 1;
							state[right] ^=1;
						}else 
							break;
					}else 
						break;
				}
			}
		}
		
		for(int i=1;i<=N;i++) {
			System.out.print(state[i]+ " ");
			if(i!=0 && i%20 == 0) System.out.println();
		}
		System.out.println();
	}
}
728x90
Comments