n = int(input()) # 정수로 저장
n = input() # 기본 문자열 입력
#sys 이용하기
import sys
n = map(int, sys.stdin.readline().split())
# map으로 타입을 통일 시켜준다.
# split으로 입력 값을 구분한다. 기본 스페이스바
=========================================================
#입력받은 값 리스트로 저장하기 (input으로도 여러 값 받을 수 있는데 자꾸 까먹는다.)
n = list(map(int, input().split()))
# 5번 반복하면서 각각 입력을 받는다.
for _ in range(5):
n = int(input())
=========================================================
# list 타입(comprehension)
n = [int(input()) for _ in range(5)]
def solution(arr, divisor):
return sorted([i for i in arr if i % divisor == 0]) or [-1]
##1) A and B
##- A,B 둘 다 참이면 B 를 출력
##- A,B 둘 다 거짓이면 A 를 출력
##- A, B 둘 중에 하나만 참이면 거짓인 값을 출력
##2) A or B
##- A,B 둘 다 참이면 A 를 출력
##- A,B 둘 다 거짓이면 B 를 출력
##- A, B 둘 중에 하나만 참이면 참인 값을 출력
def get_min_between_two(a, b):
# a if condition else b (조건이 True 면 a 반환, False 면 b 반환)
return a if a < b else b
str
타입인 경우 더하기(+)와 콤마(,)를 사용할 수 있음.>>> a = '사과'
>>> b = '파인애플'
>>> print('내 폰은 ' + a, '네 폰은 ', b)
내 폰은 사과 네 폰은 파인애플
# 기호 플러스를 사용할 경우 붙어서 출력, 콤마는 한 칸 떨어져 출력.
str
이 아닌 경우>>> c = 12
>>> print('내 폰은 사과폰' + c) #플러스 사용 불가
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
print('내 폰은 사과폰' + c)
TypeError: can only concatenate str (not "int") to str
>>> print('내 폰은 사과폰', c) #콤마 사용 가능
내 폰은 사과폰 12
>>>for i in [0, 1, 2, 3, 4, 5, 6, 7] :
>>> print(i, end =', ')
0, 1, 2, 3, 4, 5, 6, 7,
%d 는 십진수 출력 >> 자바, c언어 문법
Iterable이란, 반복되는 객체로 리스트, 튜플, 딕셔너리, 세트, range 등 여러개가 있다.
iterable한 객체를 넣어서 계산하는 함수
>>>max(1, 20)
20
>>>min(10, 20, 1, 1.1, 0.7)
0.7
i = [1, 2]
print(reversed(i)) # 1
print(list(reversed(i))) # 2
print(sorted(n, reverse=True)) # 3
# 출력 값
2, 1 # 1
[2, 1] # 2
[2, 1] # 3
reversed 메소드는 비교 연산자를 사용할 수 없다.
'>' not supported between instances of 'reversed' and 'reversed'
from collections import Counter
my_list = ['Tick', 'Tock', 'Tock'] # 나의 리스트
new_list = ['Tick', 'Tock', 'Song'] # 추가로 나타난 리스트
# 나의 리스트를 센다
counter = Counter(my_list)
print(counter)
# 추가된 리스트를 누적하여 센다
counter.update(new_list)
print(counter)
# 가장 많이 나타난 2개를 출력한다
print(counter.most_common(n=2)) # n으로 원하는 수의 값을 가져옴
# 출력
Counter({'Tock': 2, 'Tick': 1})
Counter({'Tock': 3, 'Tick': 2, 'Song': 1})
[('Tock', 3), ('Tick', 2)]
def solution(n):
# return sum([int(i) for i in list(str(n))])
# 입력값을 반복문에 넣기 전 list에 담지 않아도 str 타입이면 하나씩 가져온다.
return sum([int(i) for i in str(n)])
print(solution(12345))
입력값을 하나씩 가져오기 위해 str타입으로 변환 후 list에 담아 for문을 돌리고 가져 온 값을 다시 int로 변환하여 list comprehension에 담아둔다.
반복문이 끝나면 sum() 함수를 사용해 리스트에 담긴 모든 값을 합하여 반환한다.
# a 배열의 길이는 5
>>> a = len([1,2,3,4,5])
>>> 0 % a
0
>>> 4 % a
4
# a의 길이가 5이므로 5%5가 되어 나머지 값이 0이 되므로 0으로 리셋된다.
>>> 5 % a
0
>>> 6 % a
1
>>> 7 % a
2
#append
>>> a = [10, 20, 30]
>>> a.append(500)
>>> a
[10, 20, 30, 500]
>>> len(a)
4
#리스트안에 리스트
>>> a = [10, 20, 30]
>>> a.append([500, 600])
>>> a
[10, 20, 30, [500, 600]]
>>> len(a)
4
원본은 유지되고 새로운 리스트를 생성한다.
for문에서 처리할 수 있는 기능을 map을 사용해 한 줄로 줄일 수 있다.
- list(map(함수, 리스트))
- tuple(map(함수, 튜플))
a, b = map(int, input('숫자 두 개를 입력하세요: ').split())
print(a + b)
##실행 결과
숫자 두 개를 입력하세요: 10 20 (입력)
30
=========================================================
#콤마(,)로 나누기
a, b = map(int, input('숫자 두 개를 입력하세요: ').split(',')) # 입력받은 값을 콤마를 기준으로 분리
print(a + b)
소스 코드를 실행한 뒤 '숫자 두 개를 입력하세요: '가 출력되면 10,20을 입력하고 엔터 키를 누르세요.
##실행 결과
숫자 두 개를 입력하세요: 10,20 (입력)
30
=========================================================
함수명과 함수에 전달할 인수인 시퀀스 객체를 적어주면 함수를 거쳐나온 결과 값이 for문의 변수 i로 반환된다.
def half(s) :
return s / 2
score = [45, 90, 82, 53, 94]
for i in map(함수명, 시퀀스객체1) :
print(s, end=', ')
def half(s) :
return s / 2
score = [45, 90, 82, 53, 94]
for s in map(half, score) :
print(s, end=', ')
#map2
def total(s, b) :
return s + b
score = [88, 95, 70, 100, 99]
bonus = [2, 3, 0, 0, 5]
for s in map(total, score, bonus) :
print(s, end=', ')
람다문에 함수 명이 없어 무명 함수라고 칭한다.
lambda 설명글 보러가기
A.기본 문법을 보다시피 괄호로 감싸주기만 하면 기초적인 기능은 무리없다.
# lambda 매개변수 : 표현식
>>> (lambda x,y: x + y)(10, 20)
30
#lambda
score = [45, 90, 82, 53, 94]
for s in filter(lambda x : x < 60, score) :
print(s)
#lambda 2
score = [45, 90, 82, 53, 94]
for s in map(lambda x : x / 2, score) :
print(s, end=', ')
요소가 변경되지 않아 구조가 간단하여 리스트보다 속도가 훨씬 빠르고, 고정된 메모리 공간을 사용하여 튜플로 성능을 높일 수 있다.
BJ 1157 | 단어 공부 문제 응용
from collections import Counter
# 입력 받은 문자열을 대문자로 변경 후 list에 담은 뒤 Counter로 dic 타입으로 키, 값을 만들어준다.
s = Counter(input().upper())
s.most_common(n=2) # 가져올 값의 개수
for key, value in s.items():
print(key, value)
>>>nMNMN
N 3
M 2
- dic 타입에 .item() 메서드를 주면 키, 값을 가져오고 s.keys()는 키만, s.values() 값만 가져온다.
from collections import Counter
s = Counter((input().upper())) # dic 타입으로 문자열을 쪼개어 알파벳 하나당 개수를 키:값 형태로 저장한다.
max_num = max(s.values()) # 최댓값을 구한다.
# dict 타입의 경우 (key, value) 형태이다.
d = dict((key, value) for key, value in s.items() if value == max_num)
# list 타입의 경우 key값 또는 value값 하나만 정하면 된다.
l = list(key for key, value in s.items() if value == max_num)
print(s) # 키,값 생성
print(max_num) # 제일 큰 값을 가져온다
print(d) # s.items()로 반복문을 돌려 키와 값을 가져오고 if max_num 값과 반복문에서 가져 온 값을 비교하여 똑같은 경우 키와 값을 저장한다.
print(l)
>>>nnmmi
Counter({'N': 2, 'M': 2, 'I': 1})
2
{'N': 2, 'M': 2}
['N', 'M']
>>> x = [1, 2, 3]
>>> print(x)
[1, 2, 3]
>>> print(*x)
1 2 3
A, B = map(str, input().split()[::-1])
print(A, B)
>>>123 456 # 입력
456 123 # 출력
slicing은 비교 연산자 사용이 가능하다.
if A[::-1] < B[::-1]:
int 값을 슬라이싱하면 에러가 발생한다.
TypeError : 'int' object is not subscriptable
T = int(input())
for i in range(T):
R, S = list(input().split())
R = int(R)
for j in range(len(S)):
print(S[j] * R, end='')
print('') # 2중 for문의 상위 for문에 print('')을 하여 다음 줄로 넘어가게 해준다
중첩 for문 사용 시 print의 end를
''
으로 지정해서 쉘이 다음 줄로 안 넘어갈 때
참고. BJ 2675 | 문자열 반복
N = int(input())
for i in range(1, N+1):
print('*' * i)
A, B = map(str, input().split())
print(max(A[::-1], B[::-1])) # slicing과 조합하여 사용한다.
문자열(문장)은 string, 문자는 character 로 Type이 정의 됨.
''' 입력하고
엔터 누르면
자동으로 줄바꿈으로 나옴.'''
>>>print('doesn\'t')
doesn't
# 특수 기호 ₩를 사용해야 할 때
>>print('C:₩user₩appdata')
SyntaxError: incomplete input
#문자열 앞에 r을 붙여 문자열을 그대로 보여줄 수 있다.
>>print(r'C:₩user₩appdata')
C:₩user₩appdata
print(len(input().split()))
# split을 사용하여 문자를 나누고 len으로 문자의 개수를 셈
# 'The', 'last', 'character', 'is', 'a', 'blank'
6
a = "nNN"
print(a.upper())
print(a.lower())
print(a.isupper(), a.islower()) # 문자열의 전체가 소문자인지 대문자인지 Boolean형태 (True, False)로 구분한다.
# 출력
NNN
nnn
False False
>>> 'apple pineapple'.rindex('pl')
12 # 인덱스
isalpha()함수는 주어진 문자열에 공백, 숫자, 특수문자를 걸러낸다. 이걸 for문과 If을 활용하여 특수문자를 제외한 문자열을 만들 수 있다.
x = 'wow!'
for i in x:
if i.isalpha():
print(i, end='')
# list comprehension
x = 'wow!'
print(*[i for i in x if i.isalpha()], sep='')
# output
wow # 특수문자 !가 제외 됨.
print(int('{0}{1}'.format(1, str(3).zfill(2))))
해당 식 처럼 문자열에 zfill() 함수를 사용해서 0을 채워 넣을 수 있다.
output: 103
print("당신의 이름은 " + name + ", 나이는 ", age, "살 이군요!")
>>> T = "T"
>>> G = "G"
>>> S = "S"
>>> print(T + G + S) #플러스
TGS
>>> print(T, G, S) #콤마
T G S
자바나 c언어에서 주로 사용하는 방법. 파이썬에서 ('%d입니다' % 7) 콤마없이 작성.
%s
- 문자열%d
- 정수%f
- 실수
위 세가지를 문자열 사이에 넣어 변수를 따로 중간에 넣지 않고 문자열로 바로 출력할 수 있어 가독성이 좋다.
>>>price = 10000
>>>print("상품의 가격은 %s원 입니다." % price)
상품의 가격은 10000원 입니다.
>>>message = "오늘은 %s월 %s일 입니다."
>>>m = 10
>>>d = 25
>>>print(message % (m,d))
오늘은 10월 25일 입니다.
아래 코드에서 0은 숫자 앞에 붙이겠다는 의미, 2는 숫자앞에 한 칸 띄우겠단 의미.
위에서부터%s
으로 사용된 부분은 변경되지 않는 것을 볼 수 있다.
%d
를 사용했음에도 2를 붙여 간격을 띄워주지 않아 옵션 적용이 안 된 것을 볼 수 있다.
>>>day = 7
>>>print('%s일' % day) #%s를 사용해도 값이 나오긴 함.
7일
>>> print('%02s일' % day) #간격띄우기는 되나 숫자 0이 붙진 않음.
7일
>>>print('%0d일' % day) #간격 띄우기를 안 해 적용 안 됨.
7일
>>>print('%02d일' % day) #여기만 성공
07일
위 방법도 있지만 통합적으로 중괄호만 사용하여 편하게 쓸 수 있다.
'문장 사이에 {}를 사용'.format(변수명) 와 같이 사용한다.
word = input('문자, 스페이스바, 숫자만 입력하세요 : ')
al = 0
num = 0
spa = 0
for c in word :
if c.isalpha() :
al += 1
elif c.isdigit() :
num += 1
else :
spa += 1
print('알파벳 개수 = {}, 숫자 개수 = {}, 공백 개수 = {}'.format(al, num, spa))
문자열
이기 때문에문자
만 바꿀 수 없다. 전체를 바꾸던지 새로 변수를 만들던지 하자.
>>> word = 'Python'
>>> word[0] = 'C'
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
word[0] = 'C'
TypeError: 'str' object does not support item assignment
파이썬 Math 내장 함수
Math 내장 함수를 사용하여 여러 메서드를 이용할 수 있다.사용법
#import만 사용하여 선언 시 매 메서드마다 math를 붙여야 함.
>>>import math
>>>math.round(1.5)
\
#from ~ import *의 경우 함수를 매번 적을 필요 없다.
>>>from math import *
round(1.5)
계산 관련 메서드는 아래 내용들과 같이 있다.
import statistics
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(statistics.mean(arr1))
5.5 # 출력
statistics
는 파이썬 내장 함수로 mean 메서드를 포함하며 평균을 구한다.
>>>round(1.5) #반올림
2
>>>round(1.4) #내림
1
a = round(1.23456)
b = round(1.23456, 0)
c = round(1.23456, 2)
d = round(1.23456, 4)
print(f"round(1.23456) : {a}")
print(f"round(1.23456, 0) : {b}")
print(f"round(1.23456, 2) : {c}")
print(f"round(1.23456, 4) : {d}")
# 출력
round(1.23456) : 1
round(1.23456, 0) : 1.0
round(1.23456, 2) : 1.23
round(1.23456, 4) : 1.2346
math.ceil() 어떤 수든 반올림
math.floor() 어떤 수든 내림
import math
>>>math.ceil(1.2)
1
>>>math.floor(1.9)
1
하드 코딩
def solution(n):
answer = 0
n = n / 2
i = 1
while n-i >= 0:
n -= i
i += 1
answer = (i+1)**2
if i != n*2:
answer = -1
return answer
print(solution(3))
print(solution(121))
제곱근 구하는 공식
121 / 2 = 60.5 -> 60.5 - 1 ~ 음수가되기 전까지의 정수
60.5 - 1 = 59.5 - 2 = 57.5 - 3 = 54.5 ~~ 10 = 5.5(1번의 결과 값) : 11(i)을 뺴면 음수니까 종료.
1번의 결과값 5.5 x 2를 한 값이 더이상 뺼 수 없는 수 i와 같다면 i는 제곱근이므로 (i+1)^2를 계산 후 반환한다.
만약 i 값이 결과값과 같지 않다면 -1을 반환한다.
math.sqrt()
from math import *
>>>sqrt(4.0)
2.0
>>>sqrt(36.0)
6.0
import math
def solution(n):
if n % math.sqrt(n) == 0:
return int((math.sqrt(n)+1)**2)
return -1
print(solution(3))
print(solution(121))
math함수의 sqrt() 메서드를 사용하여 n의 제곱근을 구한 뒤 n과 나눈 나머지 값이 0과 같다면 (n의 제곱근+1)**2를 계산 후 float 타입 -> int 타입으로 변환 후 반환.
n과 나눈 나머지 값이 0과 같지 않다면 -1을 반환
import statistics
score = [30, 40, 60, 70, 80, 90]
print(statistics.mean(score))
print(statistics.harmonic_mean(score))
print(statistics.median(score))
print(statistics.median_low(score))
print(statistics.median_high(score))
def factorial(n) :
if n == 1 :
return(1)
else :
return n * factorial(n-1)
n = int(input('정수를 입력하세요 : '))
print(n, '!= ', factorial(n))
0, 1, 1, 2, 3, 5 ... 왼쪽의 수를 합한 값이 오른쪽에 있는 것을 피보나치 수열이라 함.
def fib(n) :
if n == 0 :
return 0
elif n == 1 :
return 1
else :
return fib(n-1) + fib(n-2)
n = int(input('정수를 입력하시오 : '))
print(n, '번째 피보나치 수는 ', fib(n))
fiboList = {0:0, 1:1}
def fibm(n) :
if not n in fiboList:
fiboList[n] = fibm(n-1) + fibm(n-2)
return fiboList[n]
n = int(input('정수를 입력하시오 : '))
print(n, '번째 피보나치 수는 ', fibm(n))
에라토스테네스의 체
라고도 불리며 솟수인 값만 가져온다.
def eratosthenes(n) :
multiples = set()
for i in range(2, n-1):
if i not in multiples:
yield i
multiples.update(range(i * i, n+1, i))
print(list(eratosthenes(10)))
#막대 from에 쌓여있는 n개의 원판을 막대 tmp를 사용하여 막대 to로 옮긴다.
def hanoi_tower(n, org, tmp, to) :
if n == 1 :
print('원판 1을 {}에서 {}로 옮긴다.'.format(org, to))
else :
hanoi_tower(n-1, org, to, tmp)
print('원판 {}을 {}에서 {}로 옮긴다.'.format(n, org, to))
hanoi_tower(n-1, tmp, org, to)
hanoi_tower(4, 'A', 'B', 'C')
N = int(input())
if N%4 == 0 and N%100 != 0 or N%400 == 0 :
print(1)
else:
print(0)
참고
연산자 | 문법 | 설명 |
---|---|---|
== | a == b | 같다 |
!= | a != b | 다르다 |
>, < | a > b, a < b | 크다, 작다 |
>=, <= | a >= b, a <= b | 크거나 작다 |