전체 글

    백준 20302 민트초코

    20302번: 민트 초코 문자열 파싱을 이상하게 시도해서 애먹었던 문제입니다.. 가장 단순히 보이는 풀이는 나오는 모든 수를 곱하거나 나누어서 마지막에 유리수 판정을 하는 것입니다. 하지만 최대 100,000 ^ 100,000 인 수를 변수에 저장할 순 없을 것입니다. 가능하더라도 나눗셈이 나오면 무한소수가 아오는 등 정확한 값을 저장할 수 없기 때문에 다른 방법을 생각해 보아야 합니다. 우리는 각 숫자를 더하거나 나눌때 이 수를 나누어서 저장하고 계산할 방법이 필요합니다. 이 수를 어떻게 잘 저장할 수 있을까요? 정답은 바로 소인수분해 입니다. 만약 수를 소인수분해한 형태로 저장하면 관리하기도 쉽고, 마지막에 유리수 판정을 할 때도 간단하게 할 수 있습니다. 그럼 소인수분해는 어떻게 하면 될까요? 기본..

    C의 음수 표현법과 2의 보수

    컴퓨터에서는 모든 수를 2진법으로 저장한다. 우리가 화면에 10이라고 십진수로 써도 실제로는 0000 1010이라고 저장된다는 것이다. 하지만 단순히 이런 방법으로만 하면 음수를 저장할 방법이 없다. 그래서 프로그래머들은 다음과 같은 방법을 고안했다. 바로 첫 번째 비트는 부호 (-, +)를 저장하고 그다음부터는 실질적인 값을 저장한다는 것이다. 맨 앞에 있는 비트 0은 '+', 1은 '-'를 의미한다고 보면 된다. 0000 0000 = +0 0000 0001 = +1 ... 0111 1111 = +127 1000 0000 = -0 1000 0001 = -1 ... 1111 1111 = -127 하지만 이렇면 문제점이 생긴다. 바로 0을 표현할 방법이 두 개라는 것인데, 그러면 사소하지만 메모리를 손해 ..