알고리즘(파이썬)

프로그래머스 '이상한 문자열 만들기' 문제와 필요한 개념

whateveryouwish 2024. 8. 7. 18:58

41번

이상한 문자열 만들기

문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다.
각 단어는 하나 이상의 공백문자로 구분되어 있습니다.
각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수,
solution을 완성하세요.

제한 사항
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

뤼튼에 열심히 조금씩 물어봐서 완성한 내 답안

def solution(s):
    answer = []
    words = s.split(' ')
    for word in words:
        weird_word = []
        for i in range(len(word)):
            if i % 2 == 0:
                weird_word += word[i].upper()
            else:
                weird_word += word[i].lower()
        answer.append(''.join(weird_word))
    
    return ' '.join(answer)

진짜 오래도 걸렸다

알고있어야 하는 개념

1. split() 메서드

split() 함수는 파이썬의 문자열 메서드 중 하나로, 문자열을 특정 구분자(delimiter)를 기준으로 나누어 리스트로 반환하는 기능을 제공합니다. 기본적으로 공백을 기준으로 분할하지만, 다른 구분자를 지정할 수도 있습니다.

기본 사용법

 
string.split(separator, maxsplit)
  • separator: 문자열을 나누는 기준이 되는 문자열입니다. 기본값은 공백입니다.
  • maxsplit: 최대 몇 번만 나눌지를 지정하는 정수입니다. 기본값은 -1로, 모든 분할을 수행합니다.
  1. 기본 사용법 (공백 기준):
 
text = "안녕하세요, 반갑습니다."
words = text.split()  # 기본적으로 공백 기준으로 나눔
print(words)  # 출력: ['안녕하세요,', '반갑습니다.']

2. 특정 구분자 사용:

 
csv_line = "이름,나이,직업"
columns = csv_line.split(",")  # 콤마를 기준으로 나눔
print(columns)  # 출력: ['이름', '나이', '직업']

3. maxsplit 사용:

 
text = "사과,바나나,체리,딸기"
limited_split = text.split(",", 2)  # 최대 2번만 나눔
print(limited_split)  # 출력: ['사과', '바나나', '체리,딸기']

요약

  • split() 함수는 문자열을 나누어 리스트로 변환하는 데 유용하며, 기본적으로 공백을 기준으로 작동합니다.

 

2. 중첩 루프(for 문 in for 문)

 

for 문 안에 또 다른 for 문이 있는 구조를 **중첩 루프(nested loop)**라고 합니다. 이러한 중첩 루프는 주로 다차원 데이터 구조(예: 리스트의 리스트)나 반복적으로 처리해야 하는 복잡한 조건을 다룰 때 사용됩니다.

기본 구조

중첩 루프의 기본 구조는 다음과 같습니다:

 
for i in range(n):  # 외부 루프
    for j in range(m):  # 내부 루프
        # 반복할 작업

예제

  1. 2차원 리스트 처리:이 예제는 2차원 리스트(행렬)의 모든 요소를 출력합니다.
    matrix = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
    
    for row in matrix:  # 외부 루프: 각 행을 반복
        for element in row:  # 내부 루프: 행의 각 요소를 반복
            print(element)  # 각 요소 출력
    
  2. 조합 생성:이 예제는 색상과 사이즈의 모든 조합을 출력합니다.
    colors = ['red', 'blue', 'green']
    sizes = ['S', 'M', 'L']
    
    for color in colors:  # 외부 루프: 색상 반복
        for size in sizes:  # 내부 루프: 사이즈 반복
            print(f'{color} - {size}')  # 색상과 사이즈의 조합 출력
    

시간 복잡도

중첩 루프는 성능 측면에서 주의가 필요합니다. 외부 루프와 내부 루프가 각각 n과 m의 반복 횟수를 가지면, 전체 반복 횟수는 n * m이 됩니다. 따라서 데이터의 크기가 커질수록 성능에 미치는 영향이 커질 수 있습니다.

요약

  • 중첩 루프는 반복적인 작업을 처리할 때 유용하게 사용됩니다.
  • 데이터 구조가 다차원일 때 주로 사용되며, 각 차원에 대해 별도의 반복을 수행할 수 있습니다.
  • 성능을 고려하여 필요할 때만 사용해야 합니다.

 

3. 대소문자 변형 메서드

