전체 글 198

Property Observer

Property Observer의 뜻은 프로퍼티를 감시한다 라는 의미이다. Stored Property(저장 프로퍼티)에서만 사용이 가능하다. willSet - 값이 저장되기 직전에 호출 didSet - 값이 저장된 직후 호출 willSet willSet 옵저버라고 부른다. 새로운 값이 상수 매개변수로 전달된다. 매개변수 이름을 직접 지정할 수 있지만, 직접 지정 하지 않는 경우 newValue라는 매개변수를 통해 전달된다. didSet 이전 프로퍼티 값을 포함하는 상수 매개변수가 전달된다. 매개변수 이름을 직접 지정할 수 있고, 지정하지 않는 경우 oldValue라는 매개변수를 통해 사용할 수 있다. 위에서 저장 프로퍼티에서만 프로퍼티 옵저버를 사용할 수 있다고 했지만 연산 프로퍼티에서도 조건을 만족되..

iOS/문법 2023.02.11

Property

Property 종류 Stored Property (저장 프로퍼티) Computed Property (연산 프로퍼티) Type Property (타입 프로퍼티) Stored Property (저장 프로퍼티) 상수(constant) 혹은 변수(variable) 값을 인스턴스 일부로 저장한다. (클래스, 구조체에서 사용) var: 변수 let: 상수 간단하죠..? Computed Property (연산 프로퍼티) 연산 프로퍼티는 저장 프로퍼티와 다르게 저장을 하기 위한 목적의 프로퍼티가 아닌 연산을 하기 위한 프로퍼티이다. (말장난 느낌이네..;) 예를 들어 보면 class Test{ var a = 1 var x = { get{ return a } set{ a = newValue * 2 } } } var t..

iOS/문법 2023.02.11

백준[2206] 벽 부수고 이동하기

