[오늘의 백준] (매우 짧) / 파이썬(짧)-ASCII, *args, **kwargs

한지원·2021년 1월 4일
1

11654. 아스키코드

문제
알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.


입력
알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.


출력
입력으로 주어진 글자의 아스키 코드 값을 출력한다.

이건 코드보다 파이썬에서 아스키코드를 사용하는 방법에 대한 기록을 위해 적어본다.
문자를 숫자로: ord(문자)
숫자를 문자로: chr(숫자)


11720. 숫자의 합

문제
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.


입력
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.


출력
입력으로 주어진 숫자 N개의 합을 출력한다.

문제의 조건에 충실해서 풀었지만 숏코딩에 올라온 코드를 보니
다른 사람 코드

input()
print(sum(map(int,input())))

이런 식으로 공백이 없는 N개의 숫자를 입력받았다.
이 답안은 초반에 숫자의 개수 N을 받는 과정이 필요없고 그냥 자신이 입력하고싶은 숫자를 바로 입력하면 된다. 사실 나도 문제를 풀 때 N을 입력받지 않고 바로 답안을 제출하는 방법은 생각했지만 문제에서 요구하는 입력과 그것을 이용하고자하는 코드를 작성하는것과 결과를 제출함에 있어 필요 없는 입력은 날리고 간단한 코드를 작성하는 것 중 무엇이 올바른 접근법인지 생각해보았다.

문제는 파이썬 뿐 아니라 다른 언어들의 풀이도 모두 고려하여 만들어진 것이기 때문에 파이썬을 이용해서 문제를 풀 때 굉장히 단순하게 풀리고 굳이 입력받지 않아도 결과를 낼 수 있는 변수를 입력하기도 한다. 파이썬의 장점을 최대한 활용하기 위해서 문제의 조건에 너무 구애받지 않고 효율적인 코딩을 하는 연습도 해야겠다.


1065. 한수

문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.


입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.


출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

문제의 조건이 1000보다 작거나 같은 자연수 N이었다. 난 아직도 조건에만 맞추어 코드를 짤지 조건이 달라져도 활용 가능한 코드를 짤지 고민이 된다.
사실 1000은 한수가 아니기 때문에 세자리 수에 대해서만 조건을 설정해서(1~99는 모두 한수) 등차수열의 공식(2b = a+c)을 이용해서 출력하면 된다.

정말 간단하게 풀리는 문제인데 나는 만약 N의 범위가 한정되어있지 않는 조건이라면 어떤 식으로 함수를 만들어야할까?라는 생각으로 문제를 풀었다.
높은 단계의 문제를 풀 때라면 조건에만 맞게 출력하는 답안을 작성하겠지만 아직 그만큼 어려운 문제는 아니니까.. 나중에 어떤 문제를 풀게 될지 모르니까 일단 지금은 문제마다 접근법과 풀이 방식을 달리하며 유연하게 푸는 연습을 계속 해야겠다.


알파벳 찾기

문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.


입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.


출력
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

사실 이 문제는 숏코딩 답안을 보고 파이썬에서 *args의 활용에 대해 공부하기 위해 기록한다.
다른 사람 코드

print(*map(input().find,map(chr,range(97,123))))

저 *이 뭘까..

*args 란

여러 개의 인자를 함수로 받고자 할 때 쓰인다. 즉 변수에 어떠한 값을 입력하고자할 때 몇 개의 값을 넣을지 알 수 없을 때 *args를 사용하는 것.

  1. *는 튜플이다.
    여러 개의 인자를 넣어 함수를 호출할 때 함수 내부에서 그 인자들을 튜플로 받은 것 처럼 인식한다.
    따라서 list처럼 조작하기 위해서는 list(args)로 변환시켜주어야 한다.
    이 경우에 대해

  2. *는 가장 바깥 쪽 괄호를 벗겨주는 unpacking의 기능이 있다.

def a(*args):
	print(args)
    print(*args)
a(1, 2, 3, 4)

출력
(1, 2, 3, 4)
1 2 3 4

리스트의 경우

b = [1, 2, 3, 4]
print(*b)

출력
1 2 3 4

a = ((1, 2), (3, 4))
b = [[1, 2, 3, 4]]
print(*a)
print(*b)

출력
(1, 2) (3, 4)
[1, 2, 3, 4]

zip()함수를 쓸 때 유용하게 쓰인다고 한다.
zip은 튜플의 형식을 지원하지 않아서 unpacking의 용도로 zip의 인자에 *을 붙여주면 된다.

  1. 가변인자를 사용할 때 어떻게 사용하는가
    내일 읽어야지..

(보너스ㅋ) **kwargs 란..

keyword argument로 키워드를 제공한다.
딕셔너리의 형태{'키워드': '값'}로 함수 내부에 전달해주는 기능을 가졌다.
즉 함수를 호출할 때 파라미터값의 이름을 지정해서 딕셔너리 형태로 보내는 것이다.


TIL-파이썬

for문에서 변수 두개 사용하기

보통 for문 사용 예시

name_list = ['han', 'ji', 'won']

for name in name_list:
	print(name)

for _ in range(10):
	print(i)

enumerate 사용하기 (인덱스+요소)

인덱스와 요소를 함께 사용하고 싶을 때 인덱스 번호와 요소 값을 튜플형태로반환하는 enumerate를 사용하면 된다.
만약 인덱스의 순서로 시작값을 변경해주고 싶다면 enumerate함수의 두번째 인자에 시작 값을 지정해준다.

name_list = ['han', 'ji', 'won']

for i, name in enumerate(name_list):
	print('%d: %s'% (i, name))
    
#결과
#0: han
#1: ji
#2: won

for i, name in enumerate(name_list, 10):
	print('%d: %s'% (i, name))

#결과
#10: han
#11: ji
#12: won

zip 사용하기

s = ['han', 'ji', 'won']
n = [1, 2, 3]

for i, j in zip(s, n):
	print(i, j)
    
#결과
#han 1
#ji 2
#won 3

위의 예시에는 두개로 했는데 zip안에 인자를 더 많이 넣을 수 있다. for문의 변수는 zip에 사용한 인자의 개수만큼 설정해 주어야 한다.
또 zip은 동일한 개수로 이루어진 자료형을 묶어주기 때문에 두 인자의 개수는 같아야한다.

보너스
zip을 이용해서 list를 딕셔너리로 만들어주는 법~
zip이용 안한 버전

n = [1,2,3,4]
s = ['han','ji','won','zzang']
dic = {}

for i in range(len(n)) : 
    dic[n[i]] = s[i]
    
print(dic)

#결과
#{1:'han', 2:'ji', 3:'won', 4:'zzang'}

zip이용 버전

n = [1,2,3,4]
s = ['han','ji','won','zzang']
dic = {}

for i, j in zip(n, s):
	dic[i] = j
    
print(dic)

#결과
#{1:'han', 2:'ji', 3:'won', 4:'zzang'}

내일은 파이썬 내장함수를 좀 깊게 알아봐야겠다.


today's diary

노트북 소음이 심해서 청소나 해볼까~ 했는데 팬 문제였다. 8만원 💸
갑자기 교체하게 된거라 잘 알아보지도 못하고 노트북만 맡기고 왔다
고로 난 지금 노트북이 없는 사람,,ㅋ
프론트 공부에 이제 막 불씨가 타오르기 시작했는데 꺼지기 전에 노트북을 받아와야한다..
오늘은 집 데스크탑으로 파이썬이나 볼까~ 했는데 너무 느려서.. 오늘 공부는 여기까지 😉ㅋ

0개의 댓글