[백준 X 파이썬] 3강

체인지영·2021년 4월 5일
0

[백준X파이썬]

목록 보기
3/6

이번시간부터는 풀수있는 문제 스팩트럼이 넓어져서 한 세션에 푸는 문제량이 많아 질 예정입니다. 이제 브론즈 3정도까지는 자유롭게 푸실수 있어요!

튜플

설명에 앞서 뒤에 계속 등장하는 튜플에 대해 간단하게 언급하고 넘어가겠습니다.
튜플은 몇가지만 제외하고는 리스트와 거의 똑같습니다.

>>> t1 = ()
>>> t2 = (1,)
>>> t3 = (1, 2, 3)
>>> t4 = 1, 2, 3
>>> t5 = ('a', 'b', ('ab', 'cd'))
  1. 튜플은 ()로 둘러싼다. 2. 리스트는 생성,삭제, 수정이 가능하지만 튜플은 값을 바꿀수 없다.

위의 코드에서 t2처럼 1개의 요소만을 가질떄는 요소뒤에 콤마를 반드시 붙여야 한다는 점입니다.

튜플은 이점을 제외하면 리스트와 동일하게 동작하며, 변경이 불가해서 리스트 자료형보다 메모리를 덜쓰므로 변경할 필요가없는 값들을 지정할때 튜플로 지정하는 경우가 많습니다.

14681번

이 문제를 통해서 조건문에 대해서 빠르게 살펴보려고 합니다.
이 문제를 잘 읽어보면 우리는 x,y 라는 좌표값에 대해 각각이 양수인지 음수인지에 따라 사분면을 분류해야함을 알수 있습니다. 즉, '조건'이 필요한것이고, 그 조건에 따라 '분류'를 해야합니다.

조건문

파이썬에서는 이러한 기능을 하는 문법으로 '조건문'이 존재합니다.

if 조건문:
    수행할 문장1
    수행할 문장2
    ...
else:
    수행할 문장A
    수행할 문장B
    ...

지난 시간에 간단하게 살펴본것처럼 다음과 같이 쓸수 있습니다. if 뒤의 조건문이 참이라면, 수행할 문장 1,2를 수행하고 if 뒤의 조건문이 거짓이라면 else 뒤의 수행할 문장 a,b를 수행합니다.

여기서
1. 조건문을 쓰고 클론을 찍어야 한다는 점
2. 수행할 문장은 반드시 들여쓰기를 해야한다는 점 을 기억해주세요

비교연산자

조건문에는 값을 비교하기위해 비교연산자가 쓰입니다. 지난시간에 본내용이니 빠르게 표로 확인하고 넘어가겠습니다.

연산자 and or not

만약 그런데 조건을 x는 y와 z둘 모두 보다 크다라는 것처럼 여러개로 중복해서 걸고 싶으면 어떻게 해야할 까요?

if x>y and x>z:
	print("x는 y와 z둘 모두 보다 큽니다")

지난시간에 본것 처럼 조건문을 여러개 쓰고 싶다면(다중조건판단)

if <조건문>:
    <수행할 문장1> 
    <수행할 문장2>
    ...
elif <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
elif <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
...
else:
   <수행할 문장1>
   <수행할 문장2>
   ... 

이처럼 elif를 사용하면 됩니다.

여기까지로 바로 14681번을 풀수 있습니다!
한번 스스로 풀어보세요! (+10M)

14681 번

x = int(input())
y = int(input())
if x>0 and y>0 :
    print("1")
elif  x>0 and y<0:
    print("4")
elif x<0 and y>0:
    print("2")
else :
    print("3")

제 풀이는 이러한데 충분히 다른 풀이들이 존재할 수 있습니다!

또 이문제에서는 안다뤘지만 지난시간에 잠깐 언급한

역시 조건문으로 쓰이는 문법 입니다.

10950번

이번에는 두 정수를 입력받아 출력하는 프로그램을 작성해 보겠습니다.
문제를 잘보면 테스트 케이스 T에따라 입력받아야하는 input 줄이 달라진다는 것을 알수 있습니다. 지금까지 했던 것 처럼 그냥 갯수가 정해져서 인풋을 일일이 써주는 방식으로는 풀수 없다는 것입니다.

반복문

for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...

