Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Mission 2. 연습문제 풀이
#pragmatic
2년 전
848

💡 연습문제 16. 간단한 현실 점검. 다음 ‘불가능한’ 것들 중 무엇이 실제로 일어날 수 있는가?

1. 한 달이 28일보다 적은 것.
2. 시스템 콜의 오류메시지 : 현재 디렉터리에 접근할 수 없음.

3. C++에서, a = 2; b = 3; 하지만 (a + b)는 5가 아님.
4. 내각의 합이 180도가 아닌 삼각형.
5. 1분이 60초가 아님.
6. (a + 1) <= a

✅ 풀이 과정

  • 한 달이 28일보다 적은 것이 처음에는 불가능하다 생각했었다. 하지만 위키피디아에서 여러 형태의 역법을 찾아보니, 개정 이전의 율리우스력, 화성의 달리우스력 등 한 달이 28일보다 적은 역법이 존재했다. 한 달이 28일보다는 적지 않더라도, 자국의 표준을 지키는 고집하는 나라들이 꽤 존재한다는 것을 알 수 있었고, 여러 나라에 서비스를 제공해야 할 때 이 점을 고려해야 함을 알 수 있었다.

  • 디렉터리에 대한 접근 권한이 없는 경우, 작업하는 동안 디렉토리가 외부 요인에 의해 삭제된 경우가 있을 수 있다.

  • a, b가 모두 unsigned라면, 두 숫자를 더한 값은 5가 될 것이다. 하지만 a, b가 3bit의 signed number라고 가정해보면, 결과값은 달라진다. a, b를 3bit의 binary로 표현해보면, 각각 010, 011이 되고, 이 둘을 더하면 101이 되는데, 이 값이 3bit의 signed number라면, 5가 아닌, -2^2 + 1 = -3이 된다.

  • 평면에서 세 점을 서로 이어 삼각형을 만들면, 내각의 합이 180도가 되나, 곡면 위에 삼각형을 그리면, 내각의 합이 180도가 되지 않는다. 삼각형의 내각의 합이 180도라는 것은 유클리드 기하학에서만 들어맞는 말이다.

  • 1분이 60초라는 것도 다들 당연하게 받아들이지만, 1분이 61초가 될 때도 있다. 현재 국제표준에 따르면, 세슘의 진동주기를 1초라고 정의했는데, 이를 기준으로 지구의 평균 자전주기를 계산하면, 24시간보다 0.002초 정도 느리다. 이 표준 시간과 실제 시간 사이의 차이가 계속 벌어지는 것을 막기 위해, 윤초라는 개념을 도입했고, 이로 인해 1분이 61초가 되는 때가 생겨났다.

  • 우선, 처음 생각이 난 경우는 a가 숫자가 아닌 경우를 생각해봤다. 그리고 위에서도 이미 언급했는데, a가 signed number고, 거기에 1을 더했을 때, most significant bit가 1이 되는 경우, a+1은 음수가 되므로, a보다 작아진다. 또한, a가 unsigned number이더라도 overflow가 발생하면, a+1이 a보다 작아질 수 있는데, 표현 가능한 범위가 최대 w인데, a+1이 w+1의 값을 건드리면, 다시 0이 되므로, a보다 작아진다.

✅ 참고 링크

  • 다양한 형태의 역법

https://ko.wikipedia.org/wiki/%EC%97%AD%EB%B2%95

http://www.allofsoftware.net/2015/06/15.html

  • signed number / unsigned number

https://bluerighter.tistory.com/7

  • 내각의 합이 180도가 아닌 삼각형

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hjkamy&logNo=20129089178

  • 1분이 61초가 될 수 있는 이유, 윤초에 관해 다룬 기사

http://www.korea-press.com/news/articleView.html?idxno=76641

  • overflow

https://infinitt.tistory.com/295

💡 책에 있는 해답

  • 1752년 9월은 30일이 아니라 19일밖에 없다. 그레고리 교황의 달력 개혁의 일환으로 달력의 날짜를 맞추기 위해 이렇게 만들었다.

  • 다른 프로세스가 디렉터리를 지웠을 수도 있고, 디렉터리를 읽을 권한이 없을 수도 있다. 드라이브가 마운트되지 않았을 수도 있고, 그 밖에 여러 가지 문제가 있을 수 있다. 어떤 상황인지 감이 왔으리라.

  • 이 문제의 함정은 a와 b의 타입을 명시하지 않았다는 점이다. 연산자 오버로딩 때문에 +, =, !=가 예상과는 다르게 동작할 수 있다. 또 a와 b가 동일한 변수를 가리키고 있을 수도 있다. 그럴 경우 두 번째 할당문이 첫 번째 할당문에서 저장한 값을 덮어쓸 것이다. 또한 프로그램에 동시성이 있는 데 이에 대한 고려가 되지 않아서 a의 값이 덧셈이 수행되기 직전에 바뀌었을 수도 있다.

  • 비유클리드 기하학에서 삼각형 내각의 합은 180°가 아닐 수 있다. 구 표면

    에 그려진 삼각형을 생각해 보라.

  • 윤초 때문에 61초일 수 있다.

  • 언어에 따라서 숫자가 최대 숫자 한계를 넘어가는 바람에 a+1의 부

    호가 음수로 바뀔 수도 있다.

💡 교훈

  • 이 문제에서 가정한 상황들이 틀릴 수도 있다는 전제 하에 이것저것 검색해보면서 문제의 답을 찾으려 시도했다. 당연하다 여기던 사실들이 당연하지 않을 수 있다는 걸 보여주는 멋진 문제라 생각하며, 이 문제를 보여주는 것만큼 단정(assertion)의 중요성을 잘 보여줄 수 있는 방법이 있을까하는 생각이 든다.

  • 세상에는 내가 생각한 것보다 더 많은 변수가 존재하며, 이로 인해 생각한 것보다 훨씬 많은 이유로 프로그램이 오류를 일으킬 수 있음을 알 수 있게 해주는 문제였다. 많은 교훈을 주는 문제인 것 같아 예시에서 이 파트를 추가했다.