Programming/Algorithm

[백준/python] 21918번 전구

dev seon 2024. 4. 30. 20:16

백준 21918번 전구

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

 

1. 문제

 

전구의 상태를 숫자 0과 1로 표현한다.

전구가 꺼진 경우는 0, 켜진 경우는 1이다.

전구를 제어하는 명령어 1~4번을 입력된 순서대로 처리한 뒤의 전구 상태를 확인하는 문제이다.

 

2. 풀이

이 문제는 간단한 구현 문제로, 난이도가 쉬운 편이었다.

각각의 명령어를 수행하는 코드를 짜서 명령어가 입력된 순서에 맞게 실행만 시키면 된다.

 

함수형 프로그래밍 구현을 위해 조건문을 사용해 각 경우를 함수 안에 넣었다.

반복문을 사용해 명령어들을 입력받은 순서대로 실행했다.

 

3. 코드

<방법 1>

처음 시도에서는 평소 자주 사용하던 방식대로 입력 받은 명령어 정보를 배열에 저장했다.

그 뒤에 배열에 저장한 각각의 명령어 정보에 대해 순서대로 command 함수를 실행하도록 했다.

def command(x, y, z):
    if x == 1: #1번 명령어
        s[y-1] = z
    elif x == 2: #2번 명령어
        for i in range(y-1, z):
            if s[i] == 1:
                s[i] = 0
            else:
                s[i] = 1
    elif x == 3: #3번 명령어
        for i in range(y-1, z):
            s[i] = 0
    elif x == 4: #4번 명령어
        for i in range(y-1, z):
            s[i] = 1

#입력
n, m = map(int, input().split())
s = list(map(int, input().split()))
arr = []
for i in range(m):
    a, b, c = map(int, input().split())
    arr.append((a, b, c))

#모든 명령어 순서대로 실행
for item in arr:
    command(item[0], item[1], item[2])

print(' '.join(map(str, s))) #출력

 

<방법 2>

코드를 다 짜고나니 좀 더 효율적인 코드를 작성할 수 있을 것 같았다.

굳이 arr 배열에 append를 하지 않고 그때그때 입력 순서대로 전구의 상태를 바꾸면

코드도 더 짧아지고 시간을 절약할 수 있을 것이라 판단했다.

def command(x, y, z):
    if x == 1: #1번 명령어
        s[y-1] = z
    elif x == 2: #2번 명령어
        for i in range(y-1, z):
            if s[i] == 1:
                s[i] = 0
            else:
                s[i] = 1
    elif x == 3: #3번 명령어
        for i in range(y-1, z):
            s[i] = 0
    elif x == 4: #4번 명령어
        for i in range(y-1, z):
            s[i] = 1

#입력
n, m = map(int, input().split())
s = list(map(int, input().split()))
arr = []
#입력 받으면서 command 함수 실행
for i in range(m):
    a, b, c = map(int, input().split())
    command(a, b, c)
print(' '.join(map(str, s))) #출력

 

4. 결과