[코딩테스트] Python - 문자열

김희정·2024년 2월 6일
0

Coding Test

목록 보기
2/3

들어가며

Python으로 코딩 테스트를 준비하며 관련 기능들을 정리해보았습니다.먼저 가장 기본인 문자열에 대해 정리해보았습니다.


1. 문자열

문자열(string)이란 문자, 단어 등으로 구성된 문자들의 집합을 의미합니다.


1.1 문자열 생성

문자열은 아래와 같은 방법으로 생성할 수 있습니다.

One Line

큰 따옴표("), 작은 따옴표(')로 문자열을 생성할 수 있습니다.

a = 'Hello World!'
b = "Welcome to Twinkle's Blog!"

\n과 같은 이스케이프 문자을 이용하면 한줄의 코드 임에도 여러 줄로 생성할 수 있습니다.

a = "Hello World!\n Welcome to Twinkle's Blog!"

이스케이프(escape) 코드

이스케이프 코드란 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 ‘문자 조합’을 말한다.
주로 출력물을 보기 좋게 정렬하는 용도로 사용한다. 몇 가지 이스케이프 코드를 정리하면 다음과 같다.

코드설명
\n문자열 안에서 줄을 바꿀 때 사용
\t문자열 사이에 탭 간격을 줄 때 사용
\\를 그대로 표현할 때 사용
\'작은따옴표(')를 그대로 표현할 때 사용
\"큰따옴표(")를 그대로 표현할 때 사용
\r캐리지 리턴(줄 바꿈 문자, 커서를 현재 줄의 가장 앞으로 이동)
\f폼 피드(줄 바꿈 문자, 커서를 현재 줄의 다음 줄로 이동)
\a벨 소리(출력할 때 PC 스피커에서 '삑' 소리가 난다)
\b백 스페이스
\000널 문자

Multi-line

하지만 긴 글이라면 이스케이프 문자로 표현하면 코드가 굉장히 복잡해지고 읽기 어려워지겠지요. 그래서 이러한 어려움을 해결하기 위해 멀티라인으로 문자열을 생성하는 것이 등장했습니다.

