코드업 기초 100제 후기 및 새롭게 알게 된 내용 정리

Jane·2020년 11월 27일
4
post-thumbnail

기초 100제 풀이 소감

코딩테스트를 위한 파이썬 문법 공부를 끝낸 뒤, 문법들을 손에 익히기 위해 나동빈 작가님께서 추천하신 코드업 기초 100제를 풀어보았다. 문제 난이도가 상당히 낮은 편이었는데, 반복되는 문제가 너무 많아 끝까지 오기 힘들었다.

중간에 그냥 바로 백준으로 넘어갈까...?하는 유혹이 있었으나 '한번 시작한 것은 끝을 봐야 한다'는 마음으로 끝까지 풀었다. 앞 부분에서는 내 코드가 모범 답안의 코드보다 더 길었는데, 뒤로 갈수록 모범답안 보다 내 코드가 더 깔끔한 경우가 많아 뿌듯함을 느꼈다.

마지막 문제의 이름은 성실한 개미인데 의도했는지는 모르겠지만 여기까지 온 사람들을 성실하다고 칭찬해준 것 같아 기분이 좋았다.


새롭게 알게 된 내용들

제목 옆에 📂 아이콘을 클릭하시면 내용 정리에 참고한 소스를 확인하실 수 있어요! (거의 stack overflow 선생님인 건 안 비밀...)

1. exit(0) vs exit(1) 📂

exit(0): error나 problem 발생 없이 정상적으로 종료됨
exit(1): 몇몇 issue, error, problem이 발생하였고 이들로 인해 프로그램이 종료됨
exit(-1): 파이썬 코드가 실행 중간에 종료됨

2. python에는 ++ operator가 없다. 📂

java에서 ++ 연산자를 자주 쓰던 나로서는 파이썬에 ++가 없는 것을 보고 적잖게 당황했었다😅 왜 파이썬에는 ++연산자가 존재하지 않을까?

  • python은 동일한 operation을 수행하는 다른 수단의 수를 최소화하는 설계 방식을 취하고 있다.
  • 이미 python에는 ++를 대체할 수 있는 += 연산자가 존재한다.
  • python에서 a = a+1을 선언하면 a가 가리키는 메모리 주소가 변경되었다는 사실이 명시적으로 보이지만, a++을 사용하면 변수 a에 새로운 객체를 할당하기보다는 연산 이전의 객체의 값을 증가시킨다는 의미로 해석될 수 있다. 이러한 혼란을 피하기 위해 ++ 연산자를 사용하지 않는 것으로 보인다.
# 재미있어서 직접 실습해 본 코드 
>>> a = 1
>>> id(a)
140713514400832
>>> a = a+1
>>> id(a)
140713514400864
>>> b = 2
>>> id(b)
140713514400864
>>> a = a+5
>>> id(a)
140713514401024
>>> id(7)
140713514401024

3. python에는 do while 문이 없다. 📂

정말로 파이썬은 중복되는(?) 기능을 하는 코드를 싫어하는 것 같다. (이런 이유가 아니라면 댓글로 알려주세요🙏)
대신 아래와 같이 do while문을 구현할 수 있다.

# 방법 1
while True:
  stuff()
  if fail_condition:
    break
 
# 방법 2
stuff()
while not fail_condition:
  stuff()

4. ord() 📂 vs chr() 📂

ord(): 하나의 Unicode character를 나타내는 string이 주어지면 해당 문자의 유니코드 코드 포인트를 나타내는 정수를 반환
→ 쉽게 말하면 입력한 char의 int 값을 반환한다고 보면 된다.
chr(): 유니코드 코드 포인트가 정수 i인 문자를 나타내는 string을 반환

>>> x = 'a'
>>> ord(x)
97
>>> chr(97)
'a'
>>> type(ord(x))
<class 'int'>
>>> type(chr(97))
<class 'str'>

역시 설명이 복잡해 보이면 실습이 최고다.

5. 가변 매개변수 📂

Arbitrary Arguments (*args)

함수에 전달될 argument가 몇 개 일지 모를 때, 함수 정의 안의 parameter 이름 앞에 *를 붙이면, 함수는 arguments로 구성된 tuple을 받고 항목들에 차례로 접근할 수 있다.

def my_function(*kids):
  print("The youngest child is " + kids[2])

my_function("Emil", "Tobias", "Linus")

# result: The youngest child is Linus

Arbitrary Keyword Arguments(**kwargs)

함수에 전달될 keyword argument가 몇 개 일지 모를 때, 함수 정의 안의 parameter 이름 앞에 **를 붙이면, 함수는 arguments로 구성된 dictionary를 받고 항목들에 차례로 접근할 수 있다.

def my_function(**kid):
  print("His last name is " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")

# result: His last name is Refsnes

6. 16진수 <-> 10진수 변환 📂

hex string → int

>>> int("a", 16)
10

int → hex string

data = 10
hex(data)
'0xa'

7. for x in range()

for x in range(3):
    print("x:", x)
    x += 2
    print("x+2:", x)
    
# result
x: 0
x+2: 2
x: 1
x+2: 3
x: 2
x+2: 4

중간에 x+=2를 해주더라도 x 값이 2씩 증가하지 않는다.

x2 = 0
for x in range(3):
    x2 +=2
    print("x:", x)
    print("x2:", x2)
    
# result
x: 0
x2: 2
x: 1
x2: 4
x: 2
x2: 6

그러므로 2씩 증가하는 x값을 얻고 싶다면 위와 같이 코드를 짜면 된다.

8. 소수점 아래 0 출력하기

data = 3.1234
print(round(data, 3), 'MB')
print('{0:0.3f} MB'.format(data))
print('%.3f MB' % data)

# result
3.123 MB
3.123 MB
3.123 MB

round() 함수를 사용한 경우 소수점 아래에 값이 있을 때는 3째자리까지 출력해주지만 값이 0일 때는 0이 출력되지 않는다. 그러므로 0을 출력하기 위해서는 아래와 같이 형식을 지정해 주어야 한다.

data = 3
print(round(data, 3), 'MB')
print('{0:0.3f} MB'.format(data))
print('%.3f MB' % data)

# result
3 MB
3.000 MB
3.000 MB

9. subscriptable의 의미 📂

  • object가 __getitem__() 메서드를 구현하고 있다는 뜻
  • string, list, tuple, dictionary 등 다른 object들을 포함하고 있는 container object를 설명할 때 사용된다.
x = map(int, input().split())
print(x)
print(x[1])

맵과 같이 subscriptable하지 않은 객체에 접근하려고 한다면 TypeError가 발생한다.

TypeError: 'map' object is not subscriptable
<map object at 0x0000024888043188>

그러므로 특정 원소에 인덱싱하고 싶다면 list로 변환해주어야 한다.

x = list(map(int, input().split()))
print(x)
print(x[1])

# result
[1, 2, 3]
2

10. 여러 개의 변수 한 번에 선언하기

(x, y), n, arr = map(int, input().split()), int(input()), \
               list(map(int, input().split()))

print("x:",x,"y:", y,"n:", n,"arr:", arr)
1 2
90
5 8 7 6
x: 1 y: 2 n: 90 arr: [5, 8, 7, 6]

드디어 코딩테스트 준비를 위한 기초 체력을 길렀다. 이제 본격적으로 자료구조 및 알고리즘을 공부한 뒤 백준, 프로그래머스, leetcode 등에 있는 알고리즘 문제들을 풀어봐야겠다. 나날이 어려워지는 코딩테스트를 준비하는 모두 파이팅!!💪💪

0개의 댓글