a.split()처럼 괄호 안에 아무런 값도 넣어 주지 않으면 공백(스페이스, 탭, 엔터 등)을 기준으로 문자열을 나누어 준다. 만약 a.split(‘:’)처럼 괄호 안에 어떤 값이 있을 경우에는 괄호 안의 값을 구분자로 해서 문자열을 나누어 주고 이렇게 나눈 값은 list에 하나씩 들어가게 된다.
이렇게 괄호 안의 값을 구분자로 문자열을 나눠준다. 첫 번째의 “SK Telecom T1”은 split()의 괄호 안이 공백이므로 공백을 구분자로 문자열을 나눠준다. 그래서 [‘SK’, ‘Telecom’, ‘T1’] 이렇게 list 형태로 나눠진 것이고 2, 3번째는 split()의 괄호 안에 구분자(‘:’, ‘-‘)가 있어 해당 구분자로 문자열이 나눠진 것이다. 4번째는 문자열을 좀 불규칙하게 작성해 본 다음 split()의 괄호 안에 구분자를 넣어봤다. 그랬더니 예상대로 구분자(‘-‘)로 문자열이 나뉘어졌음을 확인할 수 있었다.
백준 1966번 문제에서는 이게 입력값에서 응용되었는데 바로 한 번의 입력에 여러 값을 넣는 경우였다. 또한 가독성을 위해 각각의 값들 사이에 공백(스페이스바)도 하나 있어야 했고 각 공백들은 포함하지 않으면서 각각의 값들은 모두 저장할 수 있어야 했다. 이 때 split() 함수를 이용하면 공백은 포함하지 않으면서 각각의 값들은 다 저장할 수 있다. 만약 split() 함수를 쓰지 않고 그냥 input()만 하게 되면 공백까지 다 포함해버린다.
a[1]과 a[3]에 공백이 들어가 있음을 확인할 수 있다. 하지만, 우리는 공백이 필요없기 때문에 split() 함수를 써서 제거해버리면 된다.
이렇게 split() 함수를 써주면 input() 함수는 한 번만 사용하면서(= 입력을 한 번만 하면서) 공백은 제거하고 (list 형태로) 각각의 값까지 저장한다. 하지만 우리가 볼 때나 숫자이지, Python 입장에서는 “1 2 3”이 “SK Telecom T1”처럼 문자열이다. 그래서 print(a)를 했을 때 [1, 2, 3]이 아니라 [‘1’, ‘2’, ‘3’]으로 나오는 것을 볼 수 있는데 [‘S’, ‘K’, ‘ ‘, ‘T’, ‘e’, …]처럼 1을 숫자가 아닌 문자 ‘1’로 인식하는 것이다(2, 3도 마찬가지).
실제로 각 요소들을 보면 str임을 알 수 있다. 그런데, 꼭 문자열이 아니더라도 input() 함수만 쓰면 숫자를 입력하더라도 문자로 인식해버린다.
type()으로 확인해봐도 str임을 알 수 있다. 이를 int형으로 입력받고 싶다면 a = int(input())으로 해줘야 한다.
type()으로 확인해보면 int이다.
다시 돌아와서 이렇게 말고 각 입력 숫자들을 변수에 저장할 수는 없을까? 있다. 이렇게 해주면 된다.
이렇게 하면 변수에 각 숫자들이 저장된다. 주의할 점은 입력할 숫자만큼만 변수를 지정해줘야지 입력한 숫자들의 수와 변수의 수가 다르면 오류가 난다.
변수는 a, b, c 이렇게 3개인데 입력한 수는 1, 2 이렇게 2개로 서로 달라서 오류가 뜬다. 오류 메시지도 (변수가 3개니까) 2개의 (입력)값보다 더 많은 값이 필요하다고 말해주고 있다. 입력한 수가 변수의 수보다 많아도 역시 오류가 뜬다.
다시 돌아와서 그럼 이렇게 변수에 숫자를 저장하면 각 숫자들은 int형일까? 한 번 확인해보자.
map(function, iterable)은 built-in 함수로 list나 dictionary 같은 반복 가능한(iterable) 데이터를 인자로 받아 list 안의 요소들을 function의 인자로 전달하여 해당 결과를 list의 형태로 리턴해주는 함수이다. 바로 예시를 보도록 하자.
아까 위에서 봤듯이 a, b, c = input().split() 이라고 하면 a, b, c가 모두 str이었다. 이를 map 함수를 이용해 a, b, c = input().split()을 int형으로 모두 바꿔준다는 뜻이다(list의 요소들을 각각 int의 인자로 전달하여 해당 결과를 리턴). 그래서 type으로 확인해보면 아까와는 달리 int형이다. 따라서, 연산 시에 계속 int(a), int(b), int(c) 이럴 필요 없이 그냥 a, b, c를 쓰면 된다.
이렇게 사용하는 것을 보고 필자는 a = input().split()에도 똑같이 적용될 것으로 생각하고 해봤다. 위에서 a = input().split()을 하게 되면 각 입력값들이 리스트 a의 요소들로 묶여 모두 str임을 확인했었다. 따라서, 이들 역시 map(int, a)형태로 해주면 각 요소에 모두 int형이 적용될 것이라고 생각해서 해봤더니
내가 생각했던 list 형태로 나오진 않고 map 객체로 나와 있다. type으로도 확인해보면 map형임을 알 수 있다. 아까는 list가 아닌 a, b, c 이렇게 변수였기 때문에 map() 함수만 써도 됐던 것이고 a = input().split()을 하면 변수 a는 list이기 때문에 map() 함수를 적용시키면서 이를 list 형태로 보려면 list()를 붙여줘야 한다.
index(x) 함수는 리스트에 x라는 값이 있으면 x의 위치값을 리턴한다.
max() 함수는 인수로 반복 가능(iterable)한 자료형을 입력받아 그 최대값을 리턴하는 함수이고 min() 함수는 최소값을 리턴해주는 함수이다.
지금은 list에 숫자만 있지만 문자가 오더라도 알아서 최대값, 최소값을 찾아준다.
문자들의 경우 ASCII 코드값으로 비교되는데(이따가 밑에 나옴), 이런 것들도 알아서 다 비교해서 최대값, 최소값을 리턴한다. 이렇게 list에서 이용한 것을 바탕으로 max()함수, min()함수를 문자열에도 적용할 수 있다.
이게 가능한 이유는 문자열이 list와 유사하게 각 문자마다 번호가 매겨지기 때문인데, 이를 문자열 인덱싱이라고 한다. 아래 화면을 보자.
쉽게 말해서 list의 [1, 2, 3, 4]처럼 [‘S’, ‘K’, ‘ ‘, ‘T’, ‘e’, ‘l’, ‘e’, ‘c’, ‘o’, ‘m’, ‘ ‘, ‘T’, ‘1’] 이렇게 된다는 말이다(그렇다고 문자열이 list는 X -> type(a)를 해보면 str이다). 지금 보면 문자, 공백, 숫자가 다 들어가 있는데 이들 순서 역시 ASCII 코드값으로 결정된다. ASCII 코드값을 보게 되면
이건 함수라기보다는 리스트에 똑같은 수를 넣으려고 할 때 쓰는 방법이다. 필자의 경우 이 문제에서 a = [0, 0, 0, 0, 0]을 만들기 위하여 a = [] 선언하고 for문을 통해 a.append(0)을 반복해서 넣었다.
그런데 이렇게 말고 좀 더 간단한 방법이 있었다. 바로 a = [0]*5이다.
이렇게 해도 똑같이 [0, 0, 0, 0, 0]이 된다. 자료형은 list이며 각각 요소들 역시 모두 int형이다.
꼭 [0]이 아니어도 어떤 똑같은 숫자나 문자를 넣어 리스트로 만든다고 하면 이 방법으로 하면 된다.
참고 사이트 :