1. [페어프로그래밍] 프로그래머스 입문 - 숫자 찾기
문제점
정수 num과 k가 매개변수로 주어질 때,
num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고
없으면 -1을 return 하도록 solution 함수를 완성해보세요.
# num , k는 int
# return은 num에 k가 있으면 자릿수 return,
# 없으면 -1 return
시도해 본 것들
num에서의 자릿수를 파악하기 위한 index 사용
index를 사용할 수 있도록 하기 위한 str로 형변환
index의 결과값이 0부터 시작하고 요구하는 return값은 1부터 시작하므로 index값에 +1 추가
num 안에 k가 없는 경우에 발생하는 ValueError를 해결하기 위해 try, except 사용
해결 방법
def solution(num, k):
# num , k는 int
# return은 num에 k가 있으면 자릿수 return,
# 없으면 -1 return
str_num = str(num)
str_k = str(k)
try:
answer = str_num.index(str_k)+1
except ValueError:
answer = -1
return answer
사용법은 알고 있었지만, try와 except를 이용해서 정확히 error의 종류까지 지정해서 써보기는 처음이다.
# 혼자 풀었을 때 코드
def solution(num, k):
answer = 0
count = 0
num = str(num)
# k가 없는 경우를 먼저 조건문으로 확인
if str(k) not in num:
answer = -1
return answer
# 반복문으로 n과 k가 일치하는 순간을 찾음
for n in num:
# 자릿수를 위해 count를 더 해줌
count += 1
if int(n) == k:
print(n)
answer = count
break
return answer
for문과 if문만으로 열심히 만들었다 싶은 생각이 들지만 코드를 보자마자 바꾸고 싶은 부분들이 보인다.
# 혼자 풀었을 때 코드 리팩토링
def solution(num, k):
answer = -1
num = str(num)
# 반복문으로 n과 k가 일치하는 순간을 찾음
for i, n in enumerate(num, 1):
if int(n) == k:
answer = i
break
return answer
enumerate를 모르고 풀었을 때의 코드를 살짝 바꿨을 때 코드의 양은 줄였지만, 반복문이 없는 페어프로그래밍의 코드가 더 좋아 보인다.
알게 된 점
python 내장 함수를 알아가면서 시간복잡도와 가독성이 모두 개선되는 것을 나의 경험으로 느끼면서 뿌듯하다.
아직 어설프지만 주석으로 필요한 내용과 그 방법을 찾고 시작하는 게 소요 시간뿐 아니라 코드의 퀄리티에도 상당한 영향을 주는 것 같다.
if문으로 예외 처리를 하는 것보다 예외를 마주한 뒤 try, except로 처리하니 예외가 발생한 함수의 사용법도 더 잘 이해하게 되는 것 같다.
1. 백준 알고리즘 문제 - 알파벳 개수
문제점
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
# dict를 사용해서 알파벳은 key 값 value에서 count 하기 <- 단순히 +1씩만 한다면 dcitionary를 사용하기 아쉬움
# 리스트 사용하기
시도해 본 것들
알파벳 순서에 대응하는 빈 리스트 만들기
ord를 통해서 알파벳을 숫자로 바꾸고 그 값에서 ord('a')를 빼면서 리스트의 순서와 일치시킴 <- ord('a') - ord('a') = 0번째 리스트
join을 사용해서 count 한 숫자를 print() 시도 <- count를 위해 int형으로 집어넣어서 str이 아니므로 join 불가능함
list를 for문을 돌리지 않고 다른 방법을 쓰고 싶었음 <- 가독성, 시간 복잡도에 악영향
List Comprehension을 사용해 봄 <- for문을 사용한 것은 동일했으나 코드의 길이가 한 줄로 줄어들며 간결해짐
해결 방법
alpha_list = [0]*26
str_input = input()
for str_ in str_input:
alpha_num = ord(str_) - ord('a')
alpha_list[alpha_num] += 1
# List Comprehension
str_alpha_list = [str(x)for x in alpha_list]
print(' '.join(str_alpha_list))
알게 된 점
빈 리스트와 ord를 통한 알파벳 카운팅을 실제 문제에 적용하며 이해를 높일 수 있었다.
List Comprehension이라는 방법을 통해 같은 코드여도 좀 더 간결하면서 가독성이 떨어지지 않는 코드를 작성할 수 있다.
'개발일지 > TIL' 카테고리의 다른 글
TIL 23-04-21 페어 프로그래밍 - 연속된 수의 합 (0) | 2023.04.21 |
---|---|
TIL 23-04-20 페어 프로그래밍 - 직사각형 넓이 구하기 (0) | 2023.04.20 |
TIL 23-04-18 (1) | 2023.04.18 |
TIL 23-04-17 (0) | 2023.04.17 |
TIL 23-04-16 (0) | 2023.04.16 |