티스토리 뷰
https://www.acmicpc.net/problem/1244
문제
접근 과정
스위치 값을 받고, 스위치 배열에 값을 받았습니다.
남학생(1)은 자신이 받은 수가 스위치 번호의 배수일 때 스위치 값을 전환시키고
여학생(2)은 자신이 받은 수 기준으로 좌우가 대칭이여야 스위치 값을 전환시킵니다.
남학생의 경우 (배열의 인덱스+1)%수 == 0 을 통해 배수를 구하여 쉽게 구할 수 있었고,
여학생의 경우 받은 수를 기준으로 lt(수-1)와 rt(수+1)를 통해 좌우 대칭을 확인할 수 있었습니다.
lt와 rt가 배열의 범위를 벗어나지 않게 고려하여 설계했습니다.
그리고.. 정말 예상하지 못한 부분이 출력을 한 줄에 20개씩 하는 것인데
20번째의 수는 오른쪽에 공백이 있으면 안됩니다.
항상 출력할 때 i + " " 로 했던 저는 이 부분에서 왜 틀린걸까... 하고 고민했었네요..
코드
import java.io.*;
import java.util.*;
class Main {
private static int switchNum;
private static int[] switchArr;
private static int studentNum;
static void male(int target) {
for(int i=0; i<switchNum; i++) {
if((i+1)%target == 0) {
if(switchArr[i]==1) switchArr[i] = 0;
else switchArr[i] = 1;
}
}
}
static void female(int target) {
int point = target - 1; // 좌표
int lt = point - 1;
int rt = point + 1;
while(true) {
if(lt<0 || rt>switchNum-1) break;
if(switchArr[lt]==switchArr[rt]) {
if(switchArr[lt]==1) {
switchArr[lt] = 0;
switchArr[rt] = 0;
}
else {
switchArr[lt] = 1;
switchArr[rt] = 1;
}
lt--;
rt++;
}
else break;
}
if(switchArr[point]==1) switchArr[point] = 0;
else switchArr[point] = 1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
switchNum = Integer.parseInt(br.readLine());
switchArr = new int[switchNum];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < switchNum; i++) {
switchArr[i] = Integer.parseInt(st.nextToken());
}
studentNum = Integer.parseInt(br.readLine());
for (int i = 0; i < studentNum; i++) {
st = new StringTokenizer(br.readLine());
int gender = Integer.parseInt(st.nextToken());
int target = Integer.parseInt(st.nextToken());
if(gender == 1) {
male(target);
}
else {
female(target);
}
}
int cnt = 0;
for(int i=0; i<switchNum; i++) {
cnt++;
if(cnt >= 20) {
System.out.print(switchArr[i] + "\n");
cnt = 0;
}
else System.out.print(switchArr[i] + " ");
}
}
}
/*
1부터 연속적인 번호가 붙은 스위치(N), 켜짐 1 꺼짐 0
학생들을 뽑아 1이상 스위치(N) 이하의 자연수를 하나씩 나누어 줌
학생들은 성별과 받은 수에 따라 조작
조작 방법
남학생 - 스위치 번호가 받은 수의 배수이면 스위치 상태 바꾼다 (받은수 2번 -> 2, 4, 6 .. )
여학생 - 자신이 받은 수의 위치한 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을
찾아 스위치 상태를 바꾼다 - 구간에 속한 스위치 수는 항상 홀수가 된다
남자 - 간단, 배수인 수를 바꾸기만 하면 됨, 1
여자 - 받은 수 기준, 양 옆을 비교 같으면 양 옆으로전진, 다르면 그 수만 변경, 2
*/