리스트, 튜플, 문자열의 첫번째 요소부터 마지막 요소까지 차례로 변수에 대입되어서 수행할 문장 1,2가 수행됩니다.

>>> test_list = ['one', 'two', 'three'] 
>>> for i in test_list: 
...     print(i)
... 
one 
two 
three
>>> a = [(1,2), (3,4), (5,6)]
>>> for (first, last) in a:
...     print(first + last)
...
3
7
11

이와같이 응용할 수 있습니다

range 함수

for i in range(1,6,1):
	print("안녕하세요")

range함수는 숫자리스트를 자동으로 만들어주며 for 문과 함께 사용하는 경우가 많습니다. 기본적으로는 range(시작 인덱스, 끝 인덱스 +1,step)의 형태입니다.
위의 예시에서는 1,2,3,4,5 이렇게 루프를 돌고 끝날것입니다.

일반적으로 step은 생략해 사용하는데 생략하면 기본값인 1이 부여됩니다.

add = 0 
for i in range(1, 11): 
     add = add + i 
 
print(add) #55

for와 range 함수를 사용하면 1부터 10까지 더하는 것을 다음과 같이 쉽게 구현할 수 있습니다.

range(1, 11)은 숫자 1부터 10까지(1 이상 11 미만)의 숫자를 데이터로 갖는 리스트를 만들어 줍니다.

따라서 위 예에서 i 변수에 리스트의 숫자가 1부터 10까지 하나씩 차례로 대입되면서 add = add + i 문장을 반복적으로 수행하고 add는 최종적으로 55가 됩니다.

add = 0 
for i in range(11): 
     add = add + i 
 
print(add) #55

range함수에 숫자 하나만 담게되면 range함수는 0부터 그 숫자 -1에 헤당하는 숫자들을 담은 리스트를 만들게 됩니다.

실습겸 문제 2741번 (+5m)

# 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
N = int(input())
for i in range(1, N+1):
    print(i)

거의 비슷한 엄청 쉬운 백준문제를 하나더 풀고 갈께요!

8393번

N = int(input())
newi = 0
for i in range(1, N+1):
    newi = newi +i
print(newi)

여기까지 살펴본 문법으로 10950번문제를 풀수 있습니다!
한번 각자 풀어볼까요 ( + 10M )

10950번

N = int(input())
for _ in range(N):
    NUMBER = input().split()
    A = int(NUMBER[0])
    B = int(NUMBER[1])
    print(A+B)

여기서 for 옆의 는 만약에 우리가 range리스트의 요소를 수행하는데 쓰이지 않는다면 보통 이렇게 표현합니다.

while문

반복문에는 for처럼 요소를 하나씩 출력하면서 반복하는 방법말고도 조건을 벗어나기 전까지 무한히 출력하는 while문이 있습니다.

while <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
    ...

조건문이 참인 동안 아래문장이 반복해서 수행됩니다.

count = 1 
while count < 5:
	print("안녕하세요")

이 코드를 보시면 안녕하세요가 4번출력되고, count 가 5가되는 순간 조건문이 거짓이 되어 루프를 빠져나간다는 것을 알 수 있습니다.

여기서 count 변수에 1을 먼저 대입하는데 이렇게 변수를 먼저 설정해 놓지 않으면 다음에 나올 while문의 조건문인 count < 5에서 변수가 존재하지 않는다는 오류가 발생하기 떄문에 이렇게 처음에 꼭 설정해 주셔야 합니다.

count = 1
while count <5:
	if count == 3: #count가 3이되면 반복문 탈출
    	break 
    print("count 값은" + count)
    count = count +1 #count+=1
for i in range(5):
	if 1 % 2 == 0: #i가 짝수라면 
    	continue # 이번반복에서는 밑 코드는 전부 skip
    print("i값은" + i)    

이코드를 보면서 설명해 보겠습니다.

break

while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행합니다 .하지만 강제로 while문을 빠져나가고 싶을 때가 있는데 그때 break를 써줍니다.

위 코드에서는 count가 3인경우 break를 사용해 반복문을 탈출 했기에 3부터 더이상 출력이 되지 않았습니다.

할당연산자

자기자신을 업데이트해 나가는 count = count +1 과같은 코드는 다음과 같은 할당연산자를 이용해 count += 1 로 줄여쓰는 경우가 많습니다.

countinue

