본문 바로가기

개발일지/TIL

TIL 23-04-19

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