파이썬에서 간단하게 랜덤하게 수를 뽑을 때 이용하는 randint와 randrange에 대해서 알아봅시다. 문제를 출제하기 위해 제너레이터를 만드는 경우에는 거의 100%의 확률로 이용됩니다. 그러니, 잘 알아두는 것이 좋겠습니다. random에는 randint가 있어요. 1번째 인자가 1이고, 2번째 인자가 6이에요. res에 add를 10000번 하는데요. rd.randint(1,6)의 결과를 계속 set에 추가하는 것을 의미해요. 파이썬에서 set은 중복을 제거하는 자료구조이니, 6이 여러 번 들어가도 1번만 들어가게 될 겁니다. 결과는 1, 2, 3, 4, 5, 6이 나옵니다. 즉, randint(a, b)는 a 이상 b 이하의 랜덤한 수가 나옵니다. 2개의 수만 받고 있음을 알 수 있어요. 저는..
레퍼런스/예제 검색 결과
string을 int로 바꿀 수 없을까요? c_str로 raw pointer를 리턴받고, atoi에 raw_pointer를 넘겨주면 됩니다. 사실 저는 stoi를 알기 전까지 이렇게 했습니다. 예제 프로그램을 보도록 하겠습니다. 저는 string "123"을 정수 123으로 바꾸고 싶습니다. 그렇게 하려고 s.c_str()의 리턴값을 atoi에 넣었습니다. 그러면, 실제 "123"을 들고 있는 위치인 p를 atoi에 넣게 됩니다. atoi는 이 위치부터 NULL이나, '0', ... '9'가 아닌 다른 것을 만날 때 까지 읽게 될 겁니다. 문자열에 대충 이래 저장이 되어 있다고 하면, '1'을 읽고 '2'를 읽고 '3'을 읽고 난 후에 숫자가 아닌 문자가 있으니, break를 걸 겁니다. 따라서, 이 때..
백준 문제를 풀다 보면, 균형 이진 트리를 써야 하는 경우를 종종 보셨을 겁니다. 이것을 다룰 때, x보다 큰 것 중 제일 작은 키, 같거나 큰 것 중 제일 작은 키, 작은 것 중 제일 큰 키, 작거나 같은 것 중 제일 큰 키를 실시간으로 구해야 하는 상황을 접하셨을 겁니다. java에서는 어떻게 하는지 간단하게 알아봅시다. 먼저, c++의 map에는 lower_bound, upper_bound가 있었습니다. 이와 유사하게 자바의 TreeMap에는 ceilingKey와 higherKey가 있습니다. 이 둘의 설명을 보겠습니다. 먼저, ceilingKey 메소드는 제일 작은 키를 리턴한다고 하는데요. 조건이 하나 있습니다. given key보다 크거나 같은 것. 예를 들어, 1, 2, 3, 7이 있다고 해..
저번에, 경로 조작 공격을 이 글에서 다루었습니다. 글이 난이도에 비해서 꽤 길었는데요. 요약하면 이거였습니다. 클라이언트의 입력을 곧이 곧대로 믿지 말라. 이것에 대해서 조금 더 찾아보면, 방지책으로 절대 경로를 쓰라고 되어 있습니다. 이 답글이나, 이 문서에서도 강조하고 있는 부분이기도 합니다. 데이터 파일들은 특정한 경로 안에 있을 것이기 때문입니다. [관련글] 사용자의 입력값과 path traversal 공격 File 클래스를 보면, getAbsolutePath와 getCanonicalPath가 있습니다. 아래 예제를 보겠습니다. 테스트 케이스는 하나입니다. ..\\.idea입니다. 이것은 프로젝트 폴더의 상위 디렉토리로 이동해서 .idea로 이동하겠다는 의미입니다. 출력 결과만 보도록 하겠습니다..
백준에서 lower_bound, upper_bound는 정렬된 배열에서 상당히 많이 썼습니다. 파이썬에는 없을까요? bisect 모듈에는 bisect_right와, bisect_left가 있습니다. 쉽게 말해서 이 둘은 정렬된 list에서 upper_bound와 lower_bound에 대응되는데요. 어떻게 동작하는지 보겠습니다. 키가 정수인 경우에 대해서 생각해 보겠습니다. 먼저, 전자부터 보겠습니다. 일단 lo와 hi는 탐색 범위를 의미합니다. 배열 전체를 탐색하려는 경우에는 a와 x를 넣습니다. 여기서 a는 list이고 x는 기준 값을 의미해요. 여기서, 우리는 어떻게 범위를 좁히는지 볼 필요가 있는데요. a[mid]보다 x가 작으면 hi가 mid가 됩니다. 즉, 찾으려는 수 보다 a[mid]가 큰 ..
최근댓글