728x90
반응형

필자 베이스

- 서울소재 4년제 대학 졸업

- 토목기사, 토익, 한국사 자격증 이미 있었음

 

수험기간 약6개월

- 3월 퇴직준비하면서 주말만 책 조금씩 보다가 3월중순 퇴사, 4월부터 전업시작

 

0. PSAT

- 고등학교 때부터 국어 거의 안 하다시피 해서 언어논리가 가장 힘들었지만 메가피샛 무료강의를 챙겨듣는 것 정도로도 충분히 따라갈 수 있었다고 생각한다. 출제의 결을 좀 빠르게 파악하는 것이 중요할 것 같다. 사실 피셋은 베이스가 있고 없고보다도 진짜로 어느 정도 타고나야하는 부분이 있는 시험이기 때문에 일단 한 번 쳐보고 뭐가 부족한지, 부족한 부분 메우려면 어떻게 공부해야하는지를 찾는 게 더 효과적일 것 같다. 돌이켜보면 국어를 잘한다고 언어논리를 잘 하는 것도 아니고, 수학을 잘한다고 자료해석을 잘하는 것도 아닌 것 같다. 민경채 기출 4개년도 정도 풀어보다가 인사혁신처에서 공식 출제한 7급 모의문제 한 번 풀어본 다음부터는 2014년도 5급 PSAT기출부터 20문제를 한세트로 잘라서 풀었다. 5급 기출로 아예 어렵게 공부한 게 도움이 됐던 것 같다. 덕분에 피셋은 시험장에서도 패닉에 안 빠질 수 있었고 점수도 합격선보다 20점이상 높게 나왔다.

 

< 전공과목공통 >

2008년~2019년 기출문제 5회독 이상.

2020년 기출문제 3회독.

인강은 응용역학만 듣고 나머지 과목은 책으로 독학.

 

1. 응용역학

- 이학민 응용역학 수강, 관련 교재 문제풀이만 죽어라 반복.

- 사실 토목직 준비하는 사람은 이학민 응용역학으로 수렴할 것 같긴 하다. 근데 또 그럴만하다. 9급 수강생이 압도적으로 많아서 그런지 9급 맞춤으로 다소 지나치게 쉽게 설명하는 경향이 조금 있지만, 그것만 잘 알아서 필터링하면 공무원시험용 응용역학에 필요한 부분을 잘 짚어주고 책에 공식도 잘 정리되어 있다. 인강 도중 '안 해도 됩니다' 하는 것들도 7급은 다 해야 한다. '와 이걸 다 외워?' 하는 것도 외워야 한다. 그리고 시험장에서 그게 다 빛을 본다.

태블릿으로 공부했기 때문에 단원별로 기출문제를 다 찍어두고 4번 이상은 계속 지워가면서 다시 풀었다. 답을 외운 것 같아도 계속 다시 풀었다.

 

2. 물리학개론

- 본 책 : 스마트물리학개론(신용찬), 할리데이 일반물리학 I,II, 7차교육과정 하이탑 물리II

- 물리는 고등학교때부터 빡세게 해놔서 베이스가 좋았던 편이라고 생각한다. 대학교에서 들은 일반물리학 성적도 좋았고.. 다만 이걸 공무원시험용 물리머리로 바꾸는 데에 시간이 좀 걸렸다. 물리 과목 특성상 공식이나 이론을 파서 한 번은 뜯어봐야 이해가 되는 게 많은데 그 이후에 '아 이건 외워야겠네' 하는 것들은 빠르게 암기로 돌리는 게 주요했던 것 같다. 필수로 외워야겠다 싶었던 걸 노트로 정리한 것만 글자를 빼곡히 썼는데도 A4 4장가까이 나왔으니.

어찌됐든 객관식이고 명확한 이론들을 사용해서 문제를 내는 공무원 시험이기 때문에 고등학교 과정 치고 어렵게 구성된 하이탑 물리2가 꽤 도움이 많이 됐다.

 

3. 수리수문학

- 본 책 : 수문학(이재수), 수리학(송재우), 수리수문학(김가현), 기초수문학(윤용남), 수리학(최성욱), 하천수리학(우효섭), 수리학(이재수), 유체역학(Gerhart)

