본문 바로가기

전체 글93

[백준 2573번] 빙산 (Python) 그래프 탐색(DFS, BFS)과 추가적인 구현이 필요한 문제였다. 문제 링크 2573번 빙산 문제 요약 이 문제는 지구 온난화로 인해 북극의 빙산이 녹고 있는 상황을 배경으로 한다. 빙산을 2차원 배열에 양의 정수로 표시하여, 각 부분별 높이 정보를 배열의 각 칸에 저장한다. 빙산이 아닌 바다에 해당되는 칸에는 0이 저장된다. 빙산의 높이는 동서남북 네 방향으로 0이 저장된 칸의 개수만큼 매년 줄어든다. 한 덩어리의 빙산이 주어졌을 때, 이 빙산이 두 덩어리 이상으로 분리되는 시간(년)을 구하는 것이 문제의 목표. 입력: 첫 줄에는 2차원 배열의 행과 열의 개수(N, M)가 주어지고, 그 다음 N개의 줄에는 M개의 정수가 주어지며, 이는 빙산의 높이 정보 출력: 빙산이 두 덩어리 이상으로 분리되는 최초.. 2024. 3. 11.
[백준 14501번] 퇴사 (Python) 다이나믹 프로그래밍을 활용하여 푸는 문제이다. (DP? 나에겐 너 무 어 려 워 😭) 점화식 세우는게 반복되는 규칙성있는 로직을 파악하지 않고서야 감도 안잡히기 때문에 자꾸 DP문제에 그리디로 접근하게 되는 부족함이 있다. 하다하다 안되어서 뤼튼과 함께했다. → 이해를 목표로 다시 정리! 문제 링크 14501번 퇴사 (똑같은 문제, 15486번 퇴사2) 문제 요약 재택 근무 중인 백준이가 퇴사까지 남은 N일 안에 상담을 통해 얻을 수 있는 최대 수익을 계산하는 문제 상담을 완료하는 데 필요한 기간 ( T_i )와 상담을 통해 얻을 수 있는 수익 ( P_i )가 주어진다. 상담 기간이 퇴사일을 넘기면 안 되고, 한 번에 한 개의 상담만 진행할 수 있다. 필요 항목 정리 퇴사까지 N일 날짜별로 얻을 수 있는.. 2024. 3. 7.
Swift 심화 학습하기 (프로토콜, Never 타입, #keyPath와 #selector, 메타타입, availability) 프로토콜 Equatable 프로토콜 동일성 비교를 위한 프로토콜이다. 스위프트에서 제공하는 기본타입은 모두 채택하고 있다. 아래 메서드 구현이 해당 프로토콜의 요구사항이다. static func == (lhs: Self, rhs: Self) -> Bool 구조체, 열거형의 경우 Equatable 프로토콜 채택 시 모든 저장 속성이 Equatable 프로토콜을 채택한 타입이라면 비교연산자 메서드가 자동 구현된다. 단, 예외 케이스가 몇 가지 존재한다. 1) 클래스는 인스턴스를 비교하는 항등연산자(===)가 존재하기 때문에 비교연산자(==)는 개발자에게 구현이 위임된다. 2) 열거형의 경우 연관값이 없다면 기본적으로 Equatable, Hashable하기 때문에 Equatable 프로토콜을 채택하지 않아도 .. 2023. 8. 30.
Swift 고급연산자 숫자 리터럴 Swift는 숫자를 표기할 때 추가적으로 알아두면 좋은 몇가지 포인트들이 있다. 1. 2진법/8진법/16진법으로 직접 써 넣을 수 있다 2. 큰 숫자를 읽기 쉽게 하기위해 언더바(_)를 사용해도 된다 var num:Int = 0 num = 0b00011010 num = 0o31 num = 0x19 num = 1_000_000 또한, Swift에서는 Int/UInt 타입을 저장할 때 플랫폼 사양에 따라 다르지만 최근에는 64bit -> 8byte로 저장된다. 이는 Int64 / UInt64로 표기된다. 이를 확인하기 위해 MemoryLayout.size를 입력하면 메모리를 얼마나 사용하는지 알려준다. 오버플로우 오버플로우라는 개념은 값이 넘침을 의미한다. 예를들어 8비트를 담을 수 있는 공간에.. 2023. 8. 29.
Swift 문자열과 문자(String and Character) 아스키코드와 유니코드 둘 다 문자와 문자열을 숫자로 저장하기 위한 체계이다. 아스키코드는 7bit를 사용해 0부터 127까지 매칭되는 것을 정의해 놓고 사용하는 방식이었다. 단, 아스키코드는 영어만 표현이 가능했다. 그 한계를 깨기 위해 유니코드는 한글 등 어떠한 언어 및 기호, 이모지까지의 문자도 표현할 수 있도록 매칭해 놓아 전 세계에서 통일된 방식이다. 영문자 부분은 아스키코드를 포함한다. 인코딩 방법은 8, 16, 32 Bits를 지원한다. UTF-8은 1~4 bytes 가변길이 인코딩으로 웹과 대부분 체계에서 주로 사용된다. 모든 문자열은 개별 인코딩된 유니코드 문자들로 구성된다. Swift에서는 문자열을 저장할 때, 하나의 문자를 유니코드의 스칼라값으로 저장한다. 그리고 언제든지 UTF-8, .. 2023. 8. 28.
Swift 제네릭(Generics) 문법 알아보기 제네릭 문법 형식에 관계없이, 한 번의 구현으로 모든 타입을 처리하여 타입에 유연한 함수를 작성하는 문법이다. 유지보수 및 재사용성이 증가하는 장점이 있다. 함수뿐만 아니라 구조체, 클래스, 열거형도 제네릭으로 일반화가 가능하다. 제네릭 문법이 필요한 이유 타입만 다르고 구현 내용이 동일한 경우, 제네릭이 없다면 타입마다 모든 경우를 다 정의해줘야 한다. 개발자의 일이 늘고, 유지보수 및 재사용성이 어렵게 만들기 때문이다. 제네릭 함수의 정의 func genericsFunc(array: [T]){ // code } 는 타입 파라미터라고 한다. 함수 내부에서 파라미터의 타입이나 리턴형으로 사용된다. 관습적으로 Type의 의미인 T를 사용하기도 하지만, 다른 문자를 사용해도 된다. (형식 이름이기 때문에 U.. 2023. 8. 11.
iOS 화면 시스템 (프레임 vs 오토레이아웃) iOS는 프레임 방식에서 오토레이아웃 방식으로 발전되었고, 2가지 시스템이 공존한다. 프레임(frame) 상위 뷰를 기준으로 위치(position), 크기(size), 원점을 origin으로 표기 고정 (화면 왼쪽 상단 or 상위 뷰 기준) 여러 크기의 화면 대응 불가 (가능하나 불편 - 화면 크기를 불러와서 비율로 재계산) 타입: CGRect = CGPoint + CGSize 오토레이아웃(제약 - constraints) 제약조건을 활용해 정렬(Alignment), 고정(Pinning), anchor 상대적 / 동적 여러 크기의 화면 대응이 쉬움 NSLayoutConstraint 현재는 오토레이아웃 결과(화면 크기별로) 프레임으로 다 계산되어 화면에 표시되고 있는 것이다. 또한, 화면 상단과 화면 전환을.. 2023. 8. 10.
Xcode MARK, 코드 스니펫 설정하는 법 실무는 코드가 굉장히 길기 때문에 원하는 코드를 찾기가 어렵다. 때문에 MARK를 사용하여 기록해놓고, 추후 빠르게 해당 부분을 찾는다. MARK는 아래와 같은 형태로 입력한다. // MARK: - 이메일 박스 그리고 Xcode의 해당 부분을 클릭하면 마크가 위와 같이 보여진다. 반복되는 입력을 간단히 하기 위해 코드 스니펫을 사용해 더 쉽게 작성할 수 있다. 트랙패드에 두 손가락을 눌러 Create Code Snippet을 누른다. 그럼 나타나는 스니펫 설정 창에서 아래와 같이 입력한다. 참고로 내용입력 부분은 과 같이 입력하면 위와 같이 나온다. 그리고 코드 내 mark를 입력하면 자동 완성이 나온다! 2023. 8. 10.
Swift 에러 처리(Error Handling) 에러는 컴파일 에러와 런타임 에러로 구분할 수 있다. 컴파일 에러는 우리가 코드를 치는 동안 발생하는 문법적 오류들을 XCode에서 알려주는 것들을 말한다. 런타임 에러는 실제 프로그램 실행중에 오류로 인해 앱이 꺼지는 오류를 말한다. 런타임 에러는 사용자들에게 UX 적으로 좋지 못한 경험을 주기 때문에 미리 에러 처리를 통해 런타임 에러를 막아야 한다. 런타임 오류가 발생하는 상황의 예시로는 네트워크 통신을 통해 데이터를 받아와 화면을 표시해야하는데, 데이터를 받아오지 못한 경우 발생할 수 있다. 그럼 런타임 에러가 발생할 때 프로그램이 바로 꺼지는 것이 아닌 유저에게 안내를 해주고 꺼지게 하는 방법은 없을까? [에러 타입 정의] Error는 열거형이므로 미리 정의한 후 사용할 수 있다. 또한 Err.. 2023. 8. 7.