큰따옴표 세개("""), 작은 따옴표 세개(''')로 멀티라인 문자열을 생성할 수 있습니다.

a = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
"""

str() 함수

파이썬의 str() 내장 함수는 다른 자료형(정수, 실수, 리스트, 딕셔너리 등)을 문자열로 바꿔주는 함수입니다.

# Int
a = 10

# Double
a = 3.14159

# Dict
a = {'key': 'value'}

# List
a = ['s1', 's2', 's3']

print(str(a))

1.2 문자열 연산

파이썬에서는 문자열을 더하거나 곱할 수 있습니다.

문자열 더하기는 많아도 곱하기는 다른 언어에서는 쉽게 찾아볼 수 없는 재미있는 기능으로, 우리 생각을 그대로 반영해 주는 파이썬만의 장점이라고 할 수 있습니다.

noun = "Python ";
verb = "is ";
adjective = "fun";

# 1. 더하기
print(noun + verb + adjective); # 출력 ⇒ Python is fun

# 2. 곱하기
print(noun * 2) # 출력 ⇒ Python Python

곱하기를 응용하면 다음과 같은 효과를 낼수 있습니다.

print("=" * 50)
print("Welcome to my program")
print("=" * 50)
==================================================
Welcome to my program
==================================================

프로그램을 시작할 때, 이런 텍스트를 넣어주면 보기 좋지 않을까요?


1.3 인덱싱, 슬라이싱

파이썬이 코딩테스트에서 강력한 이유는 문자열을 다루는 것, 즉 문자열 슬라이싱에 있는데요. 그 이유를 알아봅시다.

먼저, 인덱싱(indexing)이란 무엇인가를 ‘가리킨다’, 슬라이싱(slicing)은 무엇인가를 ‘잘라 낸다’라는 의미를 갖습니다.


🔍 인덱싱

syntax

variable[index];

문자열 인덱싱은 변수 뒤에 index 번호를 붙여, 해당 인덱스에 해당하는 문자열을 얻을 수 있습니다.

a = "Hello World"
print(f"len(a): {len(a)}") # 출력 ⇒ len(a): 11

index 대입

a 변수에 저장된 문자열에 인덱스를 대입해보면 아래와 같습니다.

HelloWorld
012345678910

문자열의 길이는 11이지만 인덱스는 0부터 시작하여, 최대 인덱스는 10입니다.

a = "Hello World"
print(f"a[0]: {a[0]}") # 출력 ⇒ a[0]: H
print(f"a[10]: {a[10]}") # 출력 ⇒ a[10]: d
print(f"a[11]: {a[11]}") # 출력 ⇒ IndexError

대부분의 프로그래밍 언어는 인덱스가 0부터 시작합니다. 그 이유는 0부터 시작하면 많은 것이 편리해지기 때문입니다.

배열의 index는 왜 0부터 시작할까?

위의 글을 읽어보면 좋을 것 같습니다.


문자열 뒤에서 읽기

a = "Hello World"
print(f"a[0]: {a[0]}") # 출력 ⇒ a[0]: H
print(f"a[-1]: {a[-1]}") # 출력 => a[-1]: d

-(빼기) 기호를 통해 문자열을 뒤에서부터 읽을 수도 있습니다.


IndexError

인덱스의 범위를 벗어날 경우, IndexError를 발생시킵니다.

print(f"a[[13]: {a[13]}")
IndexError: string index out of range

try-except 구문을 통해 Error가 발생하더라도 종료가 안되도록 Error를 탈피할 수 있습니다.

try:
	print(f"a[[13]: {a[13]}");
except IndexError:
	print("Index 에러 발생");

✂ 슬라이싱

variable[[start]:[end][:step]]

시작(Start) 인덱스부터 마지막(End) 인덱스까지 단계(step)를 거쳐 문자열을 슬라이싱할 수 있습니다. start와 end 사이의 콜론을 제외하면 모두 생략 가능합니다.

a = "Hello World"
print(f"a[:5]: {a[:5]}") # 출력 ⇒ a[:5]: Hello
print(f"a[:]: {a[:]}") # 출력 ⇒ a[:]: Hello World
print(f"a[::2]: {a[::2]}") # 출력 ⇒ a[::2]: HloWrd

-(빼기) 기호를 통해 문자열의 역순을 출력 하는 기능도 응용 가능합니다.

print(f"a[::-1]: {a[::-1]}") # 출력 ⇒ a[-1::-1]: dlroW olleH

슬라이싱은 인덱스 범위를 벗어나도 에러를 뱉지 않습니다.


1.4 문자열 포맷팅

문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법입니다. 실무에서는 문자열을 그대로 출력하는 것보다는 문자열 안에 값을 삽입하여 사용됩니다.

% 문자

% 문자를 통해 문자열을 포맷팅할 수 있습니다.

print("I eat %d apples." % 3)

'I eat 3 apples.'

2개 이상 넣을 때는 아래와 같이 사용합니다.

number = 10
day = "three"
print("I ate %d apples. so I was sick for %s days." % (number, day))

'I ate 10 apples. so I was sick for three days.'

2개 이상의 값을 넣으려면 마지막 % 다음 괄호 안에 쉼표(,)로 구분하여 각각의 값을 넣어 주면 됩니다.


포맷 코드

문자열 안에 들어간 %d%s를 문자열 포맷 코드라고 합니다. %d%s 만 사용했지만, 이 밖에도 다양한 것들이 있습니다.

문자열 포맷 코드의 종류는 다음과 같습니다.

코드설명
%s문자열(String)
%c문자 1개(character)
%d정수(Integer)
%f부동소수(floating-point)
%o8진수
%x16진수
%%Literal % (문자 % 자체)

포맷 코드와 숫자 함께 사용하기

포맷 코드와 숫자를 함께 사용하면 다양한 효과를 줄 수 있습니다.

정렬과 공백

포맷 코드 앞에 정수를 사용하면 공백 효과를 줄 수 있습니다.

print("%10s" % "hi")
'        hi'

%10s는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백으로 남겨 두라는 의미입니다.

print("%-10sjane." % 'hi')
'hi        jane.'

그렇다면 반대쪽인 왼쪽 정렬은 %-10s가 될 것입니다.


소수점 표현하기

print("%0.2f" % 3.141592)
'3.14'

3.141592를 소수점 두 번째 자리까지만 나타내고 싶은 경우에는 위와 같이 작성합니다. %0.2f에서 ‘.’는 소수점 포인트, 그 뒤의 숫자 2는 소수점 뒤에 나올 숫자의 개수를 의미합니다.


format 메소드를 사용한 포매팅

문자열의 format 메소드를 사용하면 좀 더 발전된 형태로 포매팅할 수 있습니다.

print("I eat {0} apples".format(3))
'I eat 3 apples'

2개 이상의 값을 넣을 때는 다음과 같이 사용합니다.

print("I ate {0} apples. so I was sick for {1} days.".format(10, 'three'))
'I ate 10 apples. so I was sick for three days.'

이름을 지정해서 넣기도 가능합니다.

print("I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3))
'I ate 10 apples. so I was sick for 3 days.'

f 문자열 포매팅

파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있습니다. 파이썬 3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의해야합니다.

name = '홍길동'
age = 30
print(f'나의 이름은 {name}입니다. 나이는 {age}입니다.')
'나의 이름은 홍길동입니다. 나이는 30입니다.'

f 문자열 포매팅은 위와 같이 name, age와 같은 변숫값을 생성한 후에 그 값을 참조할 수 있습니다. 또한 f 문자열 포매팅은 표현식을 지원하기 때문에 중괄호 안의 변수를 계산식과 함께 사용하는 것도 가능합니다.

age = 30
print(f'나는 내년이면 {age + 1}살이 된다.')
'나는 내년이면 31살이 된다.'

2. 문자열 관련 함수, 메소드

일반적으로, 함수와 메소드는 구별하기 어렵습니다. 어떻게 보면 모두 함수의 일환이기 때문이죠.

함수란?

하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드의 집합입니다. 함수로 구현된 기능은 여러 곳에서 호출되어 사용이 가능합니다.

메서드란?

객체의 기능을 구현하기 위한 클래스 내부에 구현되는 함수로, 멤버 함수라고도 합니다. 메서드를 구현하면 객체의 기능을 구현하는 것입니다.

함수와 메소드의 차이

함수는 어디에 속해있지 않고 단독 모듈이라 함수를 그냥 호출하여 사용이 가능하지만, 메소드는 클래스 안에 속해 있고 클래스의 멤버 변수들을 이용해서 구현되어 있어 객체를 통해서 사용 가능합니다.


2.1 함수

내장함수

파이썬에서는 자주 사용되는 함수를 내장 함수(Built-in Functions)라는 이름으로 기본적으로 제공합니다.

우리는 이미 몇 가지 내장 함수를 사용하고 있습니다. print, len 과 같은 것이 내장함수입니다.이러한 파이썬 내장 함수는 파이썬 모듈과 달리 import가 필요하지 않기 때문에 아무런 설정 없이 바로 사용할 수 있습니다.


len(): 문자열 길이

문자열의 길이는 다음과 같이 len 함수를 사용하면 구할 수 있습니다. len 함수는 print 함수처럼 파이썬의 기본 내장 함수로, 별다른 설정 없이 바로 사용할 수 있습니다.

a = 'Hello World'
print(f"길이: {len(a)}")

str(): 문자열로 변환

str 함수 또한 파이썬 기본 내장 함수로서 다른 자료형을 문자열로 변환할 때 사용합니다.

a = 1
print(str(a))

2.2 메소드

count() - 문자 개수 세기

a = 'hobby'
print(a.count('b')) # 출력: 2

문자열에서 매개변수로 받은 문자열의 갯수를 알려주는 메소드입니다.


find() - 위치 알려주기 1

a = "Python is the best choice"
print(a.find('b')) # 출력: 14
print(a.find('k')) # 출력: -1

문자열에서 매개변수로 받은 문자열의 위치를 알려주는 메소드입니다. 문자열이 있으면 해당 문자열의 index를 알려주고 없으면 -1을 반환합니다.


index() - 위치 알려주기 2

a = "Python is the best choice"
print(a.index('b')) # 출력: 14
print(a.index('k')) # 에러 발생

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found

join() - 문자열 삽입, 합치기

print(",".join('abcd'))
'a,b,c,d'

join 메소드로 abcd 문자열의 각각의 문자 사이에 ‘,’를 삽입했습니다. join 메소드는 문자열 뿐만 아니라 리스트나 튜플도 입력으로 사용할 수 있습니다.

리스트나 튜플이 입력으로 사용될 경우, 원소를 하나의 문자열로 합치는 기능으로 활용될 수 있습니다.

print(",".join(['a', 'b', 'c', 'd']))
'a,b,c,d'

upper() - 소문자를 대문자로 바꾸기

upper() 메소드는 문자열의 대문자를 소문자로 바꾸는 기능을 갖고 있습니다.

a = "hi"
print(a.upper()) # 출력: HI

isupper() 메소드는 문자가 소문자인지 검사할 수 있습니다.

a = "H"
print(a.isupper()) # 출력: True

lower() - 대문자를 소문자로 바꾸기

lower() 메소드는 문자열의 대문자를 소문자로 바꾸는 기능을 갖고 있습니다.

a = "HI"
print(a.upper()) # 출력: hi

islower() 메소드는 문자가 소문자인지 검사할 수 있습니다.

a = "H"
print(a.islower()) # 출력: False

strip() - 공백 지우기

a = "    hi    "

strip() 메소드를 통해 양쪽 공백을 지울 수 있습니다.

# 양쪽 공백 지우기
print(a.strip())
'hi'

lstrip() 메소드를 이용하면 왼쪽 공백만 지울 수 있습니다.

# 왼쪽 공백 지우기
print(a.lstrip())
'hi    '

rstrip() 메소드를 이용하면 오른쪽 공백만 지울 수 있습니다.

# 오른쪽 공백 지우기
print(a.rstrip())
'    hi'

replace() - 문자열 바꾸기

replace 메소드는 replace(바뀔문자열, 바꿀문자열)처럼 사용해서 문자열 안의 특정한 값을 다른 값으로 치환해줍니다.

a = "Life is too short"
print(a.replace("Life", "Your leg"))
'Your leg is too short'

split() - 문자열 나누기

a = "Life is too short"
print(a.split())
['Life', 'is', 'too', 'short']

b = "a:b:c:d"
print(b.split(':'))
['a', 'b', 'c', 'd']

split 메소드는 a.split()처럼 괄호 안에 아무 값도 넣어 주지 않으면 공백(Space, Tab, Enter)을 기준으로 문자열을 나누어 줍니다.

만약 b.split(':')처럼 괄호 안에 특정 값이 있을 경우에는 괄호 안의 값을 구분자로 해서 문자열을 나누어 주고, 이렇게 나눈 값은 리스트에 하나씩 들어갑니다.


startsWith() - 특정 문자열로 시작하는지 확인

문자열이 특정 문자열로 시작하는지를 검사하는 메소드입니다.

string.startswith(value[, start[, end]])

검사할 문자열(value)을 넣어 시작(start) 위치와 종료(end) 위치를 지정해 검사할 수도 있습니다. 이는 생략 가능합니다.

a = 'Hello world, Python!'
if a.startswith('Hello'):
    print('It starts with Hello')

if a.startsWith('hello'):
	print('It starts with hello')

if a.lower().startsWith('hello'):
	print('It starts with hello using lower')

startWith() 메소드는 대소문자를 구분하기 때문에, 만약 대소문자를 구분하고 싶지 않다면 lower() 메소드로 소문자로 변경 후 비교할 수 있습니다.


endsWith() - 특정 문자열로 끝나는지 확인

문자열이 특정 문자열로 끝나는지를 검사하는 메소드입니다.

string.endswith(value, start, end)

검사할 문자열(value)을 넣어 시작(start) 위치와 종료(end) 위치를 지정해 검사할 수도 있습니다. 이는 생략 가능합니다.

a = 'Hello world, Python!'
if a.endswith('Python'):
    print('It ends with Python')

startsWith와 유사하게 대소문자를 구분하기 때문에, 만약 대소문자를 구분하고 싶지 않다면 lower() 메소드로 소문자로 변경 후 비교할 수 있습니다.


References

profile
Java, Spring 기반 풀스택 개발자의 개발 블로그입니다.

0개의 댓글