while문 안의 문장을 수행할 때 입력 조건을 검사해서 조건에 맞지 않으면 while문을 빠져나갑니다. while문을 빠져나가지 않고 while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶을때 사용하는 것이 바로 continue문 입니다.

위에서 i가 짝수일때는 처음으로 돌아가게 만들어서 짝수는 출력이 되지 않고 4까지의 홀수만 출력이 되었습니다.

무한루프

while True: 
    수행할 문장1 
    수행할 문장2
    ...

조건문이 거짓이 될때까지 계속 반복하기 때문에 조건문에 그냥 참을 의미하는 값인 True나 1값을 넣으면 무한히 수행할문장이 반복되는 것을 알수 있습니다.

실습 (+5m)

# 문제2. for문을 활용해서 1부터 10까지 숫자 중 3의 배수는 제외하고 출력해주세요. (단, continue이용)

10952번

이제는 이문제를 쉽게 풀수 있습니다. 한번 풀어볼까요
(+10m)

num = input().split()
A = int(num[0])
B = int(num[1])

while A+B !=0:
    print(A+B)
    num = input().split()
    A = int(num[0])
    B = int(num[1])

제풀이는 다음과 같습니다.

한문제 더 풀어볼까요

10871번

이제는 이문제를 쉽게 풀수 있습니다. 한번 풀어볼까요 (+10m)

al = input().split(' ')
A = input().split(' ')
N = int(al[0])
X = int(al[1])
for a in A:
    i = int(a) 
    if i < X :
        print(i)
    else:
        continue

제 풀이는 다음과 같습니다.

조건부 표현식

이전에 배웠던 if else문, 이걸 훨씬 간단하게 한줄에 표현하는 방법이 파이썬에는 존재합니다.

<조건문이 참인경우> if <조건문> else <조건문이 거짓인 경우>

예시를 보겠습니다.

if score >= 60:
    message = "success"
else:
    message = "failure"

이코드를

message = "success" if score >= 60 else "failure"

이렇게 쓸수 있습니다.

포멧팅

# %포멧팅
print("정수 출력 %d" % 123)
print("실수 출력 %f" % 123.12)
print("문자 출력 %c" \t 문자열 출력 %s" % ("a", "abc"))

# format포멧팅
name = "박가영"
print("제 이름은 {}입니다.\n",name)

# f-string
name = "박가영"
print(f'제이름은 {name}입니다.')

이런 방식으로 출력하면 아까봤던 예제를 다음과 같이 출력할수도 있습니다.

set자료형

>>> s1 = set([1,2,3])
>>> s1
{1, 2, 3}
>>> s2 = set("Hello")
>>> s2
{'e', 'H', 'l', 'o'}

리스트와 차이점 : 1. 중복을 허용하지 않는다. 2. 순서가 없다 -> 인덱싱으로 값을 얻을 수 없다.

※ 중복을 허용하지 않는 set의 특징은 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용하기도 합니다.

>>> s1 = set([1,2,3])
>>> l1 = list(s1)
>>> l1
[1, 2, 3]
>>> l1[0]
1
>>> t1 = tuple(s1)
>>> t1
(1, 2, 3)
>>> t1[0]
1

교집합, 합집합, 차집합

>>> s1 = set([1, 2, 3, 4, 5, 6])
>>> s2 = set([4, 5, 6, 7, 8, 9])

라 두자

#교집합
>>> s1 & s2
{4, 5, 6}
>>> s1.intersection(s2)
{4, 5, 6}

#합집합
>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}

#차집합
>>> s1 - s2
{1, 2, 3}
>>> s2 - s1
{8, 9, 7}
>>> s1.difference(s2)
{1, 2, 3}
>>> s2.difference(s1)
{8, 9, 7}

set관련 함수

1개 추가: add()

>>> s1 = set([1, 2, 3])
>>> s1.add(4)
>>> s1
{1, 2, 3, 4}

여러개 추가: update()

>>> s1 = set([1, 2, 3])
>>> s1.update([4, 5, 6])
>>> s1
{1, 2, 3, 4, 5, 6}

특정값 제거: remove()

>>> s1 = set([1, 2, 3])
>>> s1.remove(2)
>>> s1
{1, 3}
profile
Startup, FrontEnd, BlockChain Developer

0개의 댓글