전체 글 106

[algospot]Quantization 오답 원인 가능성

1. 책에 적힌 문제 내용과 달리 온라인 사이트애서는 "최대 s개의 수로 양자화할 떄"라고 적혀있다.즉, s개의 수를 모두 안 써도 된다. 2. 반올림이 제대로 수행되고 있는가? (정수 변수)/(정수 변수)를 하게 되면 소수점 부분은 모두 버리게 된다. 그러니 0.5+(정수 변수)/(정수 변수)를 해도 제대로 반올림이 되지 않는다. 예를 들어 1505/3을 하면 결과는 501.66666이므로 반올림 하면 502여야 한다. 그러나 0.5+(1505)/(3)을 컴퓨터에서는 0.5 + 501로 계산한다. 여기에서 int 자료형으로 만들어줘봤자 버림 해서 501이다. 그러므로 반올림할 때는 (int)(0.5+(double)(정수 변수)/(정수 변수)) 형식을 사용하자. 3. sort의 범위를 제대로 주었는가? ..

알고스팟 2020.10.18

벡터 size()를 함부로 사용하지 말아야 하는 경우

백준 문제를 풀 때 최대 입력값을 사용해서 벡터의 생성과 동시에 크기를 할당해주는 경우가 있다. vector cards(100); 이런 식으로 생성하면 cards 벡터는 사이즈가 100이 된다. 그런데 코드를 짜는 중간에 cards.size()를 사용했다? 그렇다면 당신은 찾기 어려운 오류 속으로 빠져들었다. (초보이면 화가 솟구치는 자신을 발견하게 된다) 입력받는 테스트 케이스에서 card의 갯수가 5개나 8개로 주어질 수 있다. for (int i = next; i < cards.size(); i++) 이런 반복문을 짜게 된다면? 있지도 않은 카드 값으로 반복문을 돌리고 있게 된다. 그리고 당연히 예상한 시간보다 계산이 훨씬 더 오래 걸린다. 당근 답도 이상한 답이 나온다. 결론 1. 벡터 생성과 동..

인덱스를 통한 배열 접근 시 항상 조심하자

백준 1697번을 풀다 발견한 논리 오류다. 종종 발생할 수 있는 문제라 여겨 기록을 해둔다. 처음에는 이렇게 코드를 작성했다. 논리적으로는 알고리즘이 문제가 없어보이는데 계속 런타임 오류가 났다. #include #include #define MAX 100000 using namespace std; int S, D; int dx[3] = { 1,-1,2 }; bool visited[MAX] = { 0, }; queue q; void bfs() { int x=S, nx, level=0; q.push(x); visited[x]= true; while (!q.empty()) { int q_size = q.size(); while (q_size--) { x = q.front(); q.pop(); if (x =..

레귤러쇼 10화 DON 영어표현

audit 의미: to make an official examination of the accounts of a business and produce a report 예문: Our park is being audited. freaking 의미: used to emphasize what is being said, or to express anger 예문: I don't want your freaking sugar 해석: 화 났음을 강조하기 위해 사용 debit 의미: money taken out of a bank account 예문: He is not even doing the debit make sense 의미: to be clear and easy to understand 예문: This doesn't..

레귤러쇼 9화 Prank callers 영어표현

prank 영영사전: to play a trick on someone that is intended to be funny but not to cause harm or damage 예문: You just got pranked by the Master Prank Caller! hilarious 의미: extremely funny and causing a lot of laughter hang up 의미: to end a phone conversation 예문: hang up that phone tumor 의미: a mass of cells in the body that grow faster than usual and can cause illness 예문: I think they might cause brain..

[c++]std::list::erase() 함수 사용 시 반환 값을 사용하자

c++에 정의되어 있는 보통의 컨테이너와 마찬가지로 std::list 역시 end()는 마지막 노드 다음을 가리키고 있다. list는 이터레이터 증가/감소가 1씩만 가능하고 임의의 원소에 바로 접근하는 건 불가능하다. 그리고 좋은 점은 벡터와 달리 이터레이터를 이용해 erase 해도 이터레이터를 계속 사용 가능하다. 중간에 원소 삽입/삭제 또한 O(1) 시간복잡도면 가능하다. 중간의 원소를 가리키는 이터레이터를 이용해서 erase(itr); 이렇게 코드를 사용했다고 해보자. 그리고 erase() 함수의 리턴값을 사용하지 않았다고 치자. 이터레이터가 가리키고 있던 노드가 삭제되었다. 힙 영역의 어느 한 곳의 주소값을 가지고 있었는데 그 주소값은 존재하지 않는 값이 되었다. 그러니 itr-- / itr++ ..

레귤러쇼 8화 The unicorns have got to go 영어표현

ask sb out 영영사전: to invite someone to come with you to a place such as the cinema or a restaurant, especially as a way of starting a romantic relationship 영영표현: Why don't you ask her out? 첨언: 관심 있는 이성에게 데이트 신청할 때 쓰인다. bunch 영영사전: a group of people chick 영영사전: a young woman (offensive by many women) 영영표현: What kind of loser would want a bunch of chicks tearing their clothes off? gee 영영사전: an expr..

레귤러쇼 7화 Grilled cheese deluxe 속 영어표현

get off one's butt 영영사전 : to stop being so lazy 예문 : Now get off your lazy butts and go get me another Grilled Cheese Deluxe! 해석: 게으름 피우지 말고 나가서 치즈 샌드위치 사와 첨언: butt는 "아직 피지 않은 담배 끝부분"이라는 뜻을 가지고 있다. get off one's butt는 담배 끝부분 버리고(?) 정도로 해석되는데 담배 피우며 농땡이 피는 데에서 비롯된 표현인 듯하다. snappy 영영사전 : immediately effective in getting people's attention or communicating an idea stylish and attractive 예문: Give me..

예제 입출력은 분명 맞는데 틀렸다고 할때 대처법

백준 문제를 풀다보면 예제 입력을 여러개 넣어봤고 출력도 홈페이지에 나와있는 거랑 똑같은데 막상 채점을 해보면 "틀렸습니다"라는 잔인한 글씨를 보여주는 경우가 있다. 아마 문제를 보면 N Microsoft c + + 32 비트 및 64 비트 컴파일러는이 문서의 뒷부분에 나오는 표의 유형을 인식 합니다.The Microsoft C++ 32-bit and 64-bit compilers recognize the types docs.microsoft.com int는 약 20억인데 이걸 넘는 경우가 꽤 자주 있다. 그러니 이럴 경우에는 안전하게 가장 범위가 큰 자료형을 사용하자. 그것은 long long~ 억조를 넘어 경까지 품을 수 있을 정도로 범위가 크다.

배열을 fill()로 초기화해주자.

전역변수에 배열을 선언하면 알고리즘 문제를 풀 때 편한 건 분명하다. 어느 함수에서든 배열을 가져다 쓸 수 있기 때문이다. 그런데 이걸 도입하고서 초반부에 디버깅에 어려움을 겪게 한 일이 있다. main 위에 int arr[101] = {-1}; 이렇게 코드를 작성했다. 이렇게 하면 당연히 모든 값이 -1로 초기화될 줄 알았다. 그런데 계속 이상한 값이 출력돼서 디버깅 해보니 배열의 첫 원소만 -1이고 나머지는 모두 0이었다. 그래서 프로그램이 의도치 않게 작동했다. 결론 배열의 모든 값들을 0으로 초기화하려 한다면 ={0,}으로도 가능하다. 배열의 모든 값들을 0이 아닌 다른 값들로 초기화하고자 하면 에 있는 std::fill()을 사용해 배열의 값들을 초기화하자.