백준 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. 결과
'Programming > Algorithm' 카테고리의 다른 글
[백준/python] 3980번 선발 명단 (0) | 2024.05.04 |
---|---|
[알고리즘] 백트래킹 Backtracking (0) | 2024.05.03 |
[백준/python] 9081번 단어 맞추기 (0) | 2024.05.03 |
[백준/python] 11055번 가장 큰 증가 부분 수열 (0) | 2024.05.02 |
[백준/python] 20436번 ZOAC 3 (1) | 2024.05.01 |