대학교 4학년 마지막 학기 시작 전에 국민취업지원제도를 통해 취업 지원을 열심히 넣고 있었다. 

우연한 기회로 대구에서 웹개발자를 구하는 자그마한 스타트업을 공고에서 볼 수 있었다.

얼른 취업해서 경력을 쌓고 싶다는 생각에 바로 지원서를 넣었다. 

이전에 구미 회사들은 내가 경력이 없다는 것을 알고 거들떠도 안 본 것 같지만

이 회사는 나에게 메일을 주었다. 전화 하고 싶은데 연락처 좀 주세요 마치 이성이 번호를 물어보는 것처럼 설렜다.

대표님과 통화를 한 후 느낀 점은 일단 대표님 목소리가 좋았다. 그리고 내가 약한 모습을 보여줘서 제대로 어필을 못했다.

다양하게 공부한 것을 얕게 공부했다고 약한 소리를 했다. 이를 보완할 수 있는 보완점을 찾아야만 했다. 면접을 보기로는 약속했다.

유튜버 면접왕 이형을 통해 자소서 캠프에 참여했다. 가지고 있는 경험을 통해 필살기를 만들고 3C4P에 맞춰 생각해보고 소제목을 작성하는 등 여러가지 자소서를 쓸 때 필요한 스킬에 대해 배웠다.

동시에 회사 분석에 들어갔다. 작은 회사라 그런지 회사에 대한 정보가 없어 대표님의 메일이나 회사의 주소를 검색하였다. 대표님의 메일을 검색해서 이전에 창업했었던 곳을 알 수 있었고 어떤 가치관을 가진 분인지 알 수 있게 되었다. 또한 회사 주소를 통해 대구무역회관의 대구글로벌게임센터에 입주한 회사임을 알게 되었고 대구시의 지원을 받으며 일하는 회사임을 알게 되었다. 왜 분야가 다양했는지도 알 수 있었다. 나도 스타트업 창업을 할 생각이 있기때문에 국가의 지원을 받으며 창업할 때 배울점이 많겠다는 생각이 들었다. 첫 면접이고 첫 자소서이기에 최대한 합격하고 싶다는 마음이 컸다. 현직자 분들에게 자소서를 첨삭받고 (정말 감사했다 진짜 다 기프티콘 쏠꺼다 진짜) 계속해서 회사에 대해 자료를 조사하며 자소서를 다듬었다. 면접에서는 자소서를 바탕으로 대답할 수 있도록 연습했다. 일주일 정도는 이것만 생각한 것 같다. 다른 공부를 하려해도 도저히 집중이 안된다. 첫 면접이라는 것에 너무 떨려서 더 열심히 준비하고 싶은 마음이었다. SI/SM/Solution중 어떤 회사인지 모르겠지만 게임을 만드는 회사라는 것은 알 수 있었던것이 웹개발자 말고 게임개발자를 뽑고 있었다. 

궁금한 점은 근무인원이 3명이었는데 다양한 분야를 하는 이유를 알고 싶었다. 또 프리시드 또는 시드 단계이거나 신입을 뽑아도 키울만한 여유가 있을 지 궁금했다. 무엇보다 궁금한 것은 그 게임이 무엇이며 웹개발을 하는 사수가 있는지 궁금했다. 또 신입을 뽑는 이유가 궁금했다. 

 

면접 때 다 물어볼 것이다. 

면접 복기

준비해 간 자소서를 보여드리고 맥북과 노트를 꺼냈다.

작은 기업에서는 나의 역량도 물었지만 다른 사적인 내용도 같이 물었다.

준비를 많이 했다는 것을 보여주었고

대표에 대한 검색도 많이했다는 것을 보여주었지만 그것은 크게 효과가 있지 않아보였다. 오히려 역효과....?

학교 프로젝트와 현재 진행중인 쇼핑몰 프로젝트를 보여주었다.

웹 개발 솔루션을 활용하는 것이 더 낫다는 대표님의 판단이 있었고 나는 공부 차원에서 한 것이라고 말했다.

직무 관련 질문은 모바일 쪽 수업을 들었거나 프로젝트를 해 본 적이 있었냐는 질문을 많이 물었다.

아직 해본 적은 없지만 새로운 언어에 적응하는 능력이 있다고 대답하였다.

인성 관련 질문은 내가 어떻게 살아왔는지들을 물었고

