정말 오랜만에 글을 쓰는 것 같네요ㅎㅎ
이전까지는 일기장 형식으로 편하게 작성하면서 스스로의 방향성, 근황에 대해서 블로그 게시물을 작성했습니다. 그러나 앞으로는 주로 공부를 하면서 얻은 인사이트 들을 정리하려고 합니다. 그래서 기존에는 '~했다.' 와 같은 서술 방식을 이용하여 블로그 글을 작성했지만 앞으로는 멋있게 '~했습니다.' 로 변경하려고 합니다. 블로그의 변경된 내용과 관련해서는 여기까지 기술하고 본 게시글의 목적으로 넘어가도록 하겠습니다.
프로그래밍을 하면서 이클립스나 Intelij와 같은 IDE를 이용하다보면,
적어도 한번 이상은 for문을 자동완성 하게 됩니다.
저는 그때 마다 들었던 궁금증이 있습니다.
for(int i = 0; i < N; i++){
}
'왜 IDE에서 for문의 기본 설정은 N미만일까? 왜 N 이하가 아닐까?'
오늘 저는 우연히 알고리즘 문제해결전략 1을 읽게 되었는데, 이 책에서 위의 궁금증에 대한 답을 알 수 있었습니다.
위 책은 알고리즘 공부를 위해 책을 구매했으나... 아직까지도 읽지 않다가 프림, 크루스칼, 다익스트라와 같은 그래프 알고리즘에 대해 공부하려고 책을 꺼내게 되었지만 독서를 하게되면 생기는 저만의 고집 덕분에 앞에서부터 차례대로 읽으면서 우연히 제가 궁금했던 부분에 대해 알게 되었습니다.
(고집이란... 무조건 놓치는 부분 없이 책의 모든 것을 읽고 싶어지는 고집입니다. 굳이 지킬 필요는 없지만 이를 지키고 책을 완독했을 때 매우 뿌듯해서 자기계발 책이나 경제 책, 컴퓨터 공학 책과 같이 분야에 상관없이 혼자 지키는 루틴입니다. 그러나 루틴을 지키기 위해 독서량이 줄어드는 일은 어리석은 일이니 상황에 맞게 진행하고 있습니다. 오늘은 평화로운 주말이므로 해당 루틴을 지키면서 독서를 하게 되었습니다.)
위 책을 읽으면서 자바, 파이썬 등등 제가 접했던 언어들은 모두 반 열린 구간을 이용하고 있었다는 흥미로운 사실을 알게 되었습니다. 코딩을 하면서 항상 사용해 왔지만 실제로는 왜 그렇게 사용하는 지는 모른 상태로 계속 사용하고 있던 부분에 이유가 있다는 사실을 알게되어 이를 잊지 않기 위해 본 게시물을 작성하게 되었습니다.
일정한 수의 범위를 나타내는 방법은 열린 구간, 닫힌 구간, 반 열린 구간이 있습니다. 아래의 내용은 모두 1 ~ 7 사이의 값을 나타내는 구간입니다.
따라서 한 범위는 위와 같이 총 4가지의 범위를 사용하게 됩니다. 그 중에서 자바, 파이썬과 같은 언어에서는 1 ≤ x < 8 과 같은 방식을 사용하고 있는데요. 이는 Java 언어의 문자열 추출 메소드인 String API의 substring 메소드를 예시로 설명할 수 있습니다. 오라클 홈페이지에 접속하여 확인을 해보면 다음과 같이 substring 메소드를 확인할 수 있습니다.
위의 세부 내용을 보게 되면, substring 메소드의 매개변수로 int 타입인 beginIndex와 endIndex가 필요하다는 것을 알 수 있습니다. 그리고 Parameters 항목을 자세히 보면 beginIndex는 inclusive, endIndex는 exclusive 성질을 가진다는 것 또한 알 수 있습니다. inclusive와 exclusive를 네이버 어학사전에 번역해보겠습니다.
inclusive란 '포함된' 이라는 의미를 가지고 있으며, exclusive란 '배타적인' 이라는 의미를 가진다는 것을 알 수 있습니다. 이는 결국 inclusive는 '≤' 을 의미하고, exclusive는 '<' 를 의미한다는 것 또한 알수 있습니다.
그렇다면, substring 메소드를 이용하여 1 ~ 7 인덱스 사이의 문자열을 추출하고 싶다면 beginIndex는 1, endIndex는 8을 넣어야 합니다.
그렇다면 왜? 이러한 방식을 사용하는 걸까요?
결론부터 말씀드리자면 아래와 같습니다.
1. 공집합을 쉽게 표현할 수 있다.
2. 두 구간이 연속해 있는지 쉽게 알 수 있다.
3. 구간의 크기를 쉽게 알 수 있다.
이를 자세히 설명드리기 위해서는 열린 구간과 닫힌 구간의 단점에 대해 알아볼 필요가 있습니다.
열린 구간의 단점은 배열의 첫 번째 원소부터 시작하는 범위를 표현하고 싶은 경우 첫 번째 원소 이전에 존재하는 가상의 원소를 사용해야 한다는 것입니다. 예를 들어 0 ~ 10 까지의 범위를 표현하기 위해서는 -1 < x < 11 로 표현해야 하는데, 이는 가독성이 떨어지고 자연스럽지 않습니다.
닫힌 구간의 단점은 공집합을 표현하기 어렵다는 점입니다. 예를 들어 1 ≤ x ≤ 1와 같은 수식은 1을 포함하게 됩니다. (공집합이 되지 않습니다.) 즉, 닫힌 구간에서 공집합을 표현하기 위해서는 2 ≤ x ≤ 1 과 같은 방식을 이용해야 하는데, 이 또한 가독성이 떨어지고 자연스럽지 않습니다.
위의 내용에 제 개인적인 생각을 덧붙이자면, 변수를 선언하고 범위를 지정할 때 열린구간이나 닫힌구간과 같이 원하는 범위 외의 값을 이용한다면 연산하는 과정이 추가되어 프로그래밍적으로도 효율이 떨어질 것 같습니다.
따라서, 반 열린 구간은 위의 단점들을 해결하기 위하여 사용하게 된 것입니다!
반 열린구간의 장점에 대해서 예시와 함께 추가적으로 서술하겠습니다.
첫 번째로 '공집합을 쉽게 표현할 수 있다.'는 것은 다음의 1 ≤ x < 1 예시로 설명할 수 있습니다. 1 ≤ x < 1과 같은 상황에서 x는 존재하지 않습니다. 1보다 같거나 커야하지만 1보다 작은 수는 없기 때문입니다. 따라서 공집합을 쉽게 표현할 수 있습니다.
두 번째로 '두 구간이 연속해 있는지 쉽게 알 수 있다.'는 것은 다음의 2 ≤ x < 6, 6 ≤ x < 10 예시로 설명할 수 있습니다. 2 ≤ x < 6 과 6 ≤ x < 10 과 같이 두가지의 구간이 있을 때 반 열린 구간으로 표현을 한다면 두 구간이 연속해 있는지 쉽게 알 수 있습니다. 따라서 위의 예시에서는 첫번째 구간인 2 ≤ x < 6 의 오른쪽 숫자 6과 두번째 구간인 6 ≤ x < 10의 왼쪽 숫자가 같으므로 구간이 연속함을 알 수 있습니다. 첫번째 구간에서는 6을 포함하지 않고, 두번째 구간에서는 6을 포함하고 있기 때문입니다. 그 외의 경우에는 숫자를 +1하거나 -1 하는 등의 부가적인 계산이 필요하나 반 열린 구간은 추가적인 계산없이 확인할 수 있습니다.
마지막으로 '구간의 크기를 쉽게 알 수 있다.'는 것은 두 번째 내용에서 사용했던 2 ≤ x < 6 구간을 다시 예시로 들어 설명하겠습니다. a ≤ x < b와 같은 반 열린 구간은 문장으로 서술하면 'x는 a 이상이며 b 미만이다.' 로 표현할 수 있습니다. 이 때 구간의 크기는 b - a로 간편하게 알 수 있습니다. 따라서 위의 예시의 구간의 크기는 6에서 2를 뺀 4임을 알 수 있습니다. 이구간이 포함하는 숫자를 적어본다면 차례대로 2, 3, 4, 5 인데 이는 위에서 구한 4와 개수가 동일합니다. 그러므로 b - a로 구간의 크기를 알 수 있습니다.
a ≤ x < b 와 같은 형태인 반 열린 구간은 다양한 장점이 있다.
그러한 장점에는 '공집합을 쉽게 표현할 수 있다.',
'두 구간이 연속해 있는지 쉽게 알 수 있다.', '구간의 크기를 쉽게 알 수 있다.' 등이 있다.
[한컴프] 2진수 음수 표현 (0) | 2022.04.26 |
---|
댓글 영역