BFS를 이용하여 해결하는 문제인 것은 알고 있었지만 그냥 최단 거리가 아닌 벽을 하나 부순다는 상황이 주어져서 더욱더 혼란스러워졌다. 2일 동안 생각을 해보고 도전을 해봤지만 실패... 혼자서는 도저히 못 풀겠다는 생각이 들어 인터넷 블로그의 힘을 살짝 빌렸다..ㅠ 다른 사람들이 해결했던 방법들을 보고 이해한 후 문제를 보고 다시 풀었다..... 해결 방법 최단 거리를 측정하는 패턴은 기존 벽을 부수지 않고 이동하는 것과 동일하다. 하지만 최단거리로 가기 위해 벽을 한번 부수려면 모든 벽을 탐지한 후 벽을 부숴야 한다. 출발하자마자 벽을 부수고 가는 것이 최단 거리일 수 있지만 도착지가 벽으로 둘러 싸여 있는 경우 벽 부수는 스킬을 아껴 놓아야 한다. 해당 사례가 아래 그림이다. 출발지 0(a) 0(b..

Singleton 패턴 알아보기

Singleton은 객체를 하나 생성하고 공용으로 사용하고 싶을 때 사용한다. Singleton은 어떤 객체에서도 같은 데이터를 사용하고 싶을 때 사용하게 된다. (환경설정, 네트워크 객체, 로그인 정보 등을 미리 생성해 둔 객체에 넣어두고 사용한다) 예를 들어 클래스 A, B, C가 있을 때 A의 데이터를 B, C 클래스에서 같은 데이터를 사용한다고 가정하자. class A{ var data = "hello" func printData() -> String { return data } } class B{ var a1 = A() a1.printData()//hello } class C{ var a2 = A() a2.printData()//hello } 위 예제에서 A클래스 인스턴스를 B, C 클래스에서 ..

iOS/Swift 상식 2023.02.05

Delegate 패턴 알아보기

Delegate라는 단어를 처음 만나면 되게 생소하다. Delegate는 대신해서 움직여주는 역할이다. protocol을 이용하여 다른 클래스에게 권한을 위임할 수 있다. (protocol은 내부에 method, property를 선언하고 protocol을 상속받는 곳에서 protocol stubs를 사용할 수 있다.) 아무튼 delegate는 구성해 놓은 작업들을 대신해 주는 역할이다. 한 줄로 끝나는 delegate지만 한 번에 이해하기 어렵다.. 쉽게 이해하기 위해서 예를 들어 살펴보자 내가 인기 있는 카페 여러 매장을 가지고 있는 사장이라고 가정해 보자. (상상만으로 즐겁네) 모든 카페에서 내가 직접 커피를 내리고 계산을 하는 것은 불가능하다. 따라서 아르바이트생이나 매니저들(대리자)을 구한 뒤 ..

iOS/Swift 상식 2023.02.04

Instance Method, Type Method

Instance Method 인스턴스 메서드는 특정 클래스, 구조체, 열거형 인스턴스에 속한 메서드를 의미한다. 흔히 우리가 알고 있는 함수들을 의미한다. Instance Method인 thisIsInstanceMethod를 접근해 보자 class JJ{ func thisIsInstanceMethod(){ print("hello") } } let jj: JJ = .init() jj.thisIsInstanceMethod() 해당 인스턴스 메서드에 접근하려면 클래스 JJ를 인스턴스를 생성하고 생성된 JJ인스턴스에.(dot)을 통해 접근할 수 있다. Class Method를 알아보기 전에 Type Method를 먼저 알아보자 Type Method Type Method란 Class Method와 Static M..

iOS/Swift 상식 2023.02.04

백준[16928] 뱀과 사다리 게임

BFS를 이용하여 문제에 적힌 규칙을 적용했다. 처음 풀었을 때는 사다리를 만나면 타고 뱀을 타면 무시하는 방법으로 풀었더니 계속 틀렸다. 반례 세 번째 같은 경우가 있어서 뱀을 타고 가는 경우가 있다. 그 외에는 어려운 부분 없이 쉽게 풀 수 있다. #include int slgN, slgM; struct slgMv{ int y; bool visitied; }typedef slgMV; slgMV slgList[101] = {0}; int slgTotalTime = 0; void slgBFS(){ queue slgQ; slgQ.push({1,1}); int dx[] = {1,2,3,4,5,6}; while(!slgQ.empty()){ int x = slgQ.front().first; int time = ..

백준[7569] 토마토

7576번 토마토는 2차원 문제였다면 이번에는 3차원으로 해결하는 문제이다. 2차원 문제를 쉽게 풀었다면 3차원이라고 딱히 막 어렵지 않았다. 2차원 문제와 다른 게 배열범위랑 탐색하는 범위가 살짝 늘어났지만 조금만 생각하면 쉽게 해결할 수 있다. #include #define MAXSIZE 101 int toM3,toN3,toH3; int inBoxSizeV3[MAXSIZE][MAXSIZE][MAXSIZE]; //면, 행, 열 순서 queue tomatoQV3; //면, 행, 열 순서 int tomatoMaxTimeV3 = 0; void toBFSV3(){ int dX[] = {1,-1,0,0,0,0}; int dY[] = {0,0,1,-1,0,0}; int dZ[] = {0,0,0,0,1,-1}; w..

백준[7576] 토마토

처음에 접근을 DFS를 이용하여 토마토 집단이 몇 개인지 알아보고 최소일을 구하는 방식으로 접근했는데 BFS에 대한 이해가 부족했던 것 같다. BFS는 queue에 넣고 반복문을 통해 계산을 진행해서 출발 점이 여러 개여도 큐 안에 미리 넣기만 하면 여러 출발점에서도 동작시킬 수 있다. #include #define MAXBOXLENGTH 1001 int toM,toN; int inBoxSize[MAXBOXLENGTH][MAXBOXLENGTH]; queue tomatoQ; int tomatoMaxTime = 0; void printResult(); void toBFS(){ int dX[4] = {1,-1,0,0}; int dY[4] = {0,0,1,-1}; while(!tomatoQ.empty()){ i..

백준[7562] 나이트의 이동

별다른 문제없이 해결했지만.. 초기화를 할 때 범위를 300이 아닌 301로 지정하여 수십 번 틀렸다..ㅠ 이차원상의 이동을 하는 문제는 이동가능한 범위를 배열로 나타내어 문제를 풀면 쉽게 풀 수 있다. 최단 거리를 찾는 문제들은 bfs를 사용하면 문제를 해결할 수 있는 것 같다. #include int testCase; int length; int finalX, finalY; //최종 도착지 int mvCount; bool knightVisited[301][301] = {false}; int knightCount[301][301]; void printLocate(); void printVisited(); void knightBFS(int x,int y){ queue knightQ; knightQ.pus..