[백준 x Python] 2강
지금 까지 배운 내용을 가지고는 아마 사칙연산 문제를 풀기 위해
a,b = input().split()
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)
이런 코드를 떠올리셨을 겁니다. 근데 런타임 에러가 뜨죠?
이번시간에는 어디가 문제인지를 알아보도록 합시다.
이번시간에는 문자열에대한 추가적인 내용과 리스트에대해 알아볼 것 입니다. 이 과정을 통해 사칙연산문제와 기본입출력 문제를 전부 풀수 있습니다!
문자열 곱하기
숫자랑 숫자를 곱하기 연산은 해봤는데 문자에 숫자를 곱하면 무엇이 나올까요?
print("=" * 50)
print("My Program")
print("=" * 50)
여기서 *는 일반적인 곱하기의 의미가 아니라 '문자열의 반복'을 뜻하는 의미로 사용되었습니다.
문자열 길이 구하기
a = "Life is too short" print(len(a))
문자열의 길이는 기본내장 함수인 len()함수를 사용하면 직관적으로 구할 수 있습니다. 헷갈리지 말아야할 부분은 공백까지 하나의 문자열로 생각해 길이로 추가한다는 점입니다.
문자열 인덱싱
파이썬은 어떤 문자열 에대해 문자열[몇번째] 이런식으로 작성하면 그 번호에 헤당하는 값을 뽑아낼 수 있습니다.
a = "Life is too short, You need Python"
print(a[3])
이걸 출력하면 답이 e 가 나옵니다. 왤까요?
a[0]:'L', a[1]:'i', a[2]:'f', a[3]:'e', a[4]:' ', ...
파이썬은 이와같이 순서를 0번부터 시작합니다. 또한 사람과 다르게 공백을 단어와 단어로 구분하는 개념이 아니라 그냥 여러개의 알파벳과 공백의 조합이라고 생각하기 때문에 한글자 한글자에 순서 즉, index를 부여하게 됩니다. 이러한 인덱스를 이용해 문자열 안의 특정 값을 뽑아내는 과정을 인덱싱이라고 합니다.
인덱싱 활용하기
>>> a = "Life is too short, You need Python"
>>> a[0]
'L'
>>> a[12]
's'
>>> a[-1]
'n'
>>> a[-0]
'L'
>>> a[-2]
'o'
>>> a[-5]
'y'
우리는 앞에서부터 순서를 매길때에는 0,1,2,3,......이고
뒤에서 부터 순서를 매길 때에는 -1,-2,-3,,,,,,,라는 것을 알수 있습니다.
여기서 a[-1] 가 정말 중요한 이유는 나중에 문자열의 길이가 고정되지 않거나 서로 다르거나 모를경우 맨끝 인덱싱을 해야하는 경우가 종종 등장하는데 그때 이걸 써주면 좋습니다.
문자열 슬라이싱
a = "Life is too short, You need Python"
a[0] + a[1] + a[2] + a[3] + a[4]
를 출력하고 싶다고 해봅니다. 이걸 간편하게 줄이는 방법이 존재합니다.
>>> a[0:5]
'Life '
우리는 a[4]까지 더해지길 원했는데 끝번호가 5인것을 보고 의아하실 수 있습니다. 우리가 처음 설정했던 a문자열의 일부분을 시작과 끝부분을 정해 잘라내는 방법을 슬라이싱이라고 합니다.
슬라이싱은 문자열[시작번호:끝번호] 로 작성하는데 끝번호는 출력에 들어가지 않는, 즉 우리가 출력하고 싶어하는 인덱스보다 하나더 큰 수를 넣어주면 됩니다.
>>> a[5:7]
'is'
>>> a[12:17]
'short'
이렇게 응용할수 있습니다.
>>> a[19:]
'You need Python'
>>> a[:17]
'Life is too short'
>>> a[:]
'Life is too short, You need Python'
>>> a[19:-7]
'You need'
시작번호를 생략하면 문자열의 처음부터 끝번호 까지, 끝번호를 생략하면 문자열의 시작번호부터 끝까지, 둘다생략하면 전체를 출력합니다.
앞선 인덱싱에서 봤듯이 마이너스를 사용할수 있습니다. 마이너스가 들어가면 헷갈리실수 있는데 마찬가지로 우리가 출력하는 인덱스보다 하나큰수를 넣어주기 때문에 19에서 -8까지 출력됩니다.
슬라이싱 활용
>>> a = "20010331Rainy"
>>> date = a[:8]
>>> weather = a[8:]
>>> date
'20010331'
>>> weather
'Rainy'
문자열을 둘로 나눠 새로운 의미로 담을 수 도 있습니다.
아래 코드를 작성하면 문자열 자료형은 그 요솟값을 변경할수 없기에 오류가 뜹니다.
>>> a = "Pithon"
>>> a[1]
'i'
>>> a[1] = 'y'
그렇지만 이 슬라이싱 기법을 이용하면 요솟값을 바꾸는게 아니라 필요한 부분만 자르고 부족한 부분을 병합으로 처리해 새로운 문자열을 만들 수 있습니다.
>>> a = "Pithon"
>>> a[:1]
'P'
>>> a[2:]
'thon'
>>> a[:1] + 'y' + a[2:]
'Python'
문자열 관련 유용한 함수들
count() : 문자열 .count(갯수를 세고싶은 문자) = > 그 문자의 개수출력
>>> a = "hobby"
>>> a.count('b')
2
find() : 문자열.find(찾는문자) => 문자열에서 문자가 처음으로 나온위치 , 존재하지 않으면 -1반환
>>> a = "Python is the best choice"
>>> a.find('b')
14
>>> a.find('k')
-1
index() : 문자열.index(찾는문자) => 문자가 처음으로 나온위치, 존재하지 않으면 오류
>>> a = "Life is too short"
>>> a.index('t')
8
>>> a.index('k')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
join() : 삽입할문자.join(원본문자열) => 각각문자 사이에 삽입할 문자를 삽입한다.
>>> ",".join('abcd')
'a,b,c,d'
>>> ",".join(['a', 'b', 'c', 'd'])
'a,b,c,d'
replace(): 전체문자열.replace(바뀌게 될 문자열, 바꿀 문자열) => 바뀌게될 문자열을 바꿀 문자열로 바꿔서 전체문자열을 출력한다.
>>> a = "Life is too short"
>>> a.replace("Life", "Your leg")
'Your leg is too short'
지난번에 봤던 split함수입니다. 이걸 출력하지는 않았었는데 이번에 이를 출력해보니 새로운 형태로 나오는 것을 확인할 수 있습니다. 이게바로 '리스트'라는 자료형 입니다. 이 때문에 처음에 언급한 코드가 런타임에러를 출력하는것입니다.
>>> a = "Life is too short"
>>> a.split()
['Life', 'is', 'too', 'short']
>>> b = "a:b:c:d"
>>> b.split(':')
['a', 'b', 'c', 'd']
리스트
odd = [1, 3, 5, 7, 9]
리스트명 = [요소1, 요소2, 요소3, ...]
a = []
b = [1, 2, 3]
c = ['Life', 'is', 'too', 'short']
d = [1, 2, 'Life', 'is']
e = [1, 2, ['Life', 'is']]
다음 예시들 처럼 대괄호([ ])로 감싸 주고 각 요솟값은 쉼표(,)로 구분해주는 자료형이 리스트 입니다. 리스트 안의 요소는 서로다른 자료형이어도 상관이 없고 어떠한 자료형도 전부 포함 할 수 있습니다.e처럼 리스트 자신을 포함할 수도 있습니다. 또 어떤 요소도 포함되지않는 a와같이 빈 리스트를 만들수도 있습니다.
리스트는 앞서 살펴본 문자열에쓰이는 함수들과 많이 사용이 겹칩니다.
리스트 인덱싱
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[0]
1
>>> a[0] + a[2]
4
>>> a[-1]
3
>>> a = [1, 2, 3, ['a', 'b', 'c']]
>>> a[0]
1
>>> a[-1]
['a', 'b', 'c']
>>> a[3]
['a', 'b', 'c']
>>> a[-1][0]
'a'
>>> a[-1][1]
'b'
>>> a[-1][2]
'c'
>>> a = [1, 2, ['a', 'b', ['Life', 'is']]]
>>> a[2][2][0]
'Life'
앞선 문자열과 마찬가지로 같은 방법으로 인덱스를 부여합니다. 아까의 문자열과의 차이점은 마지막 예시처럼 'life' 와같은 요소도 하나의 요소로써 전체가 하나의 인덱스 를 가진다는 점입니다. 마찬가지로 음수를 사용하는 것도 가능하고 내부요소가 리스트인 경우에는 또다시 인덱싱을 할수도 있습니다.
a = [1,2,3,4,5]
a[1] = "u"
print(a)
앞선 문자열과는 다르게 요소값을 이처럼 수정할 수도 있습니다.
리스트 슬라이싱
>>> a = "12345"
>>> a[0:2]
'12'
>>> a = [1, 2, 3, 4, 5]
>>> a[0:2]
[1, 2]
문자열과 사용법이 완전히 똑같다는것을 알수 있습니다.
>>> a = [1, 2, 3, 4, 5]
>>> b = a[:2]
>>> c = a[2:]
>>> b
[1, 2]
>>> c
[3, 4, 5]
리스트가 포함된 중첩 리스트 역시 슬라이싱 방법은 똑같이 적용된다.
>>> a = [1, 2, 3, ['a', 'b', 'c'], 4, 5]
>>> a[2:5]
[3, ['a', 'b', 'c'], 4]
>>> a[3][:2]
['a', 'b']
리스트 연산
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
문자열 처럼 병합할수 있고
>>> a = [1, 2, 3]
>>> a * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
문자열처럼 *기호를 이용해 반복할수도 있습니다.
>>> a = [1, 2, 3]
>>> len(a)
3
아까봤던 len함수를 이용해 길이를 구할수도 있습니다.
리스트 타입변환
>>> a = [1, 2, 3]
>>> a[2] + "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str
저번에 살펴봤던 타입에러 처럼 a[2]는 2라는 정수인데 'hi'라는 문자열을 병합하려고 시도했으니 오류가 발생한 것입니다.
>>>str(a[2]) + "hi"
이렇게 해결할 수 있습니다.
드디어 문제 풀어보기
>>> a = "Life is too short"
>>> a.split()
['Life', 'is', 'too', 'short']
>>> b = "a:b:c:d"
>>> b.split(':')
['a', 'b', 'c', 'd']
문제로 돌아와 다시 이 split함수를 살펴보겠습니다. 이제는 이 결과물이 list형태라는 것이 보이시죠?
num = input().split()
print(num)
전처럼 input에 1 2 3 4 를 넣고 출력하면 ['1','2','3','4']로 출력 되는 것을 알수 있습니다. split함수는 특정조건을 기준으로 분류해 이를 리스트 형태로 만들어주는 함수라는 것을 알수 있습니다.
a = 1 2 3 4
a.split()
print(a)
이렇게 출력해 보겠습니다.
SyntaxError: invalid syntax 이게 뜰것입니다.
위코드랑 아래코드랑 다른게 없어보이는데 왜그럴까요?
a= '1 2 3 4'
b= a.split()
print(b)
이코드를 출력해보겠습니다. 즉, 파이썬은 input() 함수를 통해 입력값을 받을때 우리가 1 2 3 4 이런식으로 어떠한 형식도 지정해 주지 않았지만 이것이 단일 숫자가 아니기에 자동으로 '1 2 3 4' 와 같은 문자형으로 처리해서 생각한다는 것입니다.
a= '1 2 3 4'
b= a.split()[1]
print(b)
이 코드를 출력하면 b는 우리가 생각했을때 아무리 봐도 숫자인 2가 나옵니다. 실제로 그럴까요?
a= '1 2 3 4'
b= a.split()[1]
print(b+1)
TypeError 가 발생했습니다. b는 사실 문자열이였던 것입니다. !
쉽게 생각하면 split을 통해 분류된 요소들은 전부 문자열의 형태로 들어가게 되고 그 문자열들이 여러개가 있는것을 하나의 변수로 받게되면 자동으로 리스트 형태가 되는것 입니다.
a,b = input().split()
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)
이제 맨처음 코드의 어디가 잘못되었는지 보이시나요?
우리는 인풋값을 3 7 을 준다 하더라도 우리눈에 보이지는 않지만 a = '3' b='7'로 타입을 문자형으로 인식해서 처리해줍니다. 따라서
a,b=input().split()
print(a+1)
이코드도 타입에러가 발생하는 것입니다.
a,b=input().split()
print(a)
이렇게 a만 출력했을때 마치 우리가
a = "hello world!"
print(a)
일때 따옴표를 제외한 hello world!만 출력된다는 것과 결국 마찬가지로
a ="3" 이지만 print(a) 는 3으로 출력되어 우리가이것을 숫자형으로 착각했던 것입니다.
이처럼 파이썬에서 문제를 풀때 문자형과 숫자형을 혼동해 타입에러가 발생하는 일은 빈번합니다. 당황하지말고 지난시간에 배운 int() 또는 str() 을 활용합시다.
a,b = input().split()
a = int(a)
b= int(b)
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)
성공인가요?
이 코드를 보니 의문이 하나또 듭니다.
그냥 a,b = input().split() 여기에
int(input().split())를 추가하면 안되나?
또에러입니다.
TypeError
int() argument must be a string, a bytes-like object or a number, not 'list'
int() 함수는 리스트를 변환할수 없다고 뜨네요.
그럼 우리가 귀찮게 하나하나를 바꿔줘야하는가?
파이썬은 극한의 효율을 추구하기에 그거에 헤당하는 함수가 또 존재합니다. 진짜진짜 많이 사용하니 꼭 알아두세요
map()
>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))
>>> a
[1, 2, 3, 4]
일단 이걸 출력해보면 a의 요소는 전부 정수형으로 바뀐것을 알수 있습니다.
map(모든요소에 대해 시행하고 싶은, 대상이되는 리스트)
map에 int와 리스트를 넣으면 리스트의 모든 요소를 int를 사용해서 변환합니다. 그다음에 list를 사용해서 map의 결과를 다시 리스트로 만들어줍니다.
a,b=map(int,input().split())
print(a+1)
이제 a는 숫자형으로 처리되었음을 알수 있습니다.
만일 인풋값을 리스트로 받고싶다면
num = list(map(int,input().split()))
a = num[1]
print(a+1)
list() 는 리스트로 자료형을 변환해주는 함수입니다.
사칙연산
a,b = map(int,input().split())
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)
num = list(map(int,input().split()))
a = num[0]
b = num[1]
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)
제 풀이는 이러합니다. 충분히 다른방식으로도 풀수있으니 다양하게 고민해보세요!
리스트 활용
리스트 값 수정
>>> a = [1, 2, 3]
>>> a[2] = 4
>>> a
[1, 2, 4]
리스트 요소 삭제
>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]
>>> a = [1, 2, 3, 4, 5]
>>> del a[2:]
>>> a
[1, 2]
리스트에 요소 추가
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> a.append([5,6])
>>> a
[1, 2, 3, 4, [5, 6]]
리스트 정렬
>>> a = [1, 4, 3, 2]
>>> a.sort()
>>> a
[1, 2, 3, 4]
>>> a = ['a', 'c', 'b']
>>> a.sort()
>>> a
['a', 'b', 'c']
리스트 뒤집기
>>> a = ['a', 'c', 'b']
>>> a.reverse()
>>> a
['b', 'c', 'a']
>>> a = [1, 4, 3, 2]
>>> a.sort(reverse =True)
>>> a
[4, 3, 2, 1]
위치반환
a = "abd"
print(a.index('a'))
>>> a = [1,2,3]
>>> a.index(3)
2
>>> a.index(1)
0
삽입
>>> a = [1, 2, 3]
>>> a.insert(0, 4)
>>> a
[4, 1, 2, 3]
>>> a.insert(3, 5)
>>> a
[4, 1, 2, 5, 3]
제거
>>> a = [1, 2, 3, 1, 2, 3]
>>> a.remove(3)
>>> a
[1, 2, 1, 2, 3]
>>> a.remove(3)
>>> a
[1, 2, 1, 2]
끄집어 내기
>>> a = [1,2,3]
>>> a.pop()
3
>>> a
[1, 2]
>>> a = [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
카운트
>>> a = [1,2,3,1]
>>> a.count(1)
2
확장
>>> a = [1,2,3]
>>> a.extend([4,5])
>>> a
[1, 2, 3, 4, 5]
>>> b = [6, 7]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6, 7]
Author And Source
이 문제에 관하여([백준 x Python] 2강), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rkdud007/백준-x-Python-2강저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)