코딩 테스트에서 많이 나오는 것 중에 하나는 조합을 구현하는 것입니다. 물론, 이것이 단독으로 나오는 경우는 매우 드뭅니다. 보통, 구현까지 요구하는 경우가 많습니다. 여기서 더 어려워 지면, 대놓고 조합으로 푸세요. 라고 하지 않고, 조건을 숨겨놓는 경우도 있는데요. 이 문제가 그에 속합니다. 이번 시간에는 조합을 어떻게 구현하는지 정도만 언급하도록 하겠습니다. n개 중에 m개를 뽑는다고 해 봅시다. 뽑은 것만 중요한 게 조합입니다. 순서가 중요하진 않아요. 그러면, 하나를 뽑으면서, 뽑을 수 있는 집합을 줄여나간다고 봐도 될까요? 예를 들어보겠습니다. 카드가 5개 있습니다. 이 중 3개를 뽑아야 합니다. 뽑은 것이 중요하니, 전략을 하나 세워봅시다. 일단, 먼저 뽑은 카드에 적혀있는 수가 나중에 뽑은..
구현 검색 결과
c언어 교재에 단골로 나오는 소재는, 달력을 예쁘게 출력하는 것입니다. 처음 접해보면 어려울 수도 있는데요. 기능을 잘 쪼개고 들어가면 됩니다. 코딩 테스트에서도 기능을 잘 쪼개고 들어가는 것은 굉장히 유용한 스킬이니, 익혀 두시면 좋습니다. 일단, 간단한 플로우 먼저 그려봅시다. 복잡해 보이지만, 사실 yyyy년 mm월 1일의 요일과, yyyy년 mm월이 몇 일까지 있는지만 구하면 어렵지 않게 출력할 수 있음을 알 수 있습니다. 이 기능들을 또 쪼개 보겠습니다. yyyy년 mm월 1일의 요일을 알기 위해서는 기준이 되는 날의 요일을 알아야 합니다. 다음에, 월별로 몇 일까지 있는지를 알아야 합니다. 그래야, 기준 요일로부터 몇 일만큼 지났는지를 누적할 수 있기 때문입니다. 해당 기능을 구현하기 위해서 ..
진법 변환은 어떻게 하면 좋을까요? 사실 익숙한 것이지만, 막상 코테에 나오면 당황할 법 합니다. 단독으로 나오기도 하지만, 문제를 푸는 과정에서 등장하기도 합니다. 0보다 큰 정수 n을 b진법 (b는 1보다 큰 정수)으로 바꾸는 방법을 알아보도록 하겠습니다. 그리고, AssertionError를 떨구는 것도 같이 알아보겠습니다. 먼저, 23을 10진법으로 변환하는 알고리즘을 생각해 봅시다. 그러면 먼저 23을 10으로 나눠야 할 겁니다. 그러면 몫이 2가 나오고, 나머지가 3이 나옵니다. 여기서 우리는 나머지 3을 취합니다. 몫이 2가 아니니, 2를 10으로 나누어서 몫과 나머지를 다시 구해야 합니다. 그러면 몫이 0이고, 나머지가 2입니다. 몫이 0이 되었으니 여기서 끝내면 되겠군요. 나머지는 3, ..
안녕하세요. 조경완입니다. 오랫만에 구현 카데고리로 돌아왔습니다. 문자열 뒤집기는 코테 뿐만이 아니라 면접에서도 물어볼 수 있는 내용입니다. 문제는, 이것입니다. 한글 때문에 조심해야 합니다. 이는, 한글이 1byte로 표현되지 않기 때문입니다. 그리고, 어떤 방식으로 인코딩 된 문자열인지도 언급되지 않았으니, 이 부분도 질문하시는 게 좋겠습니다. 그리고 해당 인코딩으로 표현 가능한 문자 셋만 들어오는지도 질문 해 두면 좋겠습니다. 아래 Solve 클래스 내에 있는 revGetByte를 생각해 보겠습니다. 이 함수는 EUC-KR로 b0a1 b3aa로 인코딩 된 바이트를 b3aa b0a1로 바꾸는 함수입니다. 그리고 이 결과물을 파일 b에다가 씁니다. 파일 a도 EUC-KR로, b도 EUC-KR로 인코딩 ..
백준에서 a^b꼴의 문제를 본 적이 있을 겁니다. 문제는 여기에서 풀어보실 수 있습니다. 물론, b는 0보다 크거나 같고 100보다는 작거나 같은 정수이고, a는 소수점 밑에 자리수가 9개까지 나올 수 있습니다. 사실, 저는 이것을 .을 기준으로 일일히 파싱해서 풀었습니다. 즉, .을 기준으로 나누면 j/m꼴이 됩니다. 그러니, (j/m)^b을 계산하는 문제로 바뀌고, m은 10^q꼴이니, j^b의 결과값에 따라서 적절히 잘 파싱하면 됩니다. 그런데, 그리 한다면, j는 최대 11자리 ~ 12자리의 정수로 바뀔 거고, b는 최대 100이니, 1100자. 결국 이 문제를 제대로 풀려면 큰 수 곱셈을 잘 구현해야 한다는 이야기가 되겠습니다. 이펙티브 자바가 있다면 정확한 답이 필요하다면 float와 doub..
최근댓글