[dailycoding] 위장

이미지
[dailycoding] 위장 문제 clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. 같은 이름을 가진 의상은 존재하지 않습니다. clothes의 모든 원소는 문자열로 이루어져 있습니다. 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ‘_’ 로만 이루어져 있습니다. 스파이는 하루에 최소 한 개의 의상은 입습니다. 입출력 예 clothes return [[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5 [[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3 해결의 과정 문제는 단순히 수학문제에서 마주할 수 있는 조합의 문제이다. 옷의 종류가 a,b,c가 있다면 a b c가지가 있다. 하지만 옷을 입지 않은 가짓수도 있기 때문에 (a+1)(b+1)(c+1) 가지의 조합이 나온다. 마지막으로 하나도 입지 않은 가짓수는 제외해야하기 때문에 (a+1)(b+1)(c+1) - 1 을 계산한다. 입력 받은 옷 중에 같은 이름은 없기 때문에 결국 옷 종류별로 몇개씩 있는지만 고려하면된다. 옷 종류별로 몇벌씩 가지고있는지 계산한다. 종류별 옷을 전부 +1 한뒤 곱한다. 마지막에 -1을 해준다. import Foundation func solution(_ clothes:[[String]]) -> Int { var clothType : [String : Int] = [:] var answer = 1 clothes.forEach {item in // 옷 종류별 갯수를 계산한다. if clothType.keys.contains(item[1]){

[dev] Opensource에 처음 기여해보고 싶어서 찾은 내용

이미지
Opensource에 기여하기 오픈소스에 기여해보는 첫 발을 내디딘기념 오픈소스를 시작하게 된 동기 개발자로 성장하면서 계속 가지고있던 갈증 중 하나는 협업 이라는 키워드였다. 결국 좋은 개발자란, 다양한 사람들과 다양한 일을 할 수 있는 개발자 일테니 말이다. 회사에서 하는 일도 성장에 도움이 되지만 자신이 생긱하기에 재미있어 보이는 프로젝트에 좋아하는 만큼 기여해보고 싶다라는 막연함으로 오픈소스를 찾게되었다. 하지만 이번이 첫 도전은 아니다. Github을 처음 알았을 때도, 오픈소스에 관련된 세미나를 들었을 때도 항상 꼭 컨트리뷰터가 되어야지 마음만 먹고 프로젝트만 뒤적뒤적거리다가 접은적이 한 두번이 아니었다. 그래서 이번에는 어떤 프로젝트에 기여하면 좋을지에 대한 검색 방법에 대해 찾아보았다. 이전에 받았던 조언들은, 너가 평소에 쓰는 서비스에서 불편한 점을 개선해 보아라, 오탈자 수정, 문서화작업을 해 보아라 라고 받았지만 와 닿지가 않았다. 그래서 이번에 선택한 방법이 내가 사용하고 있는 언어로 기여할 수 있는 프로젝트 찾기 와 Open source alternative 라는 키워드였다. 결국 처음에 받은 조언과 같은 맥락이다. 하지만 느끼는 시각을 다르게 해 주었다. 내가 돈내고 쓰고있는 어플리케이션에 대해 알아보는 시간과 어떻게 구현되었을까에 대한 호기심이 소스코드를 들여다보게 만드는 원동력이 되어주었다. 검색경로 hacktoberfest 오픈소스를 프로젝트 찾기를 검색하다보면 가장 먼제 눈에 띄는 페이지 중 하나가 핵토버페스트 이다. Details 페이지에 접속해보면, 친절하게 PR을 날리는 방법 어디서 어떻게 날리면 좋은지도 알려준다. ● Up For Grabs ● Issuehub.io ● First Timers Only ● Your First PR ● Awesome for Beginners ● This is another great guide Github Issue

[swift] table view를 처음 써보고 남기는 글

이미지
[swift] table view basic TableView Main.storyboard에서 Library(⌘ + ⇧ + L)를 열어서 Table view controller를 추가한다. 처음에 만들면, 진입 포인트가 없기 때문에 Attribute inspector에서 is initial view controller 를 체크해 최초 진입 포인트로 지정해준다. table view cell은 만들어 놓고 재 사용할 수 있다. cell은 identifier를 이용해 식별 할 수 있다. identifier에 이름을 줘보자. 이제 테이블을 구현해보자. 먼저 테이블의 줄 수를 정한다. // 1000 줄짜리 테이블을 그려준다. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1000 } 빈칸이 무수한 테이블이 생겼다. 이제 내용을 채워주자 // 테이블의 셀에 내용을 채워주지 않아 아무것도 그려지지 않는다. // Attribute inspector의 Accessory에서 checkmark를 선택해준다. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistItem", for: indexPath) return cell } indexPath는 행을 식별하기 위한 식별자이다. [section,row]의 형태로 이루어져있다. section은 table을 나누는 기준 중 하나이다. row는 의미 그대로 테이블의 행이다. // 특정 조건을 줘서 출력해보자. override fun

[git] git을 사용하는데 필요한 기본 개념과 기본 용어 정리

이미지
[dev] git 다루기 깃 개념 정리 깃을 알고 있다고 생각하고 쓰면서, 평소와 다른 문제가 일어나면서 깃에 대한 개념이 부족하다고 생각되어 찾아 본 내용들을 정리했다. 자세한 내용은 블로그 보다는 Git book 정독하는 것을 추천한다. 기본 사용 플로우 리모트에 있는 소스코드를 받거나(clone), 새로운 프로젝트를 시작한다. 변경사항을 저장(commit)하고, 리모트에 반영(push)한다. 이미 존재하는 소스코에서 독립적으로 작업을 진행해야 하는 경우에는 새로운 브랜치(branch)를 생성해 작업을 한다. 작업이 완료 된 후에, 갈라져 나온 origin branch에 merge되거나 rebase를 한다. Merge and Rebase mrege는 기존 존재하던 브랜치에 병합(merge)하는 기능이다. 기존 브랜치에 작업 내용이 없다면, fast-forward merge를 이용해 병합을 하거나 기존의 브랜치에도 작업 내용이 있다면, 3-way-merge 방식으로 각각의 브랜치의 작업 내용을 남겨놓고 하나의 브랜치로 병합한다. master 에서 slave를 merge해주면, master브랜치로 slave가 병합된다. rebase는 커밋 내역을 재정렬 해서 하나의 브랜치로 합쳐준다. 결과적으로는 한 갈래의 브랜치를 만들어준다. rebase해준 최신의 커밋으로 정렬되고 checkout 되어있던 브런치의 커밋이 먼저 정렬된다. slave 에서 master를 rebase해주면, master브랜치로 slave가 병합된다. Stash 아직 마무리 하지 않은 작업이 있지만, 다른 작업을 해야해서 변경사항을 저장해야 할 때는 어떻게 해야할까? 커밋해서 저장하기에는 내키지 않는다. 이럴 때 쓰는 명령어가 Stash 이다. 아직 마무리하지 않은 작업을 스택에 잠시 저장할 수 있도록 하는 명령어이다. 다음과 같은 파일을 Stash할 수 있다. Modified이면서 Tracked 상태인 파일 Stagi

[IOS] Image Notification Push 구현하기

이미지
[IOS] Image Notification Push 구현하기 APNs를 이용해서 푸쉬 를 보낼 수 있다는 가정하게 작성된 글 입니다. Image Push Notification 만들기 (Using Notification Service Extension and Notification Content Extension). 기본적인 알림 기능 이 동작하고 있다고 가정하고 설명합니다. service extension과 content extension을 추가해줍니다. Service extension은 Service라는 이름으로, Content extension은 Content라는 이름으로 추가 해 줍니다. xcode > Editor > Add Target > Notification Service Extension > productname : "Service" > Next > Finish xcode > Editor > Add Target > Notification Content Extension > productname : "Content" > Next > Finish 추가 후 결과 화면은 다음과 같습니다. Service > NotificationService.swift는 다음과 같습니다. import UserNotifications class NotificationService: UNNotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? override func didReceive(_ request: UNNotificationRequest, withContentHandler conten

[dev] 이펙티브 엔지니어

이미지
[dev] 이펙티브 엔지니어 원문 : https://gist.github.com/rondy/af1dee1d28c02e9a225ae55da2674a6f 읽기전에 : 저는 여기에 제시된 내용(에드몬드 라우의 책의 개요)을 제작하지 않았습니다. 인터넷 어딘가에서 복사하여 붙여 넣었지만 원본 소스가 정확히 무엇인지 기억나지 않습니다. 또한 저자의 이름을 찾을 수 없었기 때문에 적절한 크레딧을 줄 수 없습니다. 이펙티브 엔지니어 에드먼드 라우 매우 추천 👍 http://www.theeffectiveengineer.com/ 이펙티브 엔지니어란? 이펙티브 엔지니어란 일을 제대로 끝내는 사람들입니다. 그들은 결과를 산출합니다. 올바른 사고 방식 채택 큰 영향을 미치는 일에 집중하라 레버리지 = 생성된 임팩트 / 투자한 시간 레버리지을 효율성의 척도로 사용하세요. 임팩트의 80%는 작업의 20%에서 발생합니다. 쉬운 승리 만이 아니라 높은 레버리지에 집중하십시오. 학습을위한 최적화 필요한 경우 작업을 변경하십시오. 학습 최적화는 높은 레버리지를 가져옵니다. 성장을 위한 사고 방식을 채택하십시오. 사람들과 대화하세요. 스토리 텔링에 능숙해지세요. 시간을 들일수록 나아집니다. 성장을 위한 사고 방식을 가진 사람들은 노력을 통해 지식과 기술을 습득하고 발전시킬 수 있다고 생각합니다. 당신의 이야기를 만드세요. 학습 속도에 투자 다양한 분야를 학습하세요. 다양한 분야에 대한 학습은 기하 급수적인 성장으로 이어집니다. 학습은 빨리 시작 될수록 좋습니다. 쉬운 작업을 수행하는 것은 엄청난 기회 비용입니다. 복합 학습의 기회를 놓칠 수 있습니다. 수익성보다는 학습을 우선시하십시오. 학습속도가 가장 높은 활동에 시간을 투자하십시오. 학습에 도움이되는 작업 환경을 찾으십시오. 빠른 성장을 할 수 있는 회사 (# 문제 수 >> # 자원). 해결했을 떄 영향력이 큰 문제를 선택할 수

[IOS] Notification Push 구현하기

이미지
[IOS] Notification Push 구현하기 순서 푸쉬계졍 생성 (apple-membership) 어플리케이션 제작 Push Notifications(푸쉬를 날려줄 도구) 1. 푸쉬계졍 생성 참고 블로그 : https://faith-developer.tistory.com/153 푸쉬를 위해서는 계정이 필요하다. a. 인증서 생성 b. App ID 생성 (Identifiers) c. Push 인증서 등 록 (Certificates) a. 인증서 생성 키체인 접근 > 인증서 지원 > 인증 기관에 인증서 요청 > 이메일주소입력 > 디스크에 저장 > CertificateSigningRequest.certSigningRequest 파일 저장 b. App ID 생성 identifiers > +버튼 > appId > bundleId 입력 > Push Notifications 선택 > Continue > Register c. Push 인증서 등록 identifiers > bundleId 선택 > Configure > Development SSL Certificate > Create Certificate > 위에서 생성한 CertificateSigningRequest.certSigningRequest 파일 업로드 > Countinue > Download > aps_development.cer 다운로드 다운받은 aps_development.cer를 실행하면 키체인에 등록된다. 등록된 키 체인에서 push_cert.p12 파일로 내보내준다. 이 파일은 후에 메시지를 전송하는데 쓰인다. 2. 어플리케이션 제작 참고 블로그 : https://www.raywenderlich.com/8164-push-notifications-tutorial-gettin