늦은 프로그래밍 이야기
230209 TIL (알고리즘, 프로젝트) 본문
알고리즘
이진 변환 반복하기
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
주어지는 이진수의 문자열에서 0을 제거하고 해당 문자열의 크기를 이진수로 변환하고 다시 앞의 작업을 반복하며 해당 수가 1이 될 때까지 반복하여 이진변환을 한 횟수와, 제거한 0의 갯수를 반환하는 문제였다.
재귀로 반복하는 메소드를 구현해 보았는데, count 변수와 zero 변수를 어디에 넣어줄지 고민하다가 클래스 내에 전역으로 정의 했는데, IDE에서 테스트 해보았을 때 count와 zero가 누적이 되어 출력 되어서 전역으로 정의하는 방법 외의 방법은 떠오르지 않아서 그냥 프로그래머스에 작성해서 실행해 보았더니 정답으로 처리되었다.
class Solution {
static int count = 0;
static int zero = 0;
public static void binaryTranslation(String s) {
if (s.equals("1")) return;
char[] arr = s.toCharArray();
int one = 0;
for (char ch : arr) {
if (ch == '0') zero++;
else one++;
}
String ss = Integer.toBinaryString(one);
count++;
binaryTranslation(ss);
}
public int[] solution(String s) {
binaryTranslation(s);
int[] answer = {count, zero};
return answer;
}
}
IDE에서 main 메소드를 사용하여 실행하면 연속적으로 실행되지만, 프로그래머스에서 실행을 하면 각각의 케이스마다 끊어서 실행을 하는 것 같았다. 반환하는 값을 static으로 전역 변수로 사용을 해도 되는지에 대한 궁금증이 생겼다.
다른 사람의 풀이
다른 사람의 풀이를 보다가 재귀를 사용하지 않고 반복문으로 해당 이진변환을 반복하는 코드를 보게 되었다.
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int temp;
while( !s.equals("1") ) {
answer[1] += s.length();
s = s.replaceAll("0", "");
temp = s.length();
s = Integer.toBinaryString(temp);
answer[0]++;
answer[1] -= temp;
}
return answer;
}
}
재귀 대신 반복문을 사용한 코드였는데 Argument로 받아온 문자열 s의 값을 변경해 주면서 반복하여 연산하는 방법인 것 같다. while문을 평소에 잘 쓰지 않는데 while문으로 재귀와 비슷하게 구현할 수 있다는 것을 알게 되었다. 기억하고 있다가 다음에 비슷한 문제를 만나면 시도해보자.
프로젝트
오늘 팀원들과 함께 API 명세서를 작성하여 모두 완성하였다. API를 작성하면서 필요한 기능이지만 SA문서에 작성하지 않았던 기능들도 보이게 되어서 팀원들과 회의를 통해 기능들을 추가하고 API 문서를 구글 시트로 함께 작성하여 빠르게 완성을 하였다.
피드백에서 언급되었던 외부 API를 어떤 것을 사용할지에 대해서는 아직 확정되지 않았지만, 기존에 네이버 지도 API를 사용하기로 했었지만, 네이버는 무료 이용건수가 적은 듯하여 조금 더 많은 카카오 API를 사용하기로 잠정 합의 되었다.
오늘 드디어 프로젝트를 생성하고 GitHub을 연동하였다. 아직 작성된 코드는 없지만 드디어 시작한다는 기대감이 부풀어 올랐다. 다른 팀들은 벌써 코드를 꽤나 많이 작성한 모습을 보며 조급한 마음도 조금 들었지만, 코드를 작성하다가 다시 설계를 하는 팀도 있기에, 기획과 설계에 중점을 둔 것은 후회하지 않는다. 좋은 결과물이 나오길 기대한다.
프로젝트 일정관리는 Github Project를 쓰기로 했다. Github Project가 칸반보드를 작성하면 해당 작업의 내용으로 자동으로 이슈를 생성 해주고, 이슈를 닫으면 해당하는 작업 내용이 완료로 바뀌는 호환성이 좋은것 같아서 선택하게 되었다. 보드를 생성하고 API 문서의 구역을 나눠 팀원들과 빠르게 API 별로 보드에 작업들을 추가하였다.
가장 중요한 역할 분배를 하여야 하는데 많은 고민이 있었다. 기존에 해왔던 기능별로 할 것인지, 피드백을 받았던 도메인 별로 책임자를 분류할 것인지에 대한 것이었다. 도메인 별로 분류를 한다면 DDD를 구현해야 하는 것 아닌가 하는 생각에 DDD에 관한 자료들도 찾아보고 했지만, 우리가 이해하기에는 너무 난해한 내용인듯 하였다. 도메인이라는 개념도 없는 우리로써는 도메인, 핵심 도메인 등등의 용어들도 이해하기 힘들었다.
일단은 하고 싶은 기능들을 골라서 하기로 하였는데 그렇게 되니 너무 이것저것 선택하게 되고 머지할 때 충돌이 많이 생길 것 같아서 튜터님에게 질문을 통해 도메인 별로 분류하는 것으로 결정하였다. 도메인의 분류 작업은 회의를 통해 도출해야 할 것 같다.
'내일배움캠프 > TIL, WIL' 카테고리의 다른 글
| 230213 TIL (최종프로젝트) (0) | 2023.02.13 |
|---|---|
| 230210 TIL (알고리즘, 프로젝트) (0) | 2023.02.10 |
| 230208 TIL (알고리즘, 프로젝트) (0) | 2023.02.08 |
| 230207 TIL (알고리즘, 프로젝트) (0) | 2023.02.07 |
| 230206 TIL (알고리즘, 프로젝트) (0) | 2023.02.07 |