본문 바로가기

분류 전체보기112

Call by Reference와 Call by Pointer의 차이 IntroductionCall by reference와 Call by pointer는 자주 혼동되는 개념이다. 두 방식은 용도와 실행 결과, 심지어는 컴파일 결과까지 거의 같기 때문에, 구분하지 않는 경우가 많다.하지만 C++ 처럼 두 방식을 쓸 수 있는 경우에는 두 방식의 차이를 알아둬도 좋다.All data is accessed through memory addresses함수가 값을 전달받는 방식이 call by value, call by reference, call by pointer 중 어떤 것이든, 컴파일 이후 어셈블리 수준에서는 결국 메모리 주소(또는 레지스터)를 통해 값에 접근하게 된다.call by reference와 call by pointer는 원본의 주소를 그대로 넘기며, 함수 내부에.. 2025. 6. 7.
[BOJ]2193: 이친수 - Swift/DP 문제https://www.acmicpc.net/problem/2193풀이문제에서 명시적으로 두 가지 조건을 제공해준다.0으로 시작하지 않는다.1이 연속되지 않는다.이진수라는 조건도 있으므로, 3가지 조건이 있다고 볼 수 있다.케이스를 몇개 써보면 쉽게 DP로 풀 수 있는걸 알 수 있다.dp[1] = 1 // 1dp[2] = 1 // 10dp[3] = 2 // 100, 101dp[4] = 3 // 1000, 1001, 1010 2번째 조건 때문에, 0으로 끝나는 경우에는 1을 붙일 수 있지만, 1로 끝나는 경우에는 0으로 붙일 수 없는 것을 알 수 있다.DP 테이블을 다음과 같이 정의하자.dp[i][j]: 자리수가 i인 이진수 중 마지막 자리수가 j인 이친수의 개수따라서 점화식은 다음과 같이 된다.dp[i.. 2025. 4. 30.
[BOJ]12852: 1로 만들기 2 - Swift/DP 문제https://www.acmicpc.net/problem/12852풀이DP를 사용해서 해결했다.문제를 거꾸로 뒤집어보자. n에서 1을 가는 최단거리가 아니라, 1에서 n으로 가는 최단거리로 바꾸는 편이 편하다.이렇게 뒤집으면 개별 숫자에서 다른 숫자로 갈 수 있는 방법은 3가지가 주어진다.1 더하기2 곱하기3 곱하기쉽게 점화식을 만들 수 있다.`dp[i] = max(dp[i - 1], dp[i / 2], dp[i / 3]) + 1` 하지만 경로도 트래킹 해야 하는데, 이건 각 개별 숫자에 도달하기 전에 어떤 수에서 왔는지를 저장하는 배열 하나를 만들고, 최종적으로 이 배열을 루프로 순회하거나, 재귀를 통해서 경로를 얻어낼 수 있다.코드func trackPath(_ startNode: Int) { .. 2025. 4. 30.
[Swift] Access Control(액세스 컨트롤) - 2 Custom Types커스텀 타입에 대한 명시적인 액세스 레벨을 지정하고 싶으면, 타입을 정의할 때 하면 된다. 새로운 타입은 액세스 레벨이 허용하는 곳이라면 어디에서든 사용할 수 있다. 예를 들어, file-private한 클래스를 정의하면, 그 클래스가 정의된 소스 파일 내부에서 프로퍼티나, 함수의 파라미터 혹은 리턴 타입으로만 사용할 수 있다.또한 타입의 액세스 컨트롤 레벨은 타입의 멤버(프로퍼티, 메소드, 이니셜라이저, 서브스크립트)의 기본 액세스 레벨에도 영향을 끼친다. 만약 타입의 액세스 레벨을 private이나 file private으로 정의했다면, 멤버들의 기본 액세스 레벨도 private이나 file private이 된다. 만약 타입의 액세스 레벨을 internal 이나 public으로 .. 2025. 1. 29.
[Swift] Access Control(액세스 컨트롤) - 1 Access Control액세스 컨트롤은 다른 소스 파일이나 모듈에서 코드의 일부분에 접근하는 것을 제한한다. 이 기능은 코드의 구체적인 구현 사항을 숨기면서 해당 코드에 접근하고 사용할 선호하는 인터페이스를 지정할 수 있게 해준다.개별 타입들 (클래스, 스트럭처, 이뉴머레이션) 뿐만 아니라 해당 타입에 포함된 프로퍼티, 메소드, 이니셜라이저, 서브스크립트에도 접근 레벨을 지정할 수 있다. 프로토콜도 특정 컨텍스트로 제한할 수 있으며, 글로벌 상수, 변수, 함수도 가능하다.다양한 레벨의 액세스 컨트롤을 제공하는 것에 더해서, Swift는 일반적인 시나리오에 대해서 기본 액세스 레벨을 제공해서 명시적으로 액세스 컨트롤 레벨을 지정할 필요를 줄였다. 만약 싱글 타겟 앱을 작성하고 있다면, 아마도 명시적인 액.. 2025. 1. 28.
[Swift] Memory Safety(메모리 안전) - 2 Conflicting Access to In-Out Parameters함수는 모든 in-out 파라미터에 대한 장기 쓰기 접근 권한을 가지고 있다. in-out 파라미터에 대한 쓰기 권한은 모든 non-in-out 파라미터가 evaluate된 후에 시작되어 함수가 호출되는 전체 기간동안 유지된다. 여러개의 in-out 파라미터가 존재할 경우, 쓰기 접근 파라미터들이 보이는 순서대로 시작된다.이 장기 쓰기 접근 권한의 결과중 하나는 스코프 규칙(scoping rule)과 액세스 컨트롤이 허락하더라도, in-out으로 전달된 원본 변수에 접근할 수 없다는 것이다—원본에 접근하는 것은 충돌을 발생시킨다:var stepSize = 1func increment(_ number: inout Int) { num.. 2025. 1. 27.
[Programmers] Lv.2 순위 검색 - Swift/Hash Table, Binary Search https://school.programmers.co.kr/learn/courses/30/lessons/72412 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 풀이많이 해맨 문제다. 처음에는 다음과 같이 알고리즘을 생각했다.1. 일단 쿼리의 개수와 info 배열의 크기를 생각해보면 filter를 사용하는 문제는 아님2. 바이너리 서치, Upper bound와 Lower bound의 차이가 해당하는 원소의 개수가 같음3. info 배열을 잘 정렬해서 바이너리 서치만 하면 쉽게 해결될 문제 하지만 조금만 생각해보면 이러한 방식의 알고리즘은 문제를 절대로 해결할 수 없다.우선 쿼리의 조건들이 독립적이다. .. 2025. 1. 7.
[백준]BOJ 13144: List of Unique Numbers - Swift/Two Pointer 13144번: List of Unique Numbers (acmicpc.net) 문제풀이매우 특이한 유형의 투 포인터 문제다. start, end가 증가만 해서는 모든 경우의 수를 나타낼 수 없으며, 모든 경우의 수를 탐색하려면 O(n^2)이 된다. 1 2 3 1 2 라는 수열이 있을 때를 생각해보자그러면 겹치지 원소가 나오지 않도록 작성한 일반적인 투 포인터는 1, 12, 123, 231, 312 이렇게 5번 탐색을 하고 종료한다. 하지만 1 2 3 1 2의 정답은 5가 아니라 15이다. 하지만 이 5번의 탐색만으로도 15라는 결과를 얻을 수 있는데, 우리는 정확한 부분 수열의 형태보다 경우의 수만 알면 되기 때문이다. 다음은 15라는 정답을 유도하는 과정을 시각적으로 나타낸 것이다: "1"1 "12".. 2024. 6. 12.
[백준]BOJ 4179: 불! - Python/BFS https://www.acmicpc.net/problem/4179 문제풀이지훈이가 움직이고, 불을 퍼뜨리면 된다. 순서대로 진행하면 되는데 주의해야 할 점이 두 가지 있다.1. 1분마다 기준으로 번갈아서 움직여야 한다.2. 지훈이가 움직이기 전에 불에 타면 안된다.코드from collections import dequedef bfs(jihun, fires): is_jihun_Visited = [[-1] * c for _ in range(r)] fire_queue = deque() jihun_queue = deque() fire_queue.append(fires) jihun_queue.append([jihun]) is_jihun_Visited[jihun[0]][jih.. 2024. 6. 10.