아이디어

  1. 남자인 경우는 간단하게 for문을 배수만큼 돌려준다.
  2. 여자인 경우, 팰린드롬을 찾아 스위치를 켜고 끈다.

 


풀이 및 해설(주석) (파이썬)

N = int(input())
arr = list(map(int, input().split()))
P = int(input())

for i in range(P):
    s, n = map(int, input().split())
    if s == 1:                          # 남자일때
        for j in range(n-1, N, n):      # 수의 배수 만큼 인덱스 순회
            if arr[j] == 1:
                arr[j] = 0
            else:
                arr[j] = 1

    elif s == 2:                        # 여자일때
        l, r = n-2, n                   # l, r 을 투 포인터 개념으로 잡아줌
        while True:
            if l < 0 or r >= N:         # 경계 체크
                break
            if arr[l] != arr[r]:        # 팰린드롬 문자열 찾기와 비슷하다.
                break                   # 하지만, 이 문제는 홀수개의 팰린드롬만 찾으면 된다.
            else:
                l -= 1
                r += 1
        for j in range(l+1, r):
            if arr[j] == 1:
                arr[j] = 0
            else:
                arr[j] = 1

for i in range(0, N, 20):               # 여기서 좀 해맸는데, 21번째 부터는 다음줄에 출력하기
    print(*arr[i:i+20])

 

풀이 (자바)

import java.io.*;
import java.util.Arrays;
import java.util.Objects;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(bf.readLine());
        String[] tmp = bf.readLine().split(" ");
        int[] swi = new int[N];
        for (int i = 0; i < N; i++) {
            swi[i] = Integer.parseInt(tmp[i]);
        }
        int M = Integer.parseInt(bf.readLine());
        for (int i = 0; i < M; i++) {
            String[] info = bf.readLine().split(" ");
            if (info[0].equals("1")) {
                int manIdx = Integer.parseInt(info[1]);
                for (int j = manIdx-1; j < N; j+=manIdx) {
                    int nowSwi = swi[j];
                    if (nowSwi == 0) {
                        swi[j] = 1;
                    } else {
                        swi[j] = 0;
                    }
                }
            } else {
                int l = Integer.parseInt(info[1]) - 2;
                int r = Integer.parseInt(info[1]);
                while (true) {
                    if (l < 0 || r >= N) {
                        break;
                    }
                    if (swi[l] != swi[r]) {
                        break;
                    }
                    else {
                        l -= 1;
                        r += 1;
                    }
                }
                for (int j = l+1; j < r; j++) {
                    if (swi[j] == 1) {
                        swi[j] = 0;
                    } else {
                        swi[j] = 1;
                    }
                }
            }
        }
        for (int i = 0; i < swi.length; i++) {
            if (i!=0 && i%20 == 0) {
                bw.newLine();
            }
            bw.write(String.valueOf(swi[i] + " "));
        }
        bw.close();
    }
}
복사했습니다!