우리가 주로 사용하는 컴퓨터 언어에는 반올림 함수가 내장되어 있다.

 

예를 들면 C나 C++의 경우 round()라는 함수가 존재하고, 수학 관련 라이브러리를 사용한다.

 

#include <math.h>  // C언어의 경우

#include <cmath>  // C++의 경우

 

using namespace std // C++의 경우

 

int main(){

 

   int a = round(4.5);

 // a는 5라는 값을 가진다. 

 

   return 0;
}

 

이런 식으로 이미 구현되어있는 반올림 함수가 있다.

 

파이썬도 물론 있다.

 

파이썬의 반올림 내장함수는 round()이다.

 

하지만 여기서 매우 어이가 없는 걸 볼 수가 있는데

 

 

print(round(3.5))
print(round(3.4))
print(round(4.5))

print(round(4.6))

 

이렇게 하면 결과가 

4

3

5

5

 

이렇게 나올 것으로 예상할텐데 실제로는

4

3

4

5

이렇게 나온다.

 

그 이유는

파이썬에서 round 함수로 0.5를 반올림할 때, 정수 부분이 짝수면 반내림이 되고, 홀수면 반올림이 된다.

 

즉 3.5의 경우에는 반올림이 되서 4가 되고

4.5의 경우에는 반내림이 되어서 4가 된 것이다.

 

이 문제를 해결해주기 위해서는

1. 반올림 함수를 새로 구현해주든가,

2. 짝수일 경우 0.1을 더하여 round 함수를 사용하면 된다.

 

물론 round 함수에 인자를 넣으면, 소수점 첫번째가 아닌 다른 부분에서도 반올림할 수 있기 때문에

정수에서 반올림, 소숫점 두번째, 세번째에서 반올림할 때도 이 부분을 생각해주어야한다.

 

사사오입이 정확히 이런 의미는 아니지만, 편하게 외우기 위하여 사사오입이라고 외우면 편하다.

사(4)일 땐 버리고, 오(5)일 땐 올리고,

짝수일땐 버리고, 홀수일땐 올리고라고 생각하면 편하다.

 

 

 

C/C++/JavaScript 같은 C에서 파생된 언어에서는 내가 아는 반올림과 같았는데

파이썬은 이럴 줄은 몰랐다...ㅠㅠ 나중에 round를 사용한 코드에서 원하는 Output이 제대로 안나온다면

이 문제가 아닐까 생각해보는게 좋을 것 같다.

 

 

 

혹시 몰라서 테스트해본 JavaScript

내가 아는 반올림이 맞다..

 

왜 파이썬은..아닐까...하ㅠㅠ 

 

JavaScript

 

반응형

'Coding > Python' 카테고리의 다른 글

Python extend 와 append  (0) 2020.05.16
Python 입력 받기  (0) 2020.05.16

학교에서 Python 실습보조원을 하면서 많은 질문을 받았는데,

 

append 대신 extend를 사용했는데 작동이 제대로 안돼요! 라는 질문을 받았다.

 

나는 extend를 모르기에 바로 구글에 검색을 해보았다.

 

검색한 결과는 이 친구도 append처럼 리스트에 값을 삽입할 수 있지만

 

결론적으로 말하면 extend는 리스트에 원소를 삽입할 수 있다는 면에서는 append와 같지만, 전혀 다른 기능을 하는 함수였다.

 

extend는 오히려 Javascript의 spread operater 같은 느낌?... 요즘 자바스크립트만 계속 공부해서 그런지 보고 나서 이 생각이 들었다.

 

a = "hello"
append_list = []

expend_list = []

 

append_list.append(a)
extend_list.extend(a)

 

print(append_list)
print(extend_list)

 

만약 이렇게 한다면 결과는 어떻게 될까?

 

['hello']
['h', 'e', 'l', 'l', 'o']

 

이렇게 된다. JavaScript를 안다면 알겠지만, spread operater 같은 결과를 나타낸다.

 

설명하자면 잘기잘기 찢어서 그 원소들을 넣어주는 것이다!

