https://github.com/woowacourse-precourse/java-onboarding/pull/835
[온보딩] 이장희 미션 제출합니다. by JangAJang · Pull Request #835 · woowacourse-precourse/java-onboarding
github.com
1주차 코드
1주차 코드를 써보며 프로그래밍에 대한 생각들을 해보았다.
문제 자체는 간단한 알고리즘문제들을 모아둔 느낌이었다. 그런데, 프리코스를 시작하기 전 코치님들의 한마디가 떠올랐다.
"이번 테크코스를 통해 더욱 공부할 수 있으면 좋겠다"
내가 이번 테크코스를 통해 공부할 수 있는 것이 무엇인지 생각해보았다.
더 나은 코드? 더 수준 높은 기능들의 활용? 등등 수많은 가짓수들이 머리를 지나갔다.
이후, 각 주차에 따른 코드에 대한 공부하고 사용할 방법들을 생각해보았다.
1주차 온보딩 : 메서드 indent = 2, stream(), lambda식
2주차 ????? : 메서드 indent = 1와 길이 = 15, 테스트 코드 작성에 익숙해지기, 생각부터하고 코딩하기, 테스트에 맞는 코드 만들기
3주차 ????? : 메서드 indent = 1와 길이 = 10, TDD 활용해보기
4주차 ????? : 메서드 indent = 1와 길이 = 5, TDD 활용해보기
이런 생각을 처음에 구상해두었다.
(왜이런지 궁금하면 이전 개발생각 게시물을 보면 알 수 있다!!!)
stream이 어땠고, lambda식이 어떤지는 자바 게시물을 통해 정리할 것이다.
온보딩을 하면서 느꼈던 것을 정리해보자면,
인덴트 1를 맞추는데에 너무 급급하기도 했다. static을 이용하기에, 리턴문을 엄청나게 사용하고, 전역변수를 사용하지 않은 경우들이 많았다.
차라리 전역변수화 시킨 후, 리턴 문 없이 전역변수를 수정하는 과정을 거쳤다면, 계속해서 그 값들을 만들어내고, 불필요하게 값을 새로 불러오고 하는 행동을 반복해야하는 건가라는 생각이 들었다.
예를 들자면, 리턴으로 정수값을 내고, 입력값으로 문자열이 있을 때, static 메서드라면 임의로 그 값을 복사해 가져와 사용하는 걸로 알고있다. 그렇다면 그 메서드들은 계속해서 값을 복제해 사용하기를 하는 것 같다는 생각이 들었다. 또한, 그 변수명들이 정확하게 지칭하는 바를 표현하는가 하면 그것도 아닐 수 있다는 생각이 들었다.
다음부터는 전역변수라는 것을 더욱 활용해보자는 생각이 들었다.
또한, 데이터의 구조를 사용할 때 조금 더 신중해야 할 필요가 있는 것 같다. HashMap, Set, List등을 활용하고, 이를 토대로 데이터를 활용했을 때, 배열에서 개수를 세고, 반복이 있는지 확인하는 것 보다 더욱 효율적이다라는 것을 느꼈다.
더욱 넓은 시야에서 가능성들을 고려해 생각을 하면 좋을 것 같다. 또한, 이러한 데이터 구조를 활용하기 위해 stream()을 공부하려는 생각도 들었다.
마지막으로, 생각을 너무 어렵게 하지 말자는 생각도 들었다. 문제 2번을 보고 이 생각을 했다.
암호문을 좋아하는 괴짜 개발자 브라운이 이번에는 중복 문자를 이용한 새로운 암호를 만들었다. 예를 들어 "browoanoommnaon"이라는 암호문은 다음과 같은 순서로 해독할 수 있다.
1. "browoanoommnaon"
2. "browoannaon"
3. "browoaaon"
4. "browoon"
5. "brown"
임의의 문자열 cryptogram이 매개변수로 주어질 때, 연속하는 중복 문자들을 삭제한 결과를 return 하도록 solution 메서드를 완성하라.
이런 문제였는데, 보기만 했을 때 간단했던 이 문제가 마지막까지 리펙토링 하던 유일한 문제였다.
스택을 이용한 구현을 처음 했다.
Stack.peek()와 다음 index의 문자를 가져와 비교해 같으면 stack.pop()하고, 아니면 stack.push()하는 식으로 구현했었다.
하지만, 홀수개 만큼 중복되었을 때, 이미 스택의 피크는 지워져있기에 중복이 아닌 것으로 확인되었다.
이를 위해 스택에서 삭제된 알파벳을 따로 character 타입으로 저장했다가 이를 활용해 코드를 리펙토링했었다.
스택이라는 구조를 활용하기 위해서 더욱 노력했던 것 같다.
하지만 되게 단순한 방식으로 중복을 지울 수 있다.
첫 인덱스부터 마지막 인덱스까지 비교하면서
- 첫 문자는 다음 문자와 다르면 중복이 아니다.
- 마지막 문자는 직전 문자와 다르면 중복이 아니다.
- 나머지 문자는 앞문자와 다르고, 뒷문자와 다르면 중복이 아니다.
이를 활용해 StringBuilder에 저장하고, 이를 문자열로 반환하면 되는 것이다.
반복문에, if조건문 3개, 집어넣는 기능 한개. 메서드는 총 3개 필요하다. 이런 것을 나는 스택 구현, 스택에서 값 비교, 비교한 값을 또 입력할지 말지 지울지 말지 삭제문자를 수정할지 말지를 계속해서 메서드 늘리기로 진행했다.
새로운 기능, 새로운 방식의 접근, stream이나 lambda, for(String each : all(String[] 타입))같은 반복문도 분명 활용한다면 좋을 것이다. 하지만, 어떤게 지금 상황에서 더 활용하기 좋은지를 생각해야지, 축약되고 여러 기능이 있다고 좋은 것은 아닌 것을 깨닳았다.
이번에 깨닳은것을 딱 두 줄로 줄여보자면,
- Bird-eye view를 기르자
- 생각의 폭이 깊어지기보다 넓어지는 것이 더 중요할 수 있다.
더욱 노력해야겠다.
'장's 개발생각' 카테고리의 다른 글
[개발생각] 우아한테크코스 5기 4주차 다리게임 회고 (0) | 2022.11.23 |
---|---|
[개발생각] 우아한테크코스 5기 3주차 로또 후기 (0) | 2022.11.18 |
[개발생각] 우아한테크코스 5기 2주차 숫자야구 후기 (0) | 2022.11.10 |
[개발생각] 클린 코드, TDD를 위한 공부 (0) | 2022.10.20 |
[개발생각] (2022.10) 설명회를 다녀와서 (0) | 2022.10.13 |