[백준/자바] 1244번: 스위치 켜고 끄기

수박강아지·2025년 8월 5일

BAEKJOON

목록 보기
101/174

문제

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

풀이

  • 1 ~ N까지 수가 적힌 스위치
  • 스위치의 상태
    • 1: 켜짐
    • 0: 꺼짐
  • 학생들에게 1 ~ N까지의 수 부여
  • 남학생: 받은 수의 배수가 적힌 스위치 상태 전환(1 -> 0, 0 -> 1)
  • 여학생: 받은 수의 스위치의 양옆을 검사 -> 좌우대칭인 경우가 최대인 구간을 상태 전환
  • 20줄이 넘어갈 경우 21번째 줄부터는 다음 줄에 출력

티어에 비해 생각보다 많이 틀린 문제입니다. 😂
단순 구현이라 만만히 보다 큰 코 다쳤네요

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		
		// 스위치 배열
		StringTokenizer st = new StringTokenizer(br.readLine());
		arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		// 입력받은 학생의 수, 커맨드
		s = Integer.parseInt(br.readLine());
		for (int i = 0; i < s; i++) {
			st = new StringTokenizer(br.readLine());
			gender = st.nextToken();
			idx = Integer.parseInt(st.nextToken()) - 1;
			if (gender.equals("1")) {
				boy(idx);
			} else {
				girl(idx);
			}
		}
  • 입력 받을 때 인덱스 값을 -1해서 받아주면 나중에 연산하기 편합니다.
  • gender의 비교를 통해 각 함수를 수행하게 했습니다.
	// 남학생
	public static void boy(int idx) {
		for (int i = idx; i < n; i += idx + 1) { // 배수만큼 증가
			arr[i] = 1 - arr[i]; // 상태 전환
		}
	}
  • 상태 전환을 (1 - 원래 값)으로 구현하였습니다.
  • 이렇게 되면 1일 때 0으로, 0일 때 1로 쉽게 변환할 수 있습니다.
	// 여학생
	public static void girl(int idx) {
		// 오른쪽 왼쪽 인덱스
		int left = idx - 1;
		int right = idx + 1;
		
		// 입력받은 인덱스 값 먼저 전환
		arr[idx] = 1 - arr[idx];
		
		// 범위 내 && 좌우대칭
		while (left >= 0 && right < n && arr[left] == arr[right]) {
			arr[left] = 1 - arr[left];
			arr[right] = 1 - arr[right];
			left--;
			right++;
		}
	}
  • 양방향의 인덱스를 가져와 좌우대칭일 경우 상태를 변환 시켜주었습니다.
  • 좌우대칭이 아닐 경우 break
		// 출력
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n; i++) {
			sb.append(arr[i]).append(" ");
			if ((i+1) % 20 == 0) sb.append("\n");
		}
		System.out.println(sb);
  • 각 값을 모두 StringBuilder에 넣어주고 인덱스가 20을 넘어갈 경우를 대비해, 다음 인덱스 % 20의 값이 0일 때 개행문자를 추가하였습니다.

코드

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

public class Main_1244 {
	static int n,s,idx;
	static int[] arr;
	static String gender;
	
	// 남학생
	public static void boy(int idx) {
		for (int i = idx; i < n; i += idx + 1) { // 배수만큼 증가
			arr[i] = 1 - arr[i]; // 상태 전환
		}
	}
	
	// 여학생
	public static void girl(int idx) {
		// 오른쪽 왼쪽 인덱스
		int left = idx - 1;
		int right = idx + 1;
		
		// 입력받은 인덱스 값 먼저 전환
		arr[idx] = 1 - arr[idx];
		
		// 범위 내 && 좌우대칭
		while (left >= 0 && right < n && arr[left] == arr[right]) {
			arr[left] = 1 - arr[left];
			arr[right] = 1 - arr[right];
			left--;
			right++;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		
		// 스위치 배열
		StringTokenizer st = new StringTokenizer(br.readLine());
		arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		// 입력받은 학생의 수, 커맨드
		s = Integer.parseInt(br.readLine());
		for (int i = 0; i < s; i++) {
			st = new StringTokenizer(br.readLine());
			gender = st.nextToken();
			idx = Integer.parseInt(st.nextToken()) - 1;
			if (gender.equals("1")) {
				boy(idx);
			} else {
				girl(idx);
			}
		}
		
		// 출력
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n; i++) {
			sb.append(arr[i]).append(" ");
			if ((i+1) % 20 == 0) sb.append("\n");
		}
		System.out.println(sb);
		
	}

}

0개의 댓글