대소문자 변형 메서드는 문자열의 대문자와 소문자를 변환하는 데 사용되는 메서드입니다.

파이썬에서 이러한 변형을 수행하기 위해 주로 사용되는 메서드는 다음과 같습니다:

1. str.upper()

  • 설명: 문자열의 모든 문자를 대문자로 변환합니다.
  • 사용법:
     
    text = "hello world"
    upper_text = text.upper()
    print(upper_text)  # 출력: "HELLO WORLD"
    

2. str.lower()

  • 설명: 문자열의 모든 문자를 소문자로 변환합니다.
  • 사용법:
     
    text = "HELLO WORLD"
    lower_text = text.lower()
    print(lower_text)  # 출력: "hello world"
    

3. str.capitalize()

  • 설명: 문자열의 첫 번째 문자를 대문자로 변환하고 나머지 문자는 소문자로 변환합니다.
  • 사용법:
     
    text = "hello world"
    capitalized_text = text.capitalize()
    print(capitalized_text)  # 출력: "Hello world"
    

4. str.title()

  • 설명: 문자열의 각 단어의 첫 번째 문자를 대문자로 변환합니다. 단어는 공백이나 구두점으로 구분됩니다.
  • 사용법:
     
    text = "hello world"
    title_text = text.title()
    print(title_text)  # 출력: "Hello World"
    

5. str.swapcase()

  • 설명: 대문자는 소문자로, 소문자는 대문자로 변환합니다.
  • 사용법:
    text = "Hello World"
    swapped_text = text.swapcase()
    print(swapped_text)  # 출력: "hELLO wORLD"
    

사용 예제

이러한 메서드는 문자열의 대소문자를 조작할 때 유용하게 사용됩니다. 예를 들어, 사용자 입력을 표준화하거나, 특정 형식으로 변환할 때 자주 사용됩니다.

요약

  • upper(): 모든 문자를 대문자로.
  • lower(): 모든 문자를 소문자로.
  • capitalize(): 첫 문자만 대문자, 나머지는 소문자.
  • title(): 각 단어의 첫 문자를 대문자로.
  • swapcase(): 대문자는 소문자로, 소문자는 대문자로.

*문자열의 불변성 (Immutability)*

  1. 불변 객체: 파이썬에서 문자열은 불변 객체입니다. 이는 한 번 생성된 문자열은 그 내용을 변경할 수 없다는 의미입니다. 예를 들어, 문자열의 특정 인덱스에 있는 문자를 직접 수정할 수 없습니다.
     
    word = "hello"
    # 아래 코드는 오류를 발생시킵니다.
    word[0] = 'H'  # TypeError: 'str' object does not support item assignment
    
  2. 새로운 문자열 생성: 문자열의 일부를 변경하고 싶다면, 기존 문자열을 기반으로 새로운 문자열을 생성해야 합니다. 즉, 변환된 결과는 원래 문자열을 수정하는 것이 아니라 새로운 문자열을 반환합니다.
  • str.upper() 메서드
  • 작동 방식: str.upper() 메서드는 원래 문자열을 변경하지 않고, 모든 문자를 대문자로 변환한 새로운 문자열을 반환합니다. 원래 문자열은 여전히 동일하게 유지됩니다.
    word = "hello"
    upper_word = word.upper()  # 새로운 문자열을 생성
    print(upper_word)  # 출력: "HELLO"
    print(word)  # 출력: "hello" (원래 문자열은 변하지 않음)
    

요약

  • 문자열은 불변 객체이므로 직접 수정할 수 없습니다.
  • str.upper()와 같은 메서드는 원래 문자열을 변경하지 않고 새로운 문자열을 반환합니다.
  • 문자열의 특정 문자를 수정하려면, 새로운 문자열을 생성하거나 리스트와 같은 변경 가능한 데이터 구조를 사용해야 합니다.

이런 특성 때문에 문자열을 다룰 때는 항상 새로운 문자열을 생성하여 작업해야 한다는 점을 기억하는 것이 중요합니다.

4. 리스트를 문자열로 변환하는 join() 메서드

join() 메서드는 파이썬에서 리스트와 같은 반복 가능한(iterable) 객체의 요소들을 하나의 문자열로 결합하는 데 사용됩니다. 이 메서드는 특정 구분자를 사용하여 요소들을 연결합니다.