자소서에 지원동기와 역량들을 보여줘서,.. 근데 자소서를 가져가시질 않았다...

어쨌든 최선을 다한 것 같다. 결과는 기대가 되지만 일단 하던 일이나 제대로 해야겠다.

AI 헬스 케어 프로젝트와 여러 프로젝트를 진행중이며 투자를 따로 받지는 않지만 하고싶은 개발을 하며 그 속에서 치열하게 영리를 취하는 회사였다. 4월에 창업을 했기때문에 프리시드 단계로 생각이 되며 신입을 뽑는 이유는 재미였다... 지원금은 솔직히 적으며 수주를 받아서 생계를 유지하는 것이 첫번째 이익이고 그 다음은 회사 프로젝트로 이익을 얻는 것이었다. 사수가 있다고 해도 다른 분야일 확률이 높으며 혼자서 진행하는 것으로 생각이 된다. 

이렇게 적어보니 성장가능성은 그렇게 커보이지 않는다. 하지만 대표님의 인상이나 마인드는 정말 좋았다. 일 해본 것은 아니라서 어떤 성격일지 깊게는 모르지만 다정다감하신 분으로 보인다.

이 기업만 그럴 수 있지만 준비된 멘트는 하나도 써먹지 못했으므로 크게 준비를 할 필요는 없다고 생각이든다. 

'오늘의 메모' 카테고리의 다른 글

21.08.22  (0) 2021.08.22
21.02.20  (0) 2021.02.21
21.02.18  (0) 2021.02.19
21.02.17  (0) 2021.02.17
21.02.16  (0) 2021.02.16

코딩 애플님이 올리신 영상에서 한국어로 된 블로그는 주로 메모용이거나 들은 강의를 정리하는 용도로 사용되는 블로그가 많다고 한다. 

사실이 그랬다. 나도 학원에서 배운 것이나 프로젝트를 하면서 배운 점을 정리하기위한 용도로 블로그를 사용하였었다 그마저도 제대로 안하고 있었다. 부끄럽지만 지난 기간 동안 배운 것이 탄탄하지 않아 무너져 내렸다. 결국은 기초였고 결국은 검색이고 스스로 학습하는 것이 제일이었다. 정말 제대로 도움을 줄 수 있는 포스트를 올리는 것이 나에게도 다른 사람에게도 도움이 된다. 다른 사람으로부터가 아닌 나 스스로 가치를 창출해서 컨텐츠를 만들자. 나의 개발자 인생에 도움이 되고 다른 누군가에게도 기초를 잡을 수 있는 그런 잘 정리된 문서를 포스팅하는 것을 이 블로그의 목적으로 해야겠다.

'오늘의 메모' 카테고리의 다른 글

스타트업 면접 후기  (0) 2021.08.31
21.02.20  (0) 2021.02.21
21.02.18  (0) 2021.02.19
21.02.17  (0) 2021.02.17
21.02.16  (0) 2021.02.16

클린 코드 96p 중

형식 맞추기

코드의 형식은 중요하다!

오늘 구현한 기능이 있다면 다음 버전에서 바뀔 확률이 높다.

유지보수의 용이성과 확장성에 영향을 끼친다.

-적절한 행 길이를 유지하라

코드 줄의 개수는 클래스의 크기에 비례한다.

평균적으로 500줄을 넘지 않고 200줄로도 커다란 시스템을 구축할 수 있다.

-신문 기사처럼 작성하라

표제와 부제가 있는 신문과 소스코드의 파일은 같다.

이름만 보고도 올바른 모듈을 살펴보고 있는지 판단할 수 있게 한다.

위에서 밑으로 갈수록 세부적으로 묘사한다.

신문은 많은 짧은 기사를 여러 개 모아 놓았다.

코드도 마찬가지로 짧은 파일을 여러 개 모아야 한다.

-개념 사이는 빈 행으로 분리하라

Ex) import ~~~~;

    빈 행

    public class ~~~~{

 

    }

-세로 밀집도 

두 개념이 연관성이 높다면 두 코드의 거리는 가까워야 한다.

의미 없는 주석으로 둘을 떨어뜨린다면 가독성이 낮다.

 

오늘의 메모

올바른 운동을 할 때 건강해진다.

나에게 맞는 운동은 코어 운동이다. 

 

