Post

4. 문자열

문자열


1. 슬라이싱

  • 문자열에서 일부를 자를 수 있음. s[start:end] → end는 포함 X
1
2
3
s = "Hello World!"
print(s[0:5])   # Hello
print(s[-6:-1]) # World


예제

문자열에서 첫 번째 단어만 출력하세요.

1
2
s = "Python is powerfil"
print(s[:s.find(' ')]) # Python




2. 문자열 정렬

  • 문자열은 정렬하면 리스트가 되며, sorted()로 정렬 가능. key나 ''.join() 조합 가능.
1
2
3
s = "dcba"
print(sorted(s))          # ['a', 'b', 'c', 'd']
print(''.join(sorted(s))) # abcd


예제

문자열을 알파벳 순으로 정렬해 출력하세요.

1
2
s = "openai"
print(''.join(sorted(s))) # 출력: aeinop




3. Counter (문자 수 세기)

  • 각 문자/요소의 개수를 딕셔너리 형태로 셈.

from collections import Counter

1
2
3
4
5
from collections import Counter

s = 'banana'
count = Counter(s)
print(count) # Counter({'a': 3, 'n': 2, 'b': 1})


예제

문자열에서 가장 많이 등장한 문자를 출력하세요.

1
2
3
4
5
from collections import Counter

s = "aabbbcc"
count = Counter(s)
print(count.most_common(1)[0][0]) # b




4. 문자열 메서드 (split, join, replace, strip, lower, upper 등)

  • 문자열을 다룰 수 있는 다양한 내장 함수
1
2
3
s = " Hello Word "
print(s.strip()) # 'Hello World'
print(s.replace(" ", '-')) # "-Hello-World-"


예제

문자열에 있는 모든 공백을 제거하고 출력하세요.

1
2
s = "a b c d e"
print(s.replace(' ', '')) # abcde




5. 아스키 코드 변환 (ord(), chr())

  • 문자 ↔ 아스키 코드로 변환
1
2
print(ord('A'))  # 65
print(chr('97')) # 'a'


예제

문자열에서 아스키 코드가 가장 큰 문자를 출력하세요.

1
2
s = 'Zebra'
print(max(s, key=lambda x : ord(x))) # r





6. 실전 문제

문제 1. 회문 검증기

📘 문제 설명

문자열이 주어졌을 때,

  • 알파벳과 숫자만 남기고 (특수문자, 공백 제거)
  • 대소문자를 구분하지 않으며,

이 문자열이 회문(Palindrome) 인지 판별하시오.

회문이란 앞에서 읽으나 뒤에서 읽으나 같은 문자열을 말함. 예: madam, racecar, A man, a plan, a canal: Panama


📥 입력 형식
  • 문자열 s (1 ≤ 문자열 길이 ≤ 1000)

  • 알파벳 대소문자, 숫자, 특수문자, 공백 포함 가능

📤 출력 형식
  • 회문이면 1, 아니면 0 출력


입력 예시 1
1
A man, a plan, a canal: Panama
출력 예시 1
1
1







해설
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
def is_palindrome(letter:str) -> int:
    del_special = (''.join([word for word in map(str, letter) if word.isalnum()])).lower()
    
    if del_special == del_special[::-1]:
        return 1
    else:
        return 0

def _test_case():
    test_case = (
        ('A man, A plan, a canal: Panama', 1),
    )

    for idx, (letter, answer) in enumerate(test_case, 1):
        result = is_palindrome(letter)
        if result == answer:
            print('OK')
        else:
            print(f'FAIL \nletter: {letter}\nanswer: {answer}\nresult: {result}')


if __name__ == '__main__':
    # _test_case()
    letter = input().strip()
    print(is_palindrome(letter))





문제 2. 가장 많이 등장한 알파벳 찾기

📘 문제 설명

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.


📥 입력 형식

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

📤 출력 형식

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.


입력 예시 1
1
Mississipi
출력 예시 1
1
?


입력 예시 2
1
zZa
출력 예시 2
1
Z


입력 예시 3
1
z
출력 예시 3
1
z


입력 예시 4
1
baaa
출력 예시 3
1
A







해설
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
31
from collections import Counter

def solution(word):
    counter = Counter(word.upper())
    result = counter.most_common(2)

    return '?' if len(result) > 1 and result[0][1] == result[1][1] else result[0][0]


def _test_case():
    test_case = (
        ('Mississippi', '?'),
        ('zZa', 'Z'),
        ('z', 'Z'),
        ('baaa', 'A')
    )

    for idx, (word, answer) in enumerate(test_case, 1):
        result = solution(word)

        if result == answer:
            print(f'#{idx} OK')
        else:
            print(f'#{idx} FAIL')


if __name__ == "__main__":
    # _test_case()
    word = input().strip()
    print(solution(word))

This post is licensed under CC BY 4.0 by the author.