기본 사용법

join() 메서드는 문자열 객체에서 호출되며, 구분자로 사용할 문자열을 지정합니다. 그 뒤에 리스트(또는 다른 iterable)를 인수로 전달합니다.

구문

 
separator.join(iterable)
  • separator: 요소들을 결합할 때 사용할 문자열 (예: 공백, 쉼표, 하이픈 등).
  • iterable: 결합할 요소들을 포함하는 리스트, 튜플, 또는 다른 반복 가능한 객체.

예제

  1. 공백으로 연결하기:
     
    words = ['Hello', 'world']
    result = ' '.join(words)
    print(result)  # 출력: "Hello world"
    
  2. 쉼표로 연결하기:
    fruits = ['apple', 'banana', 'cherry']
    result = ', '.join(fruits)
    print(result)  # 출력: "apple, banana, cherry"
    
  3. 하이픈으로 연결하기:
     
    numbers = ['1', '2', '3', '4']
    result = '-'.join(numbers)
    print(result)  # 출력: "1-2-3-4"
    
  4. 빈 문자열로 연결하기:
     
    letters = ['H', 'e', 'l', 'l', 'o']
    result = ''.join(letters)
    print(result)  # 출력: "Hello"
    

주의사항

  • join() 메서드는 iterable의 모든 요소가 문자열이어야 합니다. 만약 리스트에 문자열이 아닌 다른 데이터 타입(예: 정수, 부동소수점 등)이 포함되어 있으면 TypeError가 발생합니다.
  •  
    mixed_list = ['apple', 1, 'banana']
    # result = ', '.join(mixed_list)  # TypeError 발생
    

요약

  • join() 메서드는 리스트와 같은 반복 가능한 객체의 요소들을 특정 구분자로 연결하여 하나의 문자열로 만드는 데 유용합니다.
  • 사용법은 간단하며, 다양한 구분자와 함께 활용할 수 있습니다.

5. 문자열의 앞뒤 공백을 제거하는 strip() 메서드

strip() 메서드는 파이썬에서 문자열의 앞과 뒤에 있는 공백(또는 지정된 문자)을 제거하는 데 사용됩니다. 이 메서드는 문자열을 정리하고, 불필요한 공백을 제거하여 데이터 처리를 더 깔끔하게 만들어줍니다.

기본 사용법

strip() 메서드는 문자열 객체에서 호출되며, 인수를 주지 않으면 기본적으로 공백을 제거합니다.

구문

 
string.strip([chars])
  • string: 문자열.
  • chars (선택 사항): 제거할 문자의 집합. 이 인수를 제공하면 지정된 문자들만 제거합니다.

예제

  1. 기본 사용법:
     
    text = "   Hello, World!   "
    stripped_text = text.strip()
    print(stripped_text)  # 출력: "Hello, World!"
    
  2. 특정 문자 제거:
     
    text = "---Hello, World!---"
    stripped_text = text.strip('-')
    print(stripped_text)  # 출력: "Hello, World!"
    
  3. 여러 문자 제거:
     
    text = "###Hello, World!###"
    stripped_text = text.strip('#')
    print(stripped_text)  # 출력: "Hello, World!"
    
  4. 공백과 특정 문자 동시에 제거:
     
    text = "   ---Hello, World!---   "
    stripped_text = text.strip(' -')
    print(stripped_text)  # 출력: "Hello, World!"
    

주의사항

  • strip() 메서드는 문자열의 앞과 뒤에서만 문자를 제거합니다. 문자열 중간에 있는 공백이나 문자는 제거하지 않습니다.
  •  
    text = "   Hello,   World!   "
    stripped_text = text.strip()
    print(stripped_text)  # 출력: "Hello,   World!"
    
  • strip()은 원본 문자열을 수정하지 않고, 새로운 문자열을 반환합니다.

요약

  • strip() 메서드는 문자열의 앞과 뒤에서 공백이나 지정된 문자를 제거하는 데 유용합니다.
  • 기본적으로는 공백을 제거하며, 특정 문자를 지정하면 해당 문자만 제거할 수 있습니다.

 

'알고리즘(파이썬)' 카테고리의 다른 글

알고리즘 46-48  (1) 2024.08.13
43번-45번  (0) 2024.08.08