async await는 async로 설정된 함수를 끝내기 전에

await가 설정된 코드를 다 마치도록 기다리는 것이다.

'오늘의 메모' 카테고리의 다른 글

스타트업 면접 후기  (0) 2021.08.31
21.08.22  (0) 2021.08.22
21.02.18  (0) 2021.02.19
21.02.17  (0) 2021.02.17
21.02.16  (0) 2021.02.16

클린 코드 중

나쁜 주석

-공로를 돌리거나 저자를 표시하는 주석 -> github 쓰기

-주석으로 처리한 코드 -> 주석으로 처리한 코드는 작성하지 않고 github commit으로 기록을 남기기

//print("Hi")

-전역 정보(전반적인 정보) 주석

-> 주석 바로 아래 함수가 통제하지 못하는 기본 값을 주석으로 넣은 경우

=> 만일 기본 값이 바뀌어도 이 주석은 바뀌지 않을 가능성이 높다.

 

좋은 코드에서 주석으로 하는 일 94p 예시

헤더에는 클래스에 대한 짧은 설명을 붙여준다. 클래스가 하는 일, 알고리즘, 알고리즘 설명

그 외에는 클래스나 함수 명을 잘 짜준다. 클래스는 명사형으로 동작을 하는 클래스라면 사람처럼 or이나 er을 붙여준다.

함수는 동사형으로 무슨 기능을 하는 지를 써준다.

오늘의 코드

#10809번
inputString = input()
alphabetTotalCount = 26
def isAlphabetInInputString(alphabet):
  if alphabet in inputString:
    return True
  return False

def findAlphabetIndex(alphabet):
  if(isAlphabetInInputString(alphabet)):
    return print(inputString.find(alphabet))
  return print(-1);

for i in range(alphabetTotalCount):
  alphabet = chr(ord('a')+i)
  findAlphabetIndex(alphabet)

#최대한 함수명을 잘 쓰려고 노력했다.

오늘의 메모

호감을 사려고 말을 많이 할수록 허름해지는 기분이지

말을 많이 들어주면 역으로 호감을 얻는 기분이다.

 

좋은 개발자가 되기 위해선

-클론 코딩이든 뭐든 많이 써보는 것

-공식 문서를 정확히 확인하는 것

-겁먹지 말고 "나도 할 수 있어, 내가 최고야"라고 생각하기

 

카카오 글로벌 시장을 장악할 수 있을까?

대표의 기부, 직원들에게 복지, 카카오톡을 기반으로 한 광고(톡 비즈)

그 광고와 연계한 카카오 내 상품 판매, 14년 다음과 공동 대표에서

15년 카카오로 이름을 바꾸고 다음 흔적을 지우는 중, 일본의 웹툰 앱 중 1위

여러 계열사로 신사업을 시작했었고 그게 지금 다 잘됐다.

 

향후 20년 즈음..

현재 인구수가 역항아리로 미래에는 젊은 층의 수요가 없다.

지금 청장년층이 제일 많이 돈을 쓰는데 나중에 청년층이 돈을

안 쓰면 진짜 나라가 휘청할 것이다. 물건 값 집 값 다 폭락할 가능성 높다.

타깃을 나의 20년 뒤인 4,50대로 할 것인지 아니면 외국으로 눈을 돌려야 한다.

개발자로 향후 20년은 외국이 답인 것 같다. 영어를 잘해야 한다. 

서울 집 값이 현재는 너무 비싸고 나중에 폭락할 걸 생각하면 외국에 산다던가

농대형처럼 시골 빈집을 싸게 구해서 재택근무를 하는 게 오히려 좋을 것 같다.

 

 

SSH

-Secure SHell로 네트워크 상의 다른 컴퓨터에 로그인하거나

 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 

 복사할 수 있도록 해 주는 응용프로그램 또는 그 프로토콜을

 가리킨다.

 ftp 서비스를 좀 더 보안이 강화된 명령으로 대체하기 위해 만들었다.

 깃 헙에 푸시할 때 SSH를 활용해 파일을 전송하게 된다.

 AWS의 인스턴스 서버에 접속해서 원격으로 명령을 할 때도 SSH를 통해 접속해야 한다.

 

프로토콜

통신 프로토콜 또는 통신 규약으로 불리며 원거리 통신 장비 사이에