"hello"같은 문자열 같은 경우는 한 글자씩 쪼개서 넣어주는 것이다!

그래서 int는 extend가 되지 않는다.

 

그렇다면 list를 넣어준다면?

 

a = ["hello"]
append_list = []

expend_list = []

 

append_list.append(a)
extend_list.extend(a)

 

print(append_list)
print(extend_list)

 

정말 재밌는 결과가 나온다.

 

[['hello']]
['hello']

 

이런 결과가 나온다.

 

처음 보는 사람은 헷갈릴 수 있겠다. 아마 이런 부분 때문에 질문을 한 것이 아닐까.

 

그러니까 append는 ["hello"] 라는 리스트 자체를 리스트에 넣은 것이다.

리스트 안에 리스트를 넣어준 것이다.

따라서 결과물은 이런 [['hello']]라는 2차원 배열이 된거다.

 

하지만 extend는 갈기갈기 찢은 거다.

a라는 리스트를 갈기갈기 찢어서 리스트의 원소인 "hello"만 꺼낸 뒤

extend에 넣어주었기 때문에, ['hello'] 이렇게 된 것이다.

 

그러니까 이해를 쉽게 하기 위해 비교하자면

 

for i in a:

    extend_list.append(i)

 

이거와 

 

extend_list.extend(a)

 

이 두 코드는 동일하다.!

반응형

'Coding > Python' 카테고리의 다른 글

파이썬 반올림 round() 흔히 하는 실수! 사사오입 원칙  (0) 2020.06.12
Python 입력 받기  (0) 2020.05.16

코딩테스트들을 준비하다보니 요즘은 Python으로 풀면 편해지는 문제가 너무 많다.

 

사실 주력 언어가 C++이고, 대학교와서 대부분의 개인 공부와 과제를 C++로 했지만, 눈물을 머금고 코딩 테스트 주력 언어를 바꾸어야할 것 같다. ㅠㅠ

 

사실 그래프를 그리거나 트리를 그리는 문제는 아직 익숙해지지 않아서 그런지 C++이 더 편해보이긴하지만,

 

문자열 관련 문제는 파이썬이 압도적으로 편하다...

그리고 시간 같은 경우도 C++에 비해 파이썬이 느려서 파이썬 시간 제한을 좀 더 여유롭게 주는 것 같다?

뭔가 C++은 시간을 빡빡하게 주는 느낌.. 파이썬은 넉넉하게 주고..

 

그래서 코딩테스트 준비를 위한 파이썬 기본 문법 정리를 해보려 한다.

 

코테를 여유롭게 푸는 그날까지.....ㅠ

 

 

입력은 파이썬에서는 input() 이라는 함수로 받는다.

 

입력이 너무 많으면 시간이 오래걸려서 sys.stdin.readline()이나 sys.stdin을 쓰기도 하지만, 

기본적으로는 input()이라는 함수를 쓴다.

 

n = input() 이렇게하면 입력된 문자열은 n에 담긴다.

 

n은 문자열이므로, 숫자와 같은 다른 형태로 사용하려면 형변환을 해주어야하는데

 

입력 받을 때부터 int로 받으려면 n = int(input)  이렇게 받아주면 된다.

 

그리고 만약 띄어쓰기 한 값들을 받고 싶다!

 

1 2 3 4 이 값들을 하나하나 리스트에 담고 싶다면

 

num_list = input().split() 하면 된다.

 

split(끊을 부분) 을 입력하면 다르게도 받을 수 있긴하다.

 

num_list = ['1', '2', '3', '4'] 이렇게 저장되므로, 숫자로 사용할거면 형변환을 해주어야한다.

 

아쉽게도 num_list = int(input().split())

이렇게는 불가능하다 ㅎㅎ

 

 

 

반응형

'Coding > Python' 카테고리의 다른 글

파이썬 반올림 round() 흔히 하는 실수! 사사오입 원칙  (0) 2020.06.12
Python extend 와 append  (0) 2020.05.16

+ Recent posts