[백준X파이썬] 4강

  1. 지난시간 과제풀이

  2. 3강의 format 부터 ? 삼항연산자부터?

딕셔너리

딕셔너리는 코테에서는 잘 쓰이지는 않는 문법이지만 알아는 둡시다

{Key1:Value1, Key2:Value2, Key3:Value3, ...}

기본적으로 위와같은 형태로 나타나고 예시를 살펴보면,

user = {
"name" : "gayeong",
"college" : "KU",
"color_like" : ['black', 'red']
}

위와 같고 간단한 문법 몇개만 살펴보겠습니다.

print(user["name"]) // key 값을 이용해 value 값을 출력
user['major'] = 'ACE' // 새로운 KEY값에 VALUE값 할당(추가) 
del user['name'] // key와 vlaue 삭제

함수

우리는 특정작업을 여러번 반복해야할 때, 여러번 같은 코드를 적는대신
1. 그 작업을 수행하는 함수를 작성하고 2. 필요할때마다 함수를 호출합니다.

간단한 함수를 먼져 보겠습니다. 이 함수는 입력값도, 결괏값도 없는 함수입니다.

 def say(): 
    print('Hi')

이함수는 다음과 같이 사용합니다.

>>> say()
Hi

함수는 입력값과 결괏값이 존재할수도 있습니다.
예전에 풀었던 1000번으로 예시를 들겠습니다.
이전에 우리의 풀이는 다음과 같습니다.

a,b = map(int,input().split())
print(a+b)

그런데 함수를 이용하면 직접 더하는 연산을 우리가 수행해 주어 그대로 출력하는 것이 아니라 이를 수행하는 함수로 만들어 필요한 만큼 호출해 줄수도 있습니다.

def add(a,b):
	return a+b
a,b = map(int,input().split())
print(add(a,b))

def 함수이름(인자):
return 함수의 결과물

코드를 다 실행하거나 return 을 만나면 함수가 종료됩니다. 따라서 함수의 결과값은 최대 한개 입니다.

일단 빠르게 실습한번 해보겠습니다.

15596번 + 5분동안 고민 -> 못풀어도 괜찮음

def solve(a):
    ans = 0
    for i in range(1,len(a)+1):
        ans = ans + int(a[i-1])
    return ans

여기서 함수의 결과물은 ans입니다. 즉, solve(a) 를 코드에 쓰면 컴퓨터는 ans의 값으로 반환해 준다는 뜻입니다.

함수는 결국 이전에 배운 여러 문법들을 이용해 틀을 씌우는 개념이기 때문에 우선 이전 문제들의 풀이에 함수에 적용시키는 연습을 해보겠습니다.

2438번 (star이라는 함수를 만들어 봅시다)

N = int(input())
for i in range(1, N+1):
    print("*"*i)
def star(N):
    for i in range(1, N+1):
        print("*"*i)
        
Num = int(input())
star(Num)

지금과 같은 간단한 문제들에서는 함수로 분할해야할 필요성을 크게 느끼지 못할수있습니다. 그렇지만 복잡한 문제일수록 이와같은 분할이 아니면 풀지 못하는 문제가 생기게 됩니다.

2739번 (Gugudan 함수 만들기 )

N = int(input())
for i in range(1, 10):
    print(N,'*' , i ,"=" , N*i )
def Gugudan(N):
	for i in range(1, 10):
    	print(N,'*' , i ,"=" , N*i )

N = int(input())
Gugudan(N)

코드의 진행순서를 보면 def를 건너띄고 N부터 시행하고 Gugudan이라는 함수가 호출되었을때 def 부분으로 올라가 함수를 실행하는 순서입니다.

15552번(input 대신 sys.stdin.readline!)

파이썬은 언어자체가 상대적으로 매우 느립니다. 따라서 시간초과가 나지 않게 하는것이 중요한데 input함수는 시간을 어느정도 사용하기에 일반적으로는 다른 함수를 이용해 입력을 받게 됩니다.

"Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다."

sys.stdin.readline()은 한줄 단위로 입력받기 때문에, 개행문자가 같이 입력 받아집니다.

만약 3을 입력했다면, 3\n 이 저장되기 때문에, 개행문자를 제거해야 합니다.

또한, 변수 타입이 문자열 형태(str)로 저장되기 때문에, 정수로 사용하기 위해서 형변환을 거쳐야 합니다.

그렇지만 빠릅니다!

import sys


T = int(sys.stdin.readline())
for i in range(1,T+1):
    A, B = map(int,sys.stdin.readline().split(' '))
    print(A+B)

출력함수 (sep, end)

print("안녕","하세요") #출력: 안녕 하세요
print("안녕","하세요", sep="!") #출력: 안녕!하세요
print("010","1234","5678", sep="-") #출력: 010-1234-5678

구분자에 의해 띄어쓰기가 되어 출력이 되는데 sep옵션을 사용하여 띄어쓰기(공백) 말고 다른 문자를 넣을 수 있도록 할 수 있습니다.

end='' " 입니다. 요거는 문장을 출력하고 마지막에 무엇을 쓰고 끝낼지 정해줄 수 있습니다.
print문을 사용하면 문장을 출력하고 개행을 하도록 되어있는데(end="\n") 개행말고 우리가 원하는 문장또는 이스케이프문자를 사용하여 문장출력을 마칠수 있습니다.

이스케이프문자는 원래 가지고 있던 문자열의 출력하는 기능을 벗어나 다른 특정한 기능을 하도록 하는 문자입니다.

\n : 다음 줄로 이동(개행)

\r :해당 줄의 처음으로 이동

\t : 8칸 공백

\' : '문자

\" : "문자

\ : \문자

print("Hello world", end=" Hello Python") # 출력: Hello world Hello Python
for i in range(10):
	print(i, end="")# 출력 : 0123456789

4673번

오늘의 마지막 문제이자, 조금 어려운문제입니다.

좀 어려울수 있습니다!
힌트 : set이용하기 (set은 중복되는 요소를 담지 못하는 집합이라는 특징이 있다. )

힌트 : (제풀이에는)사용되는 개념 set, 함수, 반목문, 리스트 관련 함수 (정렬) 등등

total = set(range(1,10000))
remove = set()
def d(x):
    numsum = int(x) + int(sum(map(int,str(x))))
    return numsum
for number in total:
    numsum = 0
    a = d(number)
    remove.add(a)

self = list(total - remove)
sself = sorted(self)
for s in sself:
    print(s)

좋은 웹페이지 즐겨찾기