메시지를 주고받는 양식과 규칙의 체계이다. 

사람과 사람이 대화를 할 때 둘 다 같은 언어를 알고 이해할 수 있어야 하듯

컴퓨터 간에도 이해할 수 있도록 하는 규칙을 프로토콜이라고 한다.

TCP/IP에 사용되는 P가 Protocol의 약자이며

TCP/IP는 Transmission Control Protocol / Internet Protocol의 약자이다.

그 외에도 프로토콜의 종류로는 HTTP, FTP, DHCP 등이 있다.

 

프록시 서버

클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게

해 주는 컴퓨터 시스템이나 응용프로그램을 가리킨다. 서버와 클라이언트 사이에 

중계기로써 대신 통신을 수행하는 것을 '프록시' (Proxy가 대신이라는 뜻을 가지고 있다.) 

그 중계 기능을 하는 것을 프록시 서버라고 한다.

내가 네이버에 들어가려면 www.naver.com 이 아니라 11.2.45.1.5 같은 숫자로 이루어진

주소를 통해 들어가야 했었다. 근데 프록시 서버가 www.naver.com이라는 주소로 요청을 

받도록 한다. 그럼 네이버도 자기 IP를 지키기 때문에 이득 우리도 주소를 한눈에 볼 수 있어

이득이 된다. 캐시 데이터를 사용한다거나 보안 기능도 있다.

 

클라이언트는 서버에 요청(request)을 하고 서버는 클라이언트에 반응(response)을 한다.

중간에서 프록시 서버가 요청을 받고 반응을 한다. 

'오늘의 메모' 카테고리의 다른 글

21.08.22  (0) 2021.08.22
21.02.20  (0) 2021.02.21
21.02.17  (0) 2021.02.17
21.02.16  (0) 2021.02.16
21.02.15  (0) 2021.02.15

오늘의 메모

내장 지방이 문제였다. 한 번에 많이 먹으면 생기는 내장지방은 호흡곤란, 코골이를 야기한다.

최근 술을 한 번에 많이 먹고 밥도 한 번에 많이 먹었었다. 살도 쪘다. 조금 덜 먹고 살을 빼자.

내가 선택한 운동은 슬로우 버피 챌린지이다. 오늘 10분동안 해 봤는데 금세 땀이 나고 개운했다.

걷는 것과 별개로 10분만에 땀을 내고 싶어졌다.

슬로우 버피를 습관을 들이려면 B=MAP

Motivation(동기) 숨쉬기가 곤란해서 살을 빼고 싶다. 충분한 동기부여이다.

Ability(능력) 일단 매트 위에 올라가보자 -> 팔굽을 조금 할 줄 아니까 50개만 해보자

Prompt(자극) 숨쉬기 힘들다고 느껴서 화가날 때마다 하도록하자

 

클린 코드 76p 중

어제는 좋은 주석을 알아봤다면 오늘은 나쁜 주석이다.

나쁜 주석의 예

-주절거리는 주석: 마지못해 남기는 주석, 답을 알아내야하는 주석

=> 의미가 다른 사람들에게 제대로 전해지지 않으므로 다른 코드를 뒤져야 한다.

     독자와 제대로 소통하지 못하는 주석

-같은 이야기를 중복하는 주석: 주석이 코드보다 더 많은 정보를 제공하지 못하는 경우

=> 코드보다 부정확 해 독자가 함수를 대충 이해하고 넘어가게 만든다.

-오해할 여지가 있는 주석

=> 살짝 잘못된 정보도 오해의 여지가 될 수 있으므로 왠만하면 주석을 안쓰도록 하는 것이 좋다.

-이력을 기록하는 주석: 옛날에 자주 썼었다.

=> github와 같이 소스코드 관리 프로그램이 많이 생겼으므로 그것을 활용

-너무도 당연한 사실을 언급하며 새로운 정보를 제공하지 못하는 주석

=> 오히려 독자가 중요한 주석을 무시할 수 있다.

-함수나 변수로 충분히 표현할 수 있는지 생각해봐야한다.

 

오늘의 프로젝트 중 (Mongoose)

mongoDB의 값들을 react로 추출하려면 정말 많은 과정을 거치게 된다.

 

mongoose를 통해 mongoDB의 BSON을 정립하고 Express나 Koa를 통해 API를 만들어야 한다.

 

mongoDB의 ODM중 하나이다.