- 지엽적인게 많아서 진짜 공부하면서도 재미가 안 붙었었고 짜증이 많이 났던 과목이다. 인터넷으로만 검색하다가 틀린 정보들도 많은 것 같고 이렇게 공부해서는 답이 없겠다 싶어서 대학교도서관에서 전공책을 정말 여러 권 빌려봤는데, 전공책들을 뒤져봐도 잘 설명되지 않은 것들이 많아서 애를 많이 먹었다. 대놓고 못 풀게 나오는 문제가 몇 개 섞여있으니 거기에 개의치 않고 공부하는 게 스트레스 안 받고 공부할 수 있는 팁.

 

4. 토질역학

- 본 책 : 토질역학(이인모), 탈탈토목(유튜브 채널), 한솔아카데미 토목기사

- 토질, 지반 관련 과목은 학부 때 섭렵하듯이 많이 들어서 기본지식이 많았던 게 도움이 많이 됐다. 기억이 안 나는 부분은 토목기사 책이랑 토질역학 전공책을 통해서 다시 봤고, 유튜브 탈탈토목에도 관련 내용이 잘 올라와있어서 공부하기 좋았다. 기출풀이 영상들도 꽤 도움이 많이 됨.

 ( 추가 : 탈탈토목 영상 올리시던 분께서 이제 어디학원에서 강사로 일하시는 것 같네요. 아마 유튜브 영상들 이미 내려가있거나 조만간 내려가지 않을까 싶습니다. )

 

시험 준비 본격적으로 시작하기 전에 토목직은 합격수기가 너무 없어서 궁금한 게 참 많았다. 그래서 그냥 어떻게 공부했는지 더 까먹어버리기 전에 끄적여본 합격수기인데 '얘는 무슨 인강도 하나도 안 듣고 수험기간도 짧고 공감하기도 힘들고 재미도 없냐' 할만한 합격수기인 듯하니 본인께서 써먹을 수 있는 부분만 빼내서 써먹으시고 좋은 결과 가져가시면 좋겠다.

 

 

* 2021년 서울시 토목직 7급 공무원 합격수기 : https://eastarlight.tistory.com/m/48

 

2021년 서울시 토목직 7급 공무원 6개월 합격수기 (국가직 7급, 서울시 7급 동시합격)

필자 베이스 - 서울소재 4년제 대학 졸업 - 토목기사, 토익, 한국사 자격증 이미 있었음 수험기간 약6개월 - 3월 퇴직준비하면서 주말만 책 조금씩 보다가 3월중순 퇴사, 4월부터 전업시작 0. 국어

eastarlight.tistory.com

 

728x90
반응형
728x90
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

문제 설명

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

속한 노래가 많이 재생된 장르를 먼저 수록합니다.

장르 내에서 많이 재생된 노래를 먼저 수록합니다.

장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

제한사항

genres[i]는 고유번호가 i인 노래의 장르입니다.

plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.

genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.

장르 종류는 100개 미만입니다.

장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.

모든 장르는 재생된 횟수가 다릅니다.

입출력 예

genres plays return
[classic, pop, classic, classic, pop] [500, 600, 150, 800, 2500] [4, 1, 3, 0]

입출력 예 설명

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.

고유 번호 3: 800회 재생

고유 번호 0: 500회 재생

고유 번호 2: 150회 재생

pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.

고유 번호 4: 2,500회 재생

고유 번호 1: 600회 재생

따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.

약 45분만에 풀었다.

레벨 3을 처음 풀어봤는데 확실히 레벨2보다는 테크니컬적인 부분도 많이 요구하는 것 같다.

어떻게 풀어야할지 감조차 안잡히는 문제라면 참 머리아팠을 것 같은데 실마리가 보여서 차근차근 쫓아가며 풀 수 있었기 때문에 재미도 조금 있었던 것 같다.

 

from collections import defaultdict
def solution(genres, plays):
    answer = []
    genres_rank = []
    info = defaultdict(list)
    d = defaultdict(int)
    for i, j in enumerate(genres):
        d[j] += plays[i]
        info[j] += [(i, plays[i])]
    for key, value in sorted(d.items(), reverse=True, key=lambda item:item[1]):
        genres_rank.append(key)
    for genre in genres_rank:
        info[genre].sort(reverse=True, key=lambda x: x[1])
    for genre in genres_rank:
        for i in range(min(len(info[genre]) , 2)):
            answer.append(info[genre][i][0])
        
    return answer
