백준_1244번_스위치 켜고 끄기

임정민·2023년 2월 25일
3

알고리즘 문제풀이

목록 보기
37/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

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

[나의 풀이]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

    // 0 <=> 1 변환
    static int one_zero_parser(int one_or_zero) {

        // 2 % (1+1) => result = 0
        // 2 % (0+1) => result = 1
        int result = (one_or_zero + 1) % 2;
        return result;
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());
        int[] switches = new int[n];
        st = new StringTokenizer(br.readLine());

        for (int i = 0; i < n; i++) {
            switches[i] = Integer.parseInt(st.nextToken());
        }

        // 학생 수
        int std_num = Integer.parseInt(br.readLine());

        // 학생 수 만큼 반복
        for (int i = 0; i < std_num; i++) {

            st = new StringTokenizer(br.readLine());

            // 성별
            int gender = Integer.parseInt(st.nextToken());

            // 번호
            int number = Integer.parseInt(st.nextToken());

            // 남자일 때
            if (gender == 1) {

                for (int j = number; j < n; j += (number)) {
                    switches[j - 1] = one_zero_parser(switches[j - 1]);
                }
            }

            // 여자일 때
            else {
                switches[number - 1] = one_zero_parser(switches[number - 1]);

                // 번호가 중간 이상 or 이하인지 확인
                boolean higher = false;

                if (number > n / 2) {
                    higher = true;
                }

                // 여자의 숫자에서 점점 퍼짐
                int gap = 0;
                // 중간 이상 일때
                if (higher) {

                    while (number + gap < n) {
                        gap++;
                        if (switches[number + gap - 1] == switches[number - gap - 1]) {
                            switches[number + gap - 1] = one_zero_parser(switches[number + gap - 1]);
                            switches[number - gap - 1] = one_zero_parser(switches[number - gap - 1]);
                        } else {
                            break;
                        }
                    }

                }

                // 중간 이하일때
                else {

                    while (number + gap > 1) {
                        gap--;
                        if (switches[number + gap - 1] == switches[number - gap - 1]) {
                            switches[number + gap - 1] = one_zero_parser(switches[number + gap - 1]);
                            switches[number - gap - 1] = one_zero_parser(switches[number - gap - 1]);
                        } else {
                            break;
                        }
                    }

                }

            }

        }

        // 출력
        for (int i = 0; i < n; i++) {
            if (i != 0 && i % 20 == 0) {
                bw.write("\n");
            }
            bw.write(switches[i] + " ");
        }
        bw.flush();

    }
}

[팀원의 풀이]

# coding = utf-8
import sys
input = sys.stdin.readline

n = int(input())
switch = list(map(int, input().split()))
m = int(input())

def changeswitch(idx):
    if switch[idx] == 0:
        switch[idx] = 1
    else:
        switch[idx] = 0

def boy(number):
    idx = number-1
    while idx<n:
        changeswitch(idx)
        idx += number

def girl(number):
    idx = number-1
    changeswitch(idx)
    l, r = idx-1, idx+1
    while l>=0 and r<n and switch[l] == switch[r]:
        changeswitch(l)
        changeswitch(r)
        l -= 1
        r += 1

def sol(gender, number):
    if gender == 1:
        boy(number)
    else:
        girl(number)

def printswitch():
    idx = 0
    for number in switch:
        print(number, end=" ")
        idx += 1
        if idx % 20 == 0:
            print()

for _ in range(m) :
    g, num = map(int, input().split())
    sol(g, num)

printswitch()

입력에 맞는 스위치 On/Off 문제입니다.
문제 자체는 이해하는 데에 어렵진 않았습니다.🐳🐳🐳

하지만 문제에서 요구하는 출력 시의 조건 '스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.' 를 제대로 읽지 않아서 '출력 형식이 잘못되었습니다' 메세지가 떴고 이 때문에 시간이 오래걸렸습니다..😥😥😥

앞으로 문제에서 요구하는 조건들을 꼼꼼히 읽어보고 풀기 시작하는 습관을 들여보도록 하겠습니다...

감사합니다!!!💐💐💐

profile
https://github.com/min731

1개의 댓글

comment-user-thumbnail
2023년 2월 28일

답글 달기