🧩 Algorithm/프로그래머스

[programmers] 이상한 문자 만들기, 하샤드 수

nerowiki 2024. 4. 4. 23:40
728x90
💡 오늘의 학습 키워드
- 이상한 문자 만들기
- 하샤드 수

 

이상한 문자 만들기

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12930


문제 설명

더보기
문자열 s는 한 개 이상의 단어로 구성되어 있습니다.
각 단어는 하나 이상의 공백문자로 구분되어 있습니다.
각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수,
solution을 완성하세요.
제한 사항
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

문제 회고

💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지

파이썬 언어 사용이 익숙하지 않아서 풀이 아이디어 구상 후 사용 목적에 맞는 함수를
구글링하여 풀이를 진행했습니다. 제가 생각한 문제 해결 방법은 크게 다음과 같습니다.

  1. 입력 값을 공백 단위로 리스트에 나누어 저장합니다.
  2. 리스트에 저장된 단어들을 반복문을 통해 순회합니다. 
  3. 그리고 각 단어의 알파벳을 인덱스 값을 통해 순회합니다.
  4. 알파벳 인덱스 값을 짝, 홀수에 따라 대/소문자로 변환하여 임시 변수에 저장합니다.
  5. 임시 변수에 저장된 단어를 결과 리스트에 삽입한 후 결과 값을 리턴합니다. 

range 인덱스 순회도 생각해보았지만 enumerate 함수로 인덱스 순회를 구현해보기로 결정하였습니다.
다만, 피드백을 통해 아래의 if 구문에 else는 굳이 작성하지 않아도 됨을 확인하였습니다.
그리고 변환된 단어를 리스트에 담아 다시 문자열로 바꾸는 과정을 진행하고 있는데
이부분도 그냥 문자열 변수 하나로 코드를 구현해도 문제 없다는 것을 알 수 있었습니다.

 

그리고 TC를 모두 통과하지 못한 이유는 split 함수를 제대로 사용하지 않아서라는 것을 알았습니다.
문제 해결 이전에 s.split( ) 으로 작성하여도 풀이에 문제 없을거라고 생각했지만, 문제를 다시 읽어보니
"각 단어는 하나 이상의 공백 문자로 구분되어 있다는 점"을 간과했습니다. 
s.split( )을 통해 모든 공백 문자를 삭제하고 리스트를 생성하면서 정답에 오류가 발생한 것이었습니다.
즉, 하나의 공백만 처리해 단어 사이 공백이 여러 개일때 하나의 공백 기준으로 리스트가 생성되도록
s.split(" ") 으로 작성해야 합니다. 이런 부분은 사소하지만 모른다면 큰 차이가 될 수 있으니 꼼꼼하게 체크하기!

 

💡 내가 해결한 방식은?
def solution(s):
    # 공백 단위로 구분하여 저장해주는 함수 : split()
    words = s.split(" ")
    answer = []
    
    for word in words:
        new_word = ''
        # index와 원소로 이루어진 튜플로 만들어주는 함수 : enumerate()
        for i, each in enumerate(word):
            if i % 2 == 0:
                new_word += each.upper()
            else:
                new_word += each.lower()
        # list 추가하는 함수 : append()
        answer.append(new_word)
    
    # 리스트에서 문자열로 변환해주는 함수 : join()
    return ' '.join(s for s in answer)

 

하샤드 수

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12930


문제 설명

더보기
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한 사항
x는 1 이상, 10000 이하인 정수입니다.

 

문제 회고

💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지

이 문제의 핵심은 자릿수 합을 구하는 부분입니다.
10의 자리, 100의 자리.. 자릿수 계산을 통해 더하는 방식도 있지만,
각각의 자릿수를 string 값으로 순회하여 나온 값을 int로 변환 해 바로 sum 함수로 더하는 방식을 생각했습니다.

자릿수 합을 구하는 로직을 구현했다면 나머지 하샤드 수 판별은 간단합니다.

 

💡 내가 해결한 방식은?
def solution(x):
    answer = True
    # 자릿수 합 구하기
    sum_x = sum(int(i) for i in str(x))
    # 하샤드 수 판별하기
    answer = x % sum_x == 0
    return answer

 

TIL

이상한 문자 만들기 풀이 과정에서 인덱스 순회를 enumerate 함수를 통해 구현해보니
코드가 더 간결해지는 것을 알 수 있었다. 그리고 return 할 리스트 값 오른쪽 공백을 비우는 로직에서
rstrip() 함수를 쓰면 뒤 공백을 다 지우니 괜찮겠지~ 했는데 모든 TC를 통과하지 못하고 삽질을 해버렸다.
결국 스터디 멤버 도움을 받아 answer[:-1] 코드로 하나의 공백만 지울 수 있다는 것을 알게 됐다. 
백준 풀이만 하다가 프로그래머스 TC 지옥에 처음 입문했는데 조금 더 꼼꼼하게 풀이를 진행해야겠다..

파이썬 사용한지가 백만년이라 함수를 다 잊어버려 미리 숙지하지 못한 채로 풀이를 진행하고 있는데..
시간이 아까워 풀이하면서 검색하고 맞아가면서 배우고 있다..ㅠ
리스트가 많이 사용되니 시간을 내어 리스트 개념이라도 미리 복기하면서 풀이하자..