일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 노마드코더
- CS
- 리스트
- ARP
- 데이터통신
- 노개북
- RARP
- 북클럽
- 쉽게 배우는 데이터 통신과 컴퓨터 네트워크
- 컴퓨터네트워크
- 이것이 취업을 위한 코딩테스트다
- OSI7계층모델
- DP
- 라우팅
- 시스템 소프트웨어
- 이코테
- 쿠키
- 파이썬 정렬
- 자료형
- data type
- 데이터 통신과 컴퓨터 네트워크
- 파이썬 자료형
- 컴퓨터 동작방식
- sort()
- GIT
- 파이썬 연산자
- 이것이 취업을 위한 코딩 테스트다
- 기억장치
- IT5분잡학사전
- icmp
- Today
- Total
뚝딱햄 탈출기
[Python][백준 BOJ Silver II] 1541. 잃어버린 괄호 : enumerate 본문
[Python][백준 BOJ Silver II] 1541. 잃어버린 괄호 : enumerate
hyrmzz1 2023. 10. 29. 00:24
❌ 접근 방식 1
- '-'의 인덱스 값을 찾아서
- '-' 바로 뒤에 '('를 삽입하고
- '-'가 더 나오지 않는다면 문자열 맨 뒤에 ')'를 삽입, '-'가 더 나온다면 그 앞에 ')'를 삽입하기
- .eval() 함수를 통해 문자열 자체를 연산
위의 로직으로 코드를 작성해 보았다. ( 사실 이 코드는 공개하기도 부끄럽다만 TIL 삼아 넣는다 ~ )
.find() 를 사용한다면 () 안의 문자에 해당하는 처음 인덱스 값만 반환되기 때문에 for문을 통해 '-'의 인덱스 값을 빈 배열에 넣어주었다.
import sys
expr = sys.stdin.readline().rstrip()
# '-' 찾기
minus_index = []
for i in range(len(expr)):
if expr[i] == '-':
minus_index.append(i)
if len(minus_index) == 0: # '-' 없다면 그냥 전체 연산 (더하기)
ans = eval(expr)
print(ans)
else:
# 첫번째 '-' 뒤와 두번째 '-' 앞에 각각 append('('), append(')')
expr = expr[:[minus_index[0]]] + '(' + expr[[minus_index[0]] + 1:[minus_index[1]]] + ')'
ans = eval(expr)
print(ans)
틀린 이유
else문에서 정말 기괴한 슬라이싱을 작성한 탓이다 .. ^^ㅎ
TypeError: slice indices must be integers or None or have an __index__ method
슬라이싱 할 때는 아무 것도 안들어가거나 (처음과 끝을 뜻함) 정수가 들어가야 한다.
그리고 '-'가 2개 포함되는 경우만을 생각하고 작성한 방식이었다.
❌ 접근 방식 2
괄호를 여러개 쳐야 할 때를 고려하며 직접 괄호를 문자열에 삽입하는 방식을 구현하는 건 너무 까다로워서,
괄호를 치는 것과 같이 연산 결과가 나오게 하는 방법에 대해 고민해 보았다.
- '-' 뒤부터 다음 '-' 앞까지 괄호를 쳐야 최소 값을 얻을 수 있다.
- 처음 '-'가 나오기 전까지의 값(= expr[0])은 양수이거나, 더하기 연산으로 이루어져 있기 때문에 eval(expr[0])을 ans에 대입해 준다.
- expr[1:]은 괄호로 감싸야하는 것들이다. 내부적으로는 + 연산자로 연결되어 있을 수 있으니 eval 함수를 통해 연산해 주고, 그 값을 ans에서 빼준다.
import sys
expr = sys.stdin.readline().split('-')
ans = eval(expr[0])
for i in expr[1:]:
ans -= eval(i)
print(ans)
틀린 이유
입력으로 '00009-00009'를 넣었을 때 Syntax Error가 발생했다.
숫자를 일일이 int형으로 바꿔줘야겠다.
✅ 접근 방식 3
접근 방식 2와 같은 로직으로 진행했으나, 숫자를 모두 int형으로 변환하기 위해 '+'에 대해서도 split
해주었다.
import sys
expr = sys.stdin.readline().rstrip().split('-')
ans = 0
# '-' 나오기 전
num = expr[0].split('+')
for i in num:
ans += int(i)
# ()로 묶을 곳
for j in expr[1:]:
num = j.split('+')
for l in num:
ans -= int(l)
print(ans)
정답이긴 하나, 반복되는 코드가 많아 enumerate()
를 사용해 아래와 같이 코드를 수정했다.
import sys
expr = sys.stdin.readline().rstrip().split('-')
ans = 0
for i, val in enumerate(expr):
num = val.split('+')
for j in num:
if i == 0:
ans += int(j)
else:
ans -= int(j)
print(ans)
enumerate
진정한 TIL, enumerate 함수!
enumerate()
는 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.
값도, 인덱스 값도 모두 얻을 수 있는 함수라 요긴하게 사용했다. 이 포스팅을 보고 다양한 사용법을 익혔다.
'Algorithm & Data structure > 알고리즘 문제 풀이' 카테고리의 다른 글
[Python][백준 BOJ Bronze I] 2869. 달팽이는 올라가고 싶다 : 반복문으로 인한 시간 초과 해결 (1) | 2023.12.05 |
---|---|
[Python][백준 BOJ Bronze I] 10989. 수 정렬하기 3 : 메모리 초과 해결, 계수 정렬 (0) | 2023.12.04 |
[Python] VSCode에서 txt파일 통한 입력값 받기 (0) | 2023.10.22 |
[Python] 입출력 : 2차원 리스트 입력받기, 공백없는 입력값(문자열, 숫자) 리스트에 각각 요소로 저장하기 (0) | 2023.10.21 |
[Python][백준 BOJ Silver Ⅱ] 9020. 골드바흐의 추측 : 에라토스테네스의 체, 범위 내에 존재하는 모든 소수 (1) | 2023.10.18 |