(ODM: Object Document Mapping으로 자바스크립트의 객체와 몽고디비의 문서를 1대1로 매칭하는 역할을 한다.)

 

mongoose의 장점

schema와 populate, 프로미스와 콜백, 편한 쿼리빌더가 있다.

원래 nosql에는 schema와 join의 개념이 없다. 하지만 Mongoose에서 부활 했다.

 

오늘은 DB를 구성하는 일을 했다. schema와 populate를 실습해 보았다.

먼저 상품과 그것의 이미지 Collection에 해당하는 Schema를 만들었다.

그 때 서로 참조할 수 있도록 각 field에 서로의 objectid와 ref(참조값)을 값으로 두었다.

실제로 서로의 objectid를 참조하려면 find시리즈 함수를 사용해야한다.(promise도 find로 된다고 하니 알아봐야한다.)

이번에는 objectid를 참조 값으로 설정 했으므로 findById함수를 사용하고 join을 하기위해 populate함수를 사용했다.

 

ref와 find시리즈 함수 join과 populate를 간단하게 알고 공개를 하자.

'오늘의 메모' 카테고리의 다른 글

21.02.20  (0) 2021.02.21
21.02.18  (0) 2021.02.19
21.02.16  (0) 2021.02.16
21.02.15  (0) 2021.02.15
21.02.12  (0) 2021.02.12

오늘의 메모

배가 꽉 당겨와서 접힌 느낌이 싫을 때가 있다.

살이 쪘다는 증거이다. 숨이 잘 안 쉬어진다. 

그럴 때는 폼롤러로 눌러주면 숨통이 트인다.

엄마한테 배운 방법도 있다.

고릴라처럼 명치의 위쪽 갈비뼈 부분을 팡팡 두들겨 주는 것이다.

 

꿈은 사실 별거 없다. 너무 큰 꿈을 향해 달려가면 또 그것에 매달리게 되면

꿈을 이뤘을 때 잠깐의 기쁨과 허무함만 남을지도 모른다.

"사실 꿈은 당신의 목적이 아닙니다. 이 마지막 상자인 Spark(꿈)은 당신이 삶을 살 준비가 되면

채워집니다. 그리고 당신은 그냥 재즈를 정말 잘해요. (그뿐이에요)"-소울 중-

 

react웹  npm start를 하기 전 모든 chrome창을 닫고 명령어를 넣어본다. 

(가끔 안될 때가 있었기 때문에 시도해본 방법)

 

 

클린코드 68p 중

나쁜 코드에 주석을 달지 마라. 새로짜라

프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면 주석은 필요 없다.

주석은 실패를 만회하기 위해 사용되는 것으로 거짓된 정보를 줄 수 있다.

주석은 오래될수록 코드에서 멀어진다. 주석만 유지 보수하는 개발자는 없기 때문이다.

코드는 나뉘었다가 붙고를 반복하면서 변해가지만 주석은 그것을 따라가기 힘들다.

부정확한 주석을 사용했다면 개발자에게 다른 길로의 이정표를 제시한 것과 같다.

주석은 나쁜 코드를 보완하지 못하므로 나쁘다고 생각되는 코드를 고치는 것이 더 현명한 방법이다.

 

그렇다면 좋은 주석은 없냐?

안 쓰는 것이 가장 좋지만 좋은 주석은 있다.

좋은 주석

법적인 주석: 표준 주석 헤더(저작권, 소유권 등)

정보 제공 주석: 함수의 반환 값을 알려주는 주석(but 함수 이름에 반환 값을 포함시켜 이름을 더 잘 지어보자)

                     정규 표현식의 설명(but 정규표현식으로 변환하는 클래스로 주석을 쓰지 말자)

의도를 설명하는 주석: 구현의 의도를 설명한다.

                             ex) 두 객체를 비교하는 함수에 자기 객체에 높은 순위를 부여한다고 밝히는 경우

의미를 명료하게 밝히는 주석: 인수나 반환 값의 의미를 읽기 좋게 표현하면 쉽다.(단 그 자체를 이름으로 분명히 밝힐 수 없는 상태에서)          ex) 표준 라이브러리나 변경하지 못하는 코드에 속할 때 의미를 명확히 하도록 주석 사용

결과를 경고하는 주석: 다른 프로그래머에게 결과를 경고함("오래 걸리니 주의"와 같은)