​

// Test Case
genres = ["classic", "pop","classic", "classic", "pop","kpop","rock","rock"]
plays = [500, 600, 150, 800, 2500,1700,500,500]

genres_rank 리스트는 인기 많은 장르 순으로 장르의 이름만 따놓는 리스트이다. ['pop', 'kpop', 'classic', 'rock']

info 는 기본적인 모든 정보를 저장하는 리스트이다. 장르별로 분류하고 재생횟수와 고유번호까지 저장해놓는다.

아래는 info의 정렬전후 출력 결과이다.

 

defaultdict(<class 'list'>, {'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)], 'kpop': [(5, 1700)], 'rock': [(6, 500), (7, 500)]})
defaultdict(<class 'list'>, {'classic': [(3, 800), (0, 500), (2, 150)], 'pop': [(4, 2500), (1, 600)], 'kpop': [(5, 1700)], 'rock': [(6, 500), (7, 500)]})

 

인기가 많은 장르더라도 장르별 TOP2까지만 보여주는 게 목적이기 때문에

2와 장르의 곡수 중 작은 값까지만 반복해서 결과 리스트에 추가해준다.

728x90
반응형
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/42885/

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.

예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.

구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.

사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항

무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.

각 사람의 몸무게는 40kg 이상 240kg 이하입니다.

구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.

구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

입출력 예

people limit return
[70, 50, 80, 50] 100 3
[70, 80, 50] 100 3

내 풀이.

태우고 나가야하니까 태우는 순간 계속 빠진다는 점에서 pop과popleft를 쓰고 싶어 우선순위 큐인 데크로 문제를 풀었다.

 

 

from collections import deque
def solution(people, limit):
    answer = 0
    people.sort(reverse=True)
    q = deque(people)
    while q:
        temp = q.popleft()
        if q and q[-1] <= limit-temp:
            q.pop()
        answer += 1
    return answer

 

런너기법처럼

리스트의 머리부터 뛰면서 체크하는a 와 꼬리부터 뛰면서 체크하는b의 합을 가지고 체크하는 방식의 풀이가 있어 가져왔다.

 

def solution(people, limit) :
    answer = 0
    people.sort()

    a = 0
    b = len(people) - 1
    while a < b :
        if people[b] + people[a] <= limit :
            a += 1
            answer += 1
        b -= 1
    return len(people) - answer
728x90
반응형
728x90
반응형

무려 두 달이 채 안되는 시간동안 일어난 일들.

 

코로나가 양국에서 굉장히 심했던 연말 시즌.

넘어가서 착실하게 일해보려고 했지만 온갖 수난을 결국 이겨내지 못했다.

평생술안주를 잔뜩 만들었고, 나는 스트레스와 홧병을 얻고 다음 주에 한국으로 돌아간다.

내가 몸 담았던 회사 조직을 욕하는 글은 아니고..(조금 욕할 수 있는 입장인 것 같긴 함)

일본이라서 겪었고, 일을 유연하게 처리해주지 못하는 사람들 속에 끼어버려서 겪었던 수많은 일들.

일본 가는 비행기 예약 : 1월 23일로 끊었는데 긴급사태선언한다고 입국길 다 막는대서 1월 7일로 변경. 아무준비없이 출국당함

일본 집 찾기 : 화상 줌 미팅으로 부동산직원이랑 집 구경까지 다 하고 계약할게요~ 했더니 집주인이 외국인 안 받는다고 캔슬됨.

또 다른 부동산은 한 번 메일보내면 기본 3일은 지나야 답장오는 곳이었는데 매물이 좋은 게 있어서 겨우겨우 화상미팅 잡아놨더니 급하게 비행기 변경된 날짜랑 겹쳐서 캔슬되고, 다른 날 언제 다시 얘기할 수 있냐고 물어보는 메일을 보냈지만 그 길로 연락 두절.

집 : 어찌저찌 쉐어하우스 구해서 들어왔더니 옆방하고 대화 가능한 방음수준, 웹사이트 하나 제대로 못 여는 와이파이 속도. 결국 따로 포켓와이파이 결제함.

입주한 당일 침대 이불 걷어보니 머리카락이나 먼지 수준이 아니라 그냥 쓰레기들이 이불위에 널브러져 있었고 싱크대에도 뭔 모래가 가득했음. 부동산회사에 전화해봤지만 아 오늘은 청소스탶이 거기까지 갈 수가 없음,,, 너가 청소하고 자야해,,,

회사 일 : 코드 쓰고 개발측에서 일하고 싶다, 나 실제로 코딩도 할 줄 안다고 20년 5월부터 얘기한 내용들과 연수기간중에 얻은 코딩테스트 고득점 결과들은 다 갖다치우고, '와 님 한국어 일본어 영어 다 하시네요! 번역을 좀 부탁드립니다^^7' 라는 흐름으로 점심시간까지 들어차있는 회의 들어가면서 한 일은 파파고와 번역하기, 엑셀/파워포인트 복붙 작업하기. 두 달 동안 점심시간을 누려본 적이 딱 하루 있었다. 일본 입국한 날부터 3일연속 밤 10~11시 퇴근하면서 뭔가 잘 못 되어가고 있는 것 같아 급하게 항공편을 바꾸고 들어왔기 때문에 집을 찾아야한다는 명목으로 야근만은 겨우 탈출.

마지막 출근 : 재택근무의 연속이었기 때문에 딱히 연차를 쓰지 않았더니 많이 쌓여있어서 마지막 출근일이 서류상 퇴직일과 열흘 정도나 차이났다. 마지막 출근은 직접 반납할 것들이 많아서 회사에 나갔어야했는데 전날밤 11시반에 라인으로 전화오더니 '아 미안한데 내일까지 일좀 해줘야겠다' 통보 받고 결국 마지막날까지 점심시간 없이 일하다가 퇴근? 퇴직했다. 회사에 나가면서 '아 그래도 코로나가 없었으면 많이 달랐을텐데.' 같은 약간 감성적인 스탠스였는데 그동안 신세졌습니다 하고 마지막 인사를 건넸지만 수고했단 한 마디 없이 얼굴도 안보고 어 가 하는 거 보고 그래 시발 내가 미친놈이었지 라고 얼마 없던 남은 정까지 싹 다 회사에 두고 나왔다.

비행기값 회사에서 내준다 해서 청구 신청 : 1월 25일 회사 신청시작. 담당해주던 인사팀직원은 응~회사가 내줄게~라고만 하고 관련해서 뭘 어떻게 처리해야하는지 아무것도 알려주지 않았고, 하다못해 경리쪽에 공유도 안 되어 있었음. 주구장창 반려당하고 1:1미팅이랑 이메일로 똑같은 내용 똑같이 반복해서 겨우 최종 단계까지 올려놓았지만 역시 최종승인자가 열흘넘게 감감무소식. 이게 총 한 달째 걸려 아직도 미해결중.

회사 주택비 보조 청구 : 매달 납부하고 해약 한 달 전에 얘기해서 계약종료기간을 정하는 방식이라 계약서에 종료기간이 공란임. 위의 내용이 다 계약서 조항들에 친절히 적혀있지만 단순히 공란이라는 이유로 반려당함. 부동산하고 합의해서 해약날짜 정해서 종료기간 적힌 거 보냈더니 부동산회사측에서 '공식'으로 '직접' 쓴 거 아니라고 반려당함. 부동산회사에 직접 전화해서 니들이 쓴 거 pdf로 나 좀 보내달라 해서 받아서 다시 보내줌. '공식'으로 '직접' 쓴 거 보냈는데도 '아 일단 모르겠고 이 전에꺼 너가 쓴거지? 님 그거 사문서위조행위니까 일단 처리못해줌 기다려' 소리 들음. 아니 오해하신 것 같은데 보내드린 pdf가 틀림없는 부동산회사에서 직접 쓴 거라구요,,, 읍소했더니 겨우 통과됨. 사실 통과될 것 같다는 생각 눈곱만큼도 없어서 반박할 메일 문구 준비해놨었는데 ㅎㅎ 이것도 최초신청으로부터 딱 30일되는 날에 해결됐고 해결됐단 연락 받자마자 거의 울기 직전이었음.

귀국 비행기 : 귀국 일주일도 안남은 시점에서 예약했던 항공편이 없어짐. PCR검사도, 집 해약도, 전출신고도 다 해버려서 같은 날 비행기를 탔어야 했기 떄문에 원래 예약했던 것보다 2.5배 비싼 뜻밖의 대한항공 타고 귀국하기.

뜬금 중복 해외결제 : 1년반전에 쓰고 한 번도 안 쓴 이온모바일에서 갑자기 결제됨. 공중전화박스에서 한시간동안 19년에 썼던 핸드폰 번호, 이름, 주소, 재류카드, 여권 줄 수 있는 정보 다 줬는데 '조회가 안되네요^^' 소리 듣고 끝남. 외장하드 다 뒤져서 쓰던 이온모바일 아이디 찾아서 이온모바일 홈페이지 들어갔더니 홈페이지 점검중임.

하나카드 회원가입하고 채팅상담해서 알게 된 내용 [19년 9월에 이용한 이온모바일 체크카드 승인이 21년 2월에 재차 중복청구, 승인 됨. 그냥 이온모바일에서 똑같은 결제내역을 카드사에 2년 지난 타이밍에 또 청구한거임.] 내 정보 그렇게 다 알려줬는데도 못 찾더니 청구는 어떻게 또 한거냐.

PCR검사 : 갑자기 법이 바뀌어서 PCR 검사 받기. 검사랑 증명서 비용까지 합 20만원.

팩스가 이렇게 고오급 기술이었던 것인가

인감과 우편으로 점철돼있는 행정처리는 처음 살아보는 게 아니어도 좀처럼 적응이 안된다.

나 잘났다고 쓰는 글도 아니고, 얼마나 많은 일들이 있었나 스스로도 궁금해질 정도였기 때문에 남겨보는 오프더레코드같은 이야기들.

대열에서 탈락한 입장에서 조금은 속 시원하게 얘기해볼 수 있는 후일담.

그 와중에 인사팀에 한국인 직원분이 한 분 계셔서 험난한 에피소드들을 해결하는 데 큰 도움을 받을 수 있었다. 진심으로 감사하다.

살면서 가장 스트레스를 많이 받은 시즌이었고, 제발 이것들이 올해의 액땜이 되기를 바랄 뿐이다.

오늘도 도수 높은 술을 샷으로 마시고 술기운에 잠들어야 한다.

728x90
반응형
728x90
반응형

synchronous 동기적

asynchronous 비동기적 (병렬적) : Nodejs는 비동기적 처리를 위한 좋은 도구들을 가지고 있음.

- 효율적이지만 복잡.

출처 : 생활코딩

fs모듈 : 파일을 핸들링하는 모듈

Sync가 없으면 비동기적임.

ex )

>> console.log('A');
>> var result = fs.readFileSync('syntax/sample.txt' , 'utf8');
>> console.log(result);
>> console.log('A');

A
sample.txt의 내용
C
>> console.log('A');
>> fs.readFile('syntax/sample.txt' , 'utf8', function(err, result){
>>   console.log(result);
>> });
>> console.log('C');

A
C
sample.txt의 내용

callback : 파일을 읽은 다음에 함수를 호출하는 것. 너 할 거 하고 나중에 날 불러(call back) 라는 느낌의 작업.

C가 sample.txt보다 먼저 console에 출력되는 이유.


이름이 없는 함수 : 익명함수

Package Manager NPM

PM2 설치

npm install pm2 -g
pm2 start syntax/main.js

상황 보기 : pm2 monit

진행중인 프로세스 목록 보기 : pm2 list

끄기 : pm2 stop main

이 때의 main은 pm2 list에서 보이는 name

변경사항 로그 보기 : pm2 log

소스 변경되면 알아서 껐다 켜주기 때문에 소스가 변경됐을 때 reload만 하면 변경사항 반영됨. 일부러 껐다 켜는 수고를 덜 수 있음.

html : placeholder="" 입력칸 가이드

post전송방식 : URL에 쿼리스트링이 남지않음.

Request : 요청할 때 웹브라우저가 보낸 정보들

Response: 응답할 때 우리가 웹브라우저에게 전송할 정보들

var qs = require('querystring');

if (request.method=='POST'){
  var body = '';
  request.on('data', function (data) {
    body += data;

    if (body.length>1e6)
      request.connection.destory();
  });
  request.on('end', function() {
    var post = qs.parse(body);
  });
}

요청된 data의 양이 너무 클 경우 커넥션을 destroy하는 일종의 안전장치

post방식으로 전송된 data를 객체화해서 사용할 수 있음.

 

Nodejs 리다이렉션 : 302번

response.writeHead(302, {Location: `/?id=${title}`});
728x90
반응형
728x90
반응형

 

포트 번호.

기본적으로 정해져있는 건 80번.

 

 

출처 : 생활코딩

쿼리스트링의 시작은 물음표(?)로 하기로 정해져있고

값과 값은 엔퍼센드&,

이름과 값은 =로 구분하기로 정해져있다.

 

 

 

쿼리스트링 분석

var queryData = url.parse(_url, true).query;

 

 

CRUD : Nodejs에서 파일을 읽는 방법

대표사진 삭제

사진 설명을 입력하세요.

CRUD(Create Read Update Delete)

 

fs모듈로 파일 읽기 : fs.readFile()

var fs = require('fs');
fs.readFile('sample.txt','utf8',function(err, data){ console.log(data); });

 

sample.txt의 상위 디렉토리에서 실행할 경우 파일을 못 찾아서 못 읽어오고 undefined를 출력할 때가 있음.

cd __폴더명__으로 디렉토리 전환해줄 것.

(cd .. 상위 디렉토리로 돌아가기,

dir/w 디렉토리 내용 보여주기 (리눅스 ls -al과 같은 역할))

 

대표사진 삭제

사진 설명을 입력하세요.

입력값으로 들어가는 것

Parameter : 입력되는 정보의 형식

Argument : 형식에 맞춘 실제 값

 

response.writeHead() : 웹에서 실제로 접속이 잘 될 때는 200, 접속 오류의 경우 404

if (정상) {
  fs.readFile(`data/${queryData.id}`,'utf8',function(err,description){
        var template = ``
        response.writeHead(200);
        response.end(template);
      })
    } else{
      response.writeHead(404);
      response.end('Not found');
    }

 

 

디렉토리 내부의 파일을 리스트(배열)로 얻어내기 : fs.readdir

var testFolder = './data';
var fs = require('fs');

fs.readdir(testFolder, function(err, filelist){
  console.log(filelist);
})

 

 

 

 

728x90
반응형
728x90
반응형

함수(function)

object type중의 하나로서 반복하여 사용되는 독립된 명령(subroutine)

반복하여 사용되는 독립된 명령이라는 점에서는 다른 언어와 유사하지만, Javascript에서 함수(function)는  독립된 정의가 아닌 객체(object)의 일종으로 여겨진다는 점에서 다르다.

즉,  함수(function)도 객체(object)로 취급된다.

 

 

프로퍼티(property)

클래스 내부에 만드는 변수를 프로퍼티 라고 부름. (멤버변수 라고도 함)

프로퍼티에는 주로 객체 내부에서 사용하는 일반적인 정보와 객체 내부 함수(메서드) 에서 처리한 결과값이 저장.

-> OOP(객체 지향 프로그래밍)에서 흔히 말하는 getter/setter 'method'의 역할을 수행하면서 마치 데이터 멤버(필드)에 접근하듯이 사용할 수 있는 class member

 

‘키(key)와 값(value)이 연관된 객체(object)의 부분’
이를 풀어보면, 객체 내에서 선언된 변수()를 의미한다고 볼 수 있다.
다른 언어와의 차이점은, 다른 언어에서는 배열 내부에 있는 값들을 요소()라고 부르지만 Javascript에서는 배열 또한 객체로 표현되기 때문에 요소와 Property는  Javascript에서 사실상 동일하다.

 

 

 

자바스크립트를 공부하다보면, 변수, 함수, 객체, 프로퍼티 와 같은 단어를 많이 사용하고 접하게 된다. 처음 접할때는 변수 == 프로퍼티 라고 이해를 하게 되지만, 시간이 지나고 조금더 고민하다보면 뭔가 미묘한 차이들이 있다. 그래서 누군가 이 함수에서 변수는 무엇이고 프로퍼티는 무엇이냐 ? 라고 물어보게 된다면 더욱 더 헷갈리게 된다. 그래서 이번기회를 통해 조금 정리해보았다. 예를들어 아래와 같은 코드가 있다고 하자.

var a = "test"; 

일반적으로 변수는 var 로 선언을 하게 된다. 여기서 a 는 해당 스코프 안의 변수 이다. 절대 해당 스코프에서 프로퍼티라고는 하지 않는다. 하지만 만약에 다음과 같이 작성한다고 하자.

this.b = "test";

 this를 통해서 b를 선언하게 되면, b 는 해당 객체의 프로퍼티가 되게 된다. 단순하게 var로 선언하면 변수, this 로 선언하면 프로퍼티 라고한다. 설명을 좀더 자세히 하기 위해 전체 코드를 작성해보겠다.

var setMyName = function( value ){
  var name = value;
  this.name = value;
};
var setName = new setMyName( "kazikai" );
console.log( setName.name ); //kazikai

위 코드에서 발생하는 name 은 var name 으로 저장된 값일까? this.name 으로 저장된 값일까? -> 정답은 this.name 으로 저장된 값이다. 이유는 setName 이란 변수는 setMyName의 인스턴스를 통해 만들어진 객체이며, 해당 객체에서 this.name 이라고 선언된 name은 인스턴스로 만들어진 객체의 프로퍼티가 된다. 조금 더 추가 설명을 하자면, JavaScript에서는 private public 의 개념이 따로 존재하지 않는다. Public이 외부에서 접근 가능하고 private이 내부에서만 접근가능한 변수라고 한다면, this 는 public 이고, var는 private 한 변수라고 할 수 있다. 아래는 더글라스 크락포트가 작성한 private 에 관한 개념. 이 개념을 이해하면, 변수와 프로퍼티의 차이점을 더욱 더 자세히 이해할 수 있다. (http://javascript.crockford.com/private.html)

 

 

메서드(method)

클래스에 만드는 함수를 메서드 라고 부르며 멤버함수 라고도 부름.

메서드는 주로 객체의 프로퍼티 값을 변경하거나 알아내는 기능과 클래스를 대표하는 기능이 담기게 됨.

 

‘property의 값인 함수(function)’
즉, 객체 내에서 정의된 함수를 의미하는 단어이다.
특히 Javascript의 method에서 this는 method가 속한 객체를 의미한다.

var person = {
		name: '홍길동',
		friend: '임꺽정',
		eat: function(food){
			alert(this.name + '이 ' + this.friend + '과 ' + food + '을 먹습니다.');
		}
};
person.eat('밥'); // 메소드 호출 : '홍길동이 임꺽정과 밥을 먹습니다.'

클래스

함수는 기능을 포장하는 기술 이라면 클래스는 그렇게 만들어진 변수와 함수 중 연관있는 변수와 함수를 선별해 포장하는 기술.

포장하는 이유는 객체 단위로 코드를 그룹화하고 재사용하기 위함.

 

 

인스턴스

클래스를 사용하려면 일반적으로 인스턴스를 생성해서 사용.

한 페이지 내에 두개 이상의 같은 동작을 하는 UI를 만들경우 두개의 클래스를 만드는 것이 아니라 하나의 클래스를 만든 후 두개의 인스턴스를 만들어 사용.

 

 

객체

객체라는 용어는 인스턴스의 다른 말 (두 용어 모두 클래스의 실체를 나타냄.)

명확히 구분해서 설명하면 인스턴스 라는 용어는 new 키워드를 이용해 클래스의 실체를 생성할 때 주로 사용하며 객체라는 용어는 인스턴스 생성 후 클래스 에서 제공하는 프로퍼티와 메서드를 사용할 때 주로 사용.

 

 

 


출처:
https://recoveryman.tistory.com/387 [회복맨 블로그]

https://github.com/kyukyukyu/oop-mentoring/issues/2

출처

maeryo88.tistory.com/244

 

728x90
반응형
728x90
반응형

SERVICE_ACCESS_DENIED_ERROR

SERVICE KEY IS NOT REGISTERED ERROR

 

방법 1. 1시간 정도 기다린다. 서버에 인증키가 등록될 때까지의 시간이 소요된다고함.

방법 2. 디코딩 및 인코딩

meyerweb.com/eric/tools/dencoder/

 

URL Decoder/Encoder

 

meyerweb.com

여기서 인증키를 디코딩해보거나 인코딩해본다. 

 

방법 3. 인증키 재발급을 받는다. 

 

방법3으로 해결돼서 가장 화난다.

728x90
반응형

'Computer > python' 카테고리의 다른 글

파이썬 python jupyter notebook에 beautifulsoap 설치하기  (0) 2020.12.04
728x90
반응형

아나콘다 프롬프트로 설치할 수 있다.

 

pip install bs4

pip install BeautifulSoap

 

으로 설치할 수 있는데

pip install BeautifulSoap 로 설치 시에

"You're trying to run a very old release of Beautiful Soup under Python 3. This will not work." 의 에러가 나는 경우가 있다.

이 경우 파이썬의 버전 문제로

pip install beautiifulsoup4 를 입력하면 정상적으로 설치할 수 있다.

728x90
반응형
728x90
반응형

python dictionary value list append

딕셔너리는 키/값 (key / value)으로 이루어져있다. 파이썬3.7+부터는 입력한 대로 순서가 유지된다.

내부적으로는 해시테이블로 구현되어있다.

key는 변화하면 안되기 때문에 가변적인 list가 key값으로는 들어갈 수 없지만 tuple은 key값으로 사용할 수 있다.

value는 tuple, list 관계없이 전부 가능하다.

딕셔너리 주요 연산 시간 복잡도

연산

시간복잡도

연산 설명

len(a)

O(1)

요소의 개수를 리턴한다.

a[key]

O(1)

키를 조회하여 값을 리턴한다.

a[key] = value

O(1)

키/값을 삽입한다.

key in a

O(1)

딕셔너리에 키가 존재하는지 확인한다.

대부분의 연산이 O(1)로 처리가 가능해 우수한 자료형으로 꼽힌다.

리스트는 내부 요소를 조회할 때 인덱스의 순서로 (list[0]과 같이) 조회하지만

딕셔너리는 key 값을 직접 입력해야 value 값을 조회할 수 있다.

딕셔너리에는 defaultdict 라는 모듈이 있는데 딕셔너리에 값을 삽입하는 데에 있어

테크니컬적인 부분에서 유연하게 딕셔너리를 다루기에 유용하다.

딕셔너리의 defaultdict 객체

리스트에서 존재하지 않는 인덱스를 조회할 경우 IndexError가 발생하듯이

딕셔너리에서 존재하지 않는 키를 조회할 경우 KeyError가 발생하는데

KeyError의 에러 메시지를 출력하는 대신 디폴트 값을 기준으로 해당 키에 대한 딕셔너리 아이템을 생성해준다.

 

>>> d = defaultdict(int)
>>> d['A'] = 0
>>> d['B'] = 1
>>> d['C'] += 1

을 실행할 경우, 기존 딕셔너리 d 는 {'A' : 0 , 'B' : 1}의 형태로 키값 'C'가 존재하지 않아 4행에서 keyerror가 나와야하지만

defaultdict 객체를 이용했기 때문에 디폴트값 0을 기준으로 하여 0 + 1의 연산이 이루어져 d는 다음과 같아진다.

{'A' : 0 , 'B' : 1, 'C' : 1}

defaultdict(int)뿐만 아니라 defaultdict(list)를 이용하면 value값에 리스트를 추가할 수도 있다.

해시테이블 구조로 정리해야하는 입력값이 이중리스트로 주어졌을 때 딕셔너리에 값을 삽입할 수 있는 방법은 다음과 같다.

예시

입력치 : 리스트 [ [ '카테고리A' , 'A1'] , ['카테고리B' , 'B1'] , ['카테고리A' , 'A2'] ]

기대하는 결과값 : 딕셔너리 { '카테고리A' : ['A1' , 'A2'] , '카테고리B' : ['B1'] }

>>> for i in range(len(리스트)):
>>>     딕셔너리[리스트[i][1]] += [리스트[i][0]]

위와 같이 카테고리별로 정리한 딕셔너리에서

각 카테고리 별 요소가 몇 개나 있는지 key별 요소 개수를 확인하고 싶을 때는 다음과 같다.

>>> lengths = [len(v) for v in dictionary.values()]
>>> lengths
[2, 1]
728x90
반응형

+ Recent posts