팰린드롬(Pelindrome)이란? 앞뒤가 똑같은 단어나 문장으로, 뒤집어도 같은 말이 되는 단어 또는 문장을 팰린드롬이라 합니다. 우리 말로는 "소주 만 병만 주소" 같은 문장을 일컫습니다. 주어진 문자열이 팰린드롬인지 확인하라. 대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다. 먼저 해당 문제의 솔루션을 리스트를 사용하여 구현하고, 성능 개선을 위해 Deque 자료형과 문자열 슬라이싱을 사용해 코드를 작성해보도록 하겠습니다! 리스트로 반환 영문자, 숫자 여부를 판별하는 isalnum() 함수를 사용하여 문자열 리스트에 대입한 후, 첫 번째 문자와 마지막 문자를 pop() 함수를 통해 비교해나가는 방식입니다. def isPalindrome(s: str) -> bool : strs = [] ..
분류 전체보기
실습 환경 구축 이번 SQL Injection 실습에서는 이전 포스팅에서 구축한 서버를 바탕으로 실습이 진행됩니다! https://younngjun.tistory.com/62 리눅스 가상환경에 서버 구축 및 간단한 로그인 페이지 구현 서버를 구축한다? 웹 프론트엔드가 구현되었다면, 클라이언트는 브라우저를 통해 로그인 등의 기능을 수행하고자 합니다. 이러한 기능 구현을 위해 백엔드에서는 해야할 일들이 있습니다. ① younngjun.tistory.com 현재 MySQL DBMS의 login Database의 user Table에 id: admin, pw: admin123의 데이터를 추가해놓은 상황입니다. ID와 PW를 입력했을 때 login Database에 (id,pw) 쌍을 확인한 후에, 로그인 성공 ..
서버를 구축한다? 웹 프론트엔드가 구현되었다면, 클라이언트는 브라우저를 통해 로그인 등의 기능을 수행하고자 합니다. 이러한 기능 구현을 위해 백엔드에서는 해야할 일들이 있습니다. ① 먼저 클라이언트의 요청을 받고 이를 응답할 수 있어야 합니다. 이를 웹 서버(Web Server)가 담당합니다. → Web Server (ex: Apache2, Nginx) ② 요청에 대한 응답이 가능하다면 로그인, 검색 등 상황에 맞는 기능을 개발해야 합니다. 이는 클라이언트에게 보여지는 부분이 아닌 서버에서 실행되어야 하는 부분이기에 서버 사이드 언어를 사용해 개발을 해야합니다. → 서버에서 기능을 담당하는 프로그래밍 언어인 PHP, JSP, ASP 등 ③ 그리고 기능을 정상적으로 실행하기 위해서는 서버 사이드 언어로 개..
switch 는 암시적인 진행을 사용하지 않는다! (No Implicit Fallthrough) Swift 에서는 break 를 적지 않아도, 특정 case 가 완료되면 자동으로 switch 구문을 빠져 나오게 된다. 이런 사용법으로 인해 실수로 break 를 적지않아 의도하지 않은 case 문이 실행되는 것을 방지한다. break 가 Swift에서 필수는 아니지만, case 안에 특정 지점에서 멈추도록 하기 위해 break 를 사용할 수 있다. switch 문의 특징 1. case 안에는 최소 하나의 실행 구문이 있어야 한다. let anotherCharacter: Character = "a" switch anotherCharacter { case "a": // Invalid, case문에 body가 ..
RxSwift 의 Error 관리 RxSwift 에서의 에러 관리는 프레임워크 중 하나로 분리되어 있다. 바로 catch 와 retry. 따로 따로 사용하기 보다 catch 와 retry 를 조합해서 사용할 수 있을 것이다. "몇번 까지 재시도 후, 안되면 에러를 특정 방식으로 내뱉어라" 등으로 말이다. catch default value 로 에러를 복구하는 방식 RxSwift 에는 catch 계열의 두 가지 주요 연산자가 있다. ① catch 먼저 catch 연산자이다. 클로저를 매개변수로 받아서 완전히 다른 형태의 Observable 로 반환해주는 연산자이다. func catch(_ handler:) -> RxSwift.Observable 예시는 다음과 같다. enum MyError: Error { ..
replay 반복하는앵무새🦜에 대해 subscribe 하기 전에 "인사말"에서 이벤트를 방출하고 있었다. subscribe 를 늦게 하더라도 replay 에 선언한 buffer 1 만큼의 이전에 방출된 이벤트의 값을 가져올 수 있다. 물론, subscribe 이후 발생하는 이벤트에 대해서는 값을 가져온다. print("----------replay----------") let 인사말 = PublishSubject() let 반복하는앵무새🦜 = 인사말.replay(1) 반복하는앵무새🦜.connect() 인사말.onNext("1. hello") 인사말.onNext("2. hi") 반복하는앵무새🦜 .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 인사말..
reduce 제공된 초기값(0)에서 시작해서, source observable 이 방출할 때마다 값을 가공한다. Observable.from((1...10)) // .reduce(0, accumulator: { summary, newValue in // return summary + newValue // }) .reduce(0, accumulator: +) .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) ----------reduce---------- 55 scan 매번 값이 들어올 때마다 변형된 값들을 방출한다. print("----------scan----------") Observable.from((1...10)) .scan(0, accum..
withLatestFrom 💥🔫 의 withLatestFrom 연산자에 '달리기선수' 라는 Observable 을 두면 💥🔫 가 이벤트를 방출하였을 때, '달리기선수'가 방출하였던 제일 최신 값이 방출된다. print("----------withLatestFrom----------") let 💥🔫 = PublishSubject() let 달리기선수 = PublishSubject() 💥🔫.withLatestFrom(달리기선수) // .distinctUntilChanged() //Sample과 똑같이 쓰고 싶을 때 .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 달리기선수.onNext("🏃🏻♀️") 달리기선수.onNext("🏃🏻♀️ 🏃🏽♂️")..
startWith 현재 위치, 네트워크 연결 상태 등 현재 상태, 초기값이 필요한 상황이 있다. 이때 이를 맨 앞에 붙일 수 있다. print("-----startWith------") let zoo = Observable.of("🐳", "🐕", "🦢") zoo .enumerated() .map { (index, element) in return "아기 " + element + " \(index)" } .startWith("🧑🌾사육사") // String - Observable 로 방출되는 값과 동일한 타입의 값이 들어가야 한다. .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) -----startWith------ 🧑🌾사육사 애기 🐳 0 애기..
combineLatest 여러 TextField 를 한번에 관찰하고 값을 결합하거나, 여러 소스들의 상태를 보는 경우 많이 사용한다. 다음은 두 개의 TextField 인 idField, pwField 의 combineLatest 처리 예시이다. checkEmailValid 와 checkPasswordValid 는 리턴 값이 Bool 이고, 이에 따라 loginButton 의 활성화를 표현한다. idField 의 값이 변경되면, 변경된 값을 통해 checkEmailValid 함수를 통과됨과 동시에, 자동으로 가장 최신의 pwField 의 값 또한 checkPasswordValid 함수를 통과하게 된다. 마찬가지로 pwField 값이 변경되면 반대로 적용된다. 즉, 최종적으로 반환하고자 하는 값을 위해 여..