티스토리 뷰

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 


문제

 


접근 과정

 

스위치 값을 받고, 스위치 배열에 값을 받았습니다.

남학생(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


 */
공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31