중요성을 강조한 주석: 그냥 넘어갈 만한 코드에 중요한 부분이 있다면 주석으로 그것을 강조한다.

TODO주석: 앞으로 할 일을 //TODO 주석으로 남기면 편하다.(단 얼른얼른 지워줘야 깔끔하다.)

 

오늘의 코드

#11720번
nlength = int(input())
n = input()
#list Comprehension
nlist = [int(n[i]) for i in range(nlength)]
result = 0
for i in range(nlength):
  result += nlist[i]

print(result)

 

프로젝트 중

mongoDB를 사용해 프로젝트를 하기로 했다.

농대형과 같이 진행했다. 자습서를 보고 기본적인 소개를 보고 공부했다.

BSON: binary representation of JSON

document: {field: value}

Embedded doc:  join 된 entity

Collection: table (doc을 저장할 수 있다.)

소개 부분을 읽고 난 후에는 quick start로 간단한 CRUD예제를 살펴보았다.

 

node에서 mongoDB를 편하게 쓰려고 만든 mongoose라는 라이브러리를 사용했다.

DB랑 JS랑 연결하고 CRUD 중 CUD만 실행해 보았다. 스키마와 콜백 함수가 꼭 있어야 CRUD를 실행할 수 있었다.

직접 써보니 Collection = table = 클래스 느낌이 강했다. model = record = 객체 느낌이 강했다.

 

www.youtube.com/watch?v=xklxRkAu21Y

유튜브 보고 따라 그린 그림(feat 완두)

'오늘의 메모' 카테고리의 다른 글

21.02.18  (0) 2021.02.19
21.02.17  (0) 2021.02.17
21.02.15  (0) 2021.02.15
21.02.12  (0) 2021.02.12
21.02.11  (0) 2021.02.11

오늘의 메모

 

주말 동안 알바가 종일 있었다. 다행이 운동은 열심히 했다.

 

구글 홈 미니를 샀다. 중고로 18000원에 엄마 아빠가 활짝 웃었다.

 

프로그래머스 프론트앤드 챌린지 접수가 시작되었다. 

programmers.co.kr/competitions/812/2021-web-fe-first

 

2021 Dev-Matching: 웹 프론트엔드 개발자(상반기)

접수   21년 02월 15일 11:00 ~ 03월 05일 17:00 테스트   21년 03월 06일 13:00 ~ 03월 06일 16:00

programmers.co.kr

조금씩이라도 하면서 성장해가는 내 모습이 보기 좋다.

 

꿀Tip 

골반이 뒤틀린 느낌일 때 뻐근한 다리의 반대 다리에 신경을 쓰면 그런 느낌이 덜 하다.

숨이 잘 안쉬어질 때 숨을 30초 간 멈췄다가 크게 쉬어본다. (죽을꺼 같으면 당연히 숨을 쉬어야 한다.)

그러면 뻥 뚫린 느낌을 받는다.

'오늘의 메모' 카테고리의 다른 글

21.02.17  (0) 2021.02.17
21.02.16  (0) 2021.02.16
21.02.12  (0) 2021.02.12
21.02.11  (0) 2021.02.11
21.02.10  (0) 2021.02.10

클린코드 60p 중

의존성자석??(의존적인 형태를 말하는 듯)으로 하면 클래스 변경시 클래스로 만들어진 객체의 모든 것을 바꿔야한다.

=>오류코드 대신 예외를 사용하면 문제가 해결된다.

새 예외를 설정하면 Exception클래스에서 파생되므로 재배치나 재컴파일없이도

새 예외 클래스를 추가할 수 있다.

반복하지 마라

하나의 알고리즘을 네번 반복하면 네번이나 수정해야한다.(1억번이라 생각하면 어마어마한 듯)

*지금 프로젝트에서 html태그로 반복되는 부분 또는 리스트 형식을 component로 만들어 독립적으로 사용한다.

소프트웨어 짜는 행위는 글짓기와 비슷하다.

생각을 기록하고 읽기 좋게 다듬는다.

함수도 마찬가지로 처음에는 길고 복잡하고 중복도 많다. (단 테스트 케이스는 맞게끔 짠다.)

코드를 다듬고 함수를 만들고 이름을 바꾸고 중복을 제거한다.(이와중에도 테스트는 통과하게끔)

 

