본문 바로가기

Algorithm

[python] 백준 1244번 : 스위치 켜고 끄기

 

스위치 번호스위치 상태
0 1 0 1 0 0 0 1

<그림 1>

예를 들어 <그림 2>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 2>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.

스위치 번호스위치 상태
0 1 1 1 0 1 0 1

<그림 2>

스위치 번호스위치 상태
1 0 0 0 1 1 0 1

<그림 3>

입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.

입력

 

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩 있다. 셋째 줄에는 학생수가 주어진다. 학생수는 100 이하인 양의 정수이다. 넷째 줄부터 마지막 줄까지 한 줄에 한 학생의 성별, 학생이 받은 수가 주어진다. 남학생은 1로, 여학생은 2로 표시하고, 학생이 받은 수는 스위치 개수 이하인 양의 정수이다. 학생의 성별과 받은 수 사이에 빈칸이 하나씩 있다.

출력

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.

 

(정답 코드 아님 정답 코드는 맨밑에)

import sys

N=int(sys.stdin.readline())
switch=[False if i=="0" else True for i in sys.stdin.readline().split()]
S=int(sys.stdin.readline())
for i in range(S):
    gender, number=map(int, sys.stdin.readline().split())
    if gender == 1: #if boy
        k=1
        while number*k<=N:
            switch[number*k-1]= not switch[number*k-1]
            k+=1
    else:
        switch[number-1]= not switch[number-1]
        k=1
        while number+k<=N and number-k>=1:
            if switch[number + k - 1] ==switch[number - k - 1]:
                switch[number + k - 1] = not switch[number + k - 1]
                switch[number - k - 1] = not switch[number - k - 1]
            else:
                break
            k+=1
for i in range(N):
    if switch[i]:
        print(1, end=" ")
    else:
        print(0, end=" ")
    if i==19:
        print()

일단 그냥 문제에 써있는 대로 코드를 짰다. 좀 더 깔끔하게 짜고 싶으면 함수 선언을 남자와 여자로 나누어서 해주는 것이 좋다(고한다.)

switch=[False if i=="0" else True for i in sys.stdin.readline().split()]

0, 1로 그대로 해도 되지만 그냥 리스트 컴프리헨션 연습하고싶었다.

 

사실 어려운 문제는 아니다. 근데 실패 개많이함.

왜?

자꾸 출력이 잘못되었다고 그랬다.

광기의 제출

아니 도대체 뭐가 문제일까 생각해봤는데

아무리 생각해도 출력 마지막에 띄어쓰기가 있으면 안되는건가 생각함

for i in range(N):
    if switch[i]:
        print(1, end=" ")
    else:
        print(0, end=" ")
    if i==19:
        print()

그래서 너무 열받지만 리스트 컴프리헨션을 사용하여 다시 돌려놓고 

join을 써야하니 str형태로 바꿔줌

switch_str=["0" if not i else "1" for i in switch]
groups_of_20 = [switch_str[i:i+20] for i in range(0, N, 20)]

 

[정답코드]

import sys

N=int(sys.stdin.readline())
switch=[False if i=="0" else True for i in sys.stdin.readline().split()]
S=int(sys.stdin.readline())

for i in range(S):
    gender, number=map(int, sys.stdin.readline().split())
    if gender == 1: #if boy
        k=1
        while number*k<=N:
            switch[number*k-1]= not switch[number*k-1]
            k+=1
    else:
        switch[number-1]= not switch[number-1]
        k=1
        while number+k<=N and number-k>=1:
            if switch[number + k - 1] ==switch[number - k - 1]:
                switch[number + k - 1] = not switch[number + k - 1]
                switch[number - k - 1] = not switch[number - k - 1]
            else:
                break
            k+=1
switch_str=["0" if not i else "1" for i in switch]
groups_of_20 = [switch_str[i:i+20] for i in range(0, N, 20)]
for group in groups_of_20:
    print(" ".join(group))