결론

함수는 동사 클래스는 명사

 

프로그래머는 시스템에서 발생하는 모든 동작을 함수로 설명할 수 있어야한다.

함수는 짧고 이름이 좋고 체계가 잡혀야 한다.

 

목록 3-7 = 3-1을 다듬은 것

이야기로 풀어서 적어봤지만 아직까지는 잘 모르겠다.

하지만 함수 안에 꼬리에 꼬리를 물고 이야기를 형성한다는 것은 알겠다.

특히 인자는 다르지만 동일한 기능을 하는 함수(include)를 사용한 것이 인상깊었다.

 

오늘의 코드

# 4673번
# 셀프넘버 함수 생성
# 기능 1 반환
# 기능 2 체크
# n은 자연수이며 10000보다 작거나 같다.
# n이 10000을 넘게 된다면 종료한다.
# 남은 리스트를 차례로 출력한다.

# 먼저 1-10000의 수를 가진 리스트를 생성한다.
tenThousondNumbersInList = list(range(1, 10001))

# 다음은 1부터 함수 연산


def plusEachDigitNumber(number):
    # 각 자리수를 더하는 방법 더하는 함수 sum(활용)
    # list()뿐 아니라 []로도 리스트를 만들 수 있다.
    # list Comprehension 리스트나 iterable한 객체(문자열 등)를 쉽게 만드는 방법
    # [리스트의 한 원소가 될 수 for i in range(111)]
    # 밑의 단계에서는 문자열의 한 원소 즉 한 글자를 정수형으로 바꾼 것을 list의 원소로 만들었다.
    sumDigit = sum([int(i) for i in str(number)])
    totalResult = number + sumDigit
    return totalResult


newList = []
selfNumbers = []
for i in range(len(tenThousondNumbersInList)):
    # 함수연산을 하며 나온 결과값을 리스트로부터 remove한다
    newList.append(plusEachDigitNumber(tenThousondNumbersInList[i]))
# 중복 제거를 위해 set으로 변환
# 원래 본 집합과 결과가 된 집합의 차집합을 최종결과로 리스트에 넣음
selfNumbers = list(set(tenThousondNumbersInList)-set(newList))
# 차례로 나오기떄문에 정렬
selfNumbers.sort()
for i in range(len(selfNumbers)):
    print(b[i])


# 1065번

n = int(input())
count = 0
if(n <= 99):
    count = n
else:
    count = 99
    for i in range(100, n+1):
        eachDigitNumberList = [int(candidateNumber)
                               for candidateNumber in str(i)]
        if(eachDigitNumberList[1]-eachDigitNumberList[0] == eachDigitNumberList[2]-eachDigitNumberList[1]):
            count += 1
# 함수없이 기본형으로 푼 문제
# 함수는 좋은 이름과 짧고 인수가 없고 이야기로 풀어나가져야한다.
# 이야기를 먼저 생각해보자
# 한수의 개수를 출력하려면
# 한수가 몇개인지 알려면 반복을 해서
# 각 자리 수의 차이가 같아야한다.
# 각자리 수 의 차이를 알려면
# 각자리 수를 알려면
# 문자열을 리스트로 나타내야한다.
# 함수에 인수를 안 넣고 정의하는 방법


n = int(input())
count = 0


def digit(n):
    if(n <= 99):
        count = n
    else:
        count = 99
        for i in range(100, n+1):
            count = hansu(i, count)
    return count


def hansu(candidateNumber, count):
    eachDigitNumberList = [int(eachDigitNumber)
                           for eachDigitNumber in str(candidateNumber)]
    if(ishansu(eachDigitNumberList)):
        count += 1
    return count


def ishansu(eachDigitNumberList):
    if(eachDigitNumberList[1]-eachDigitNumberList[0] == eachDigitNumberList[2]-eachDigitNumberList[1]):
        return True
    else:
        return False


count = digit(n)
print(count)

함수형으로 다시 만들어 봤는데 count인수를 계속해서 인수로 넣어줘야하는 점이 클린하지 않았다.

'오늘의 메모' 카테고리의 다른 글

21.02.16  (0) 2021.02.16
21.02.15  (0) 2021.02.15
21.02.11  (0) 2021.02.11
21.02.10  (0) 2021.02.10
21.02.09  (0) 2021.02.09

+ Recent posts