https://www.acmicpc.net/problem/12015

 

12015번: 가장 긴 증가하는 부분 수열 2

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)

www.acmicpc.net

dp를 통해서 풀게 되면 수열의 크기 때문에 시간 초과가 일어난다. 문제의 힌트에 이분 탐색을 이용하라고 되어있어 어느 부분에 이분 탐색을 적용할 수 있는지 고민해보았지만 다른 풀이를 확인하고 나서 알았다.

 

풀이

최장 증가수열을 담을 배열 arr을 생성 후 입력받은 수열을 순서대로 탐색하면서 해당 숫자가 배열의 마지막 숫자보다 큰 경우, 배열에 추가해주고 작은 경우, 이분 탐색을 통해 수열의 숫자보다 작은 숫자를 찾으면 해당 위치로 들어가면 된다.

주의할 점은 해당 배열은 정답 배열과 크기만 같지 원소는 다르므로 최장 증가수열을 반환하는 문제에는 오답처리를 받게 된다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[1916] 최소비용 구하기  (0) 2022.11.25
[1105] 팔  (0) 2022.11.24
[2166] 다각형의 면적  (0) 2022.11.22
[16236] 아기 상어  (0) 2022.11.21
[9019] DSLR  (0) 2022.11.19

https://www.acmicpc.net/problem/2166

 

2166번: 다각형의 면적

첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

www.acmicpc.net

기하학에 관련된 문제다. 다각형의 면적을 계산하는 방법만 안다면 쉽게 풀 수 있는 문제다.

 

풀이

https://ko.wikipedia.org/wiki/신발끈_공식

 

신발끈 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 신발끈 공식(―公式)은 좌표평면 상에서 꼭짓점의 좌표를 알 때 다각형의 면적을 구할 수 있는 방법이다. 다각형의 각 꼭짓점의 좌푯값을 교차하여 곱하는 모

ko.wikipedia.org

신발끈 공식을 이용하여 풀었다. 다각형을 이루는 모든 꼭지점의 좌표를 알면 좌표를 이용해 다각형을 여러 개의 삼각형으로 쪼개 넓이를 구하는 공식이다.

다각형의 넓이 = ABS(sum1 - sum2) / 2

 

꼭지점이 시계방향 혹은 반시계 반향으로 순차적으로 주어지게 될 경우, 다음과 같이 순환하는 형태로 줄지어 격자 형태로 곱해서 나온 누적합 sum1, sum2의 차를 2로 나누면 다각형의 넓이를 구할 수 있다. 다행히도 문제에 다각형을 이루는 꼭짓점의 순서대로 입력이 되기에 입력되는 순서 그대로 배열에 담아내면 손쉽게 답을 구할 수 있다.

swift에서는 자릿수 반올림 함수가 제공되지 않으므로 원하는 자릿수에서 반올림 하기위해 직전 자릿수까지 10을 곱해준 뒤 반올림 함수 round()를 이용하였고 다시 자릿수만큼 나누어 주었다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[1105] 팔  (0) 2022.11.24
[12015] 가장 긴 증가하는 부분 수열2  (0) 2022.11.23
[16236] 아기 상어  (0) 2022.11.21
[9019] DSLR  (0) 2022.11.19
[9663] N-Queen  (0) 2022.11.17

해당 질문은 첫 iOS 개발 면접에서 마주했던 질문이라 기억에 강하게 남아있는 질문이다. 우선 swift 레퍼런스 문서를 보면 다음과 같이 정의를 찾을 수 있다.

Frame

The frame rectangle, which describes the view’s location and size in its superview’s coordinate system.

Bounds

The bounds rectangle, which describes the view’s location and size in its own coordinate system.

Declaration

var bounds: CGRect { get set }
 
두 개념 모두 뷰의 위치와 사이즈를 반환하는 CGRect 타입 변수이다. 
하지만 frame은 해당 뷰가 속해있는 상위 뷰의 좌표계를 기준으로 정해진 크기와 좌표이고, bounds의 경우는 자기 자신의 좌표계를 기점으로 정해진 크기와 좌표이다. 
 

What is View?

UIView

An object that manages the content for a rectangular area on the screen.

뷰가 무엇인지부터 설명하자면 사용자의 앱 위에 그려지게 되는 Label, Switch, Button들과 같은 요소들을 모두 view라고 정의한다. SwiftUI 혹은 UIKit을 통해서 생성할 수 있으며, 이러한 뷰들은 UIView라는 클래스로 생성된 객체들이다. 해당 객체들을 통해 유저와의 상호작용이 가능하다.

 

Create a View

let rect = CGRect(x: 10, y: 10, width: 100, height: 100)
let myView = UIView(frame: rect)

뷰를 생성하기 위해선 크기와 좌표가 필요하며 이러한 좌표와 크기는 CGRect라는 형태로 표현된다. 크기와 좌표가 주어지면 해당 조건에 맞게 화면 위에 그려지게 되는 것이다.

 

CGRect

A structure that contains the location and dimensions of a rectangle.

Creating Rectangle Values

init(origin: CGPoint, size: CGSize)
Creates a rectangle with the specified origin and size.
init(x: Double, y: Double, width: Double, height: Double)
Creates a rectangle with coordinates and dimensions specified as floating-point values.
init(x: Int, y: Int, width: Int, height: Int)
Creates a rectangle with coordinates and dimensions specified as integer values.
init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)
Creates a rectangle with coordinates and dimensions specified as CGFloat values.

그렇다면 CGRect는 무엇일까? 위에서 얘기했듯이 뷰의 크기와 좌표계를 담는 구조체이며, 초기화하는 방법에는 여러 가지 방법이 있지만 기본적으로 CGFloat이라는 실수 형태의 자료형을 통해 크기와 좌표를 표현한다.

여기서 CG는 CoreGraphics의 약자로 그래픽 관련 즉 화면 표현에 대한 자료들은 모두 CG로 시작하는 자료형을 사용하니 알아두면 처음 보는 자료형에 대해서도 어떠한 용도로 쓰이는지 유추할 수 있다.

 

iOS의 좌표계 시스템은 뷰의 좌측 상단이 원점(0,0)이며, 화면의 수직면이 y 축이며 수평면이 x 축이다. 즉 y값이 증가하게 되면 아래로 이동하고 x값이 증가하게 되면 우측으로 이동하게 된다. 뷰에 관한 자세한 설명은 해당 글에 따로 정리해두었다.

 

frame과 bounds의 사이즈는 항상 똑같은가?

 

직관적으로 둘의 차이점에 대해 알 수 있는 예시이다. B가 기울어진 상태에서 frame의 경우, 상위 뷰 A의 좌표계에서 차지하는 크기는 좌표를 기준으로 사각형을 그려 표현하게 때문에 B의 frame은 Point(140, 65), Size(320, 320)이 반환되며 bounds의 경우 Point(0,0), Size(200,250)이 반환된다.

 

결론

frame : 상위 뷰의 좌표계 기준으로 좌표 원점과 크기를 반환
bounds : 자기 자신의 좌표계 기준으로 좌표 원점과 크기를 반환

https://github.com/JeaSungLEE/iOSInterviewquestions

 

GitHub - JeaSungLEE/iOSInterviewquestions: 👨🏻‍💻👩🏻‍💻iOS 면접에 나올 질문들 총 정리

👨🏻‍💻👩🏻‍💻iOS 면접에 나올 질문들 총 정리 . Contribute to JeaSungLEE/iOSInterviewquestions development by creating an account on GitHub.

github.com

iOS 개발 관련 지식에 대해 찾아보다가 발견한 글이다. 직무 관련 면접으로 나올 수 있는 예상 질문들이다. 답만 찾아서 외워도 되겠지만, 그렇게 얻은 지식은 또 쉽게 잊혀버리기에 글쓴이의 의도대로 직접 관련 답을 찾아보고 천천히 그에 대한 답을 내려보려고 한다.

iOS

  • Bounds 와 Frame 의 차이점을 설명하시오.
  • 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것을 설명하시오.
  • 앱의 콘텐츠나 데이터 자체를 저장/보관하는 특별한 객체를 무엇이라고 하는가?
  • 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가?
  • App thinning에 대해서 설명하시오.
  • 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
  • @Main에 대해서 설명하시오.
  • 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요?
  • 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.
  • 앱이 In-Active 상태가 되는 시나리오를 설명하시오.
  • scene delegate에 대해 설명하시오.
  • UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가?
  • App의 Not running, Inactive, Active, Background, Suspended에 대해 설명하시오.
  • NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.
  • GCD API 동작 방식과 필요성에 대해 설명하시오.
  • Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
  • iOS 앱을 만들고, User Interface를 구성하는 데 필수적인 프레임워크 이름은 무엇인가?
  • Foundation Kit은 무엇이고 포함되어 있는 클래스들은 어떤 것이 있는지 설명하시오.
  • Delegate란 무엇인지 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.
  • NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오.
  • UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가?
  • App Bundle의 구조와 역할에 대해 설명하시오.
  • 모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인가?
  • 자신만의 Custom View를 만들려면 어떻게 해야하는지 설명하시오.
  • View 객체에 대해 설명하시오.
  • UIView 에서 Layer 객체는 무엇이고 어떤 역할을 담당하는지 설명하시오.
  • UIWindow 객체의 역할은 무엇인가?
  • UINavigationController 의 역할이 무엇인지 설명하시오.
  • TableView를 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드를 설명하시오.
  • 하나의 View Controller 코드에서 여러 TableView Controller 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오.
  • setNeedsLayout와 setNeedsDisplay의 차이에 대해 설명하시오.
  • stackView의 장점과 단점에 대해서 설명하시오.
  • NSCache와 딕셔너리로 캐시를 구성했을때의 차이를 설명하시오.
  • URLSession에 대해서 설명하시오.
  • prepareForReuse에 대해서 설명하시오.
  • 다크모드를 지원하는 방법에 대해 설명하시오.
  • ViewController의 생명주기를 설명하시오.
  • TableView와 CollectionView의 차이점을 설명하시오.

Autolayout

  • 오토레이아웃을 코드로 작성하는 방법은 무엇인가? (3가지)
  • hugging, resistance에 대해서 설명하시오.
  • Intrinsic Size에 대해서 설명하시오.
  • 스토리보드를 이용했을때의 장단점을 설명하시오.
  • Safearea에 대해서 설명하시오.
  • Left Constraint 와 Leading Constraint 의 차이점을 설명하시오.

Swift

  • struct와 class와 enum의 차이를 설명하시오.
  • class의 성능을 향상 시킬수 있는 방법들을 나열해보시오.
  • Copy On Write는 어떤 방식으로 동작하는지 설명하시오.
  • Convenience init에 대해 설명하시오.
  • AnyObject에 대해 설명하시오.
  • Optional 이란 무엇인지 설명하시오.
  • Struct 가 무엇이고 어떻게 사용하는지 설명하시오.
  • Subscripts에 대해 설명하시오.
  • String은 왜 subscript로 접근이 안되는지 설명하시오.
  • instance 메서드와 class 메서드의 차이점을 설명하시오.
  • class 메서드와 static 메서드의 차이점을 설명하시오.
  • Delegate 패턴을 활용하는 경우를 예를 들어 설명하시오.
  • Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오.
  • KVO 동작 방식에 대해 설명하시오.
  • Delegates와 Notification 방식의 차이점에 대해 설명하시오.
  • 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오.
  • MVC 구조에 대해 블록 그림을 그리고, 각 역할과 흐름을 설명하시오.
  • 프로토콜이란 무엇인지 설명하시오.
  • Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오.
  • Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오.
  • mutating 키워드에 대해 설명하시오.
  • 탈출 클로저에 대하여 설명하시오.
  • Extension에 대해 설명하시오.
  • Extension 내부에서 함수를 override할 수 있는지 설명하시오.
  • 접근 제어자의 종류엔 어떤게 있는지 설명하시오.
  • defer란 무엇인지 설명하시오.
  • defer가 호출되는 순서는 어떻게 되고, defer가 호출되지 않는 경우를 설명하시오.
  • property wrapper에 대해서 설명하시오.
  • Generic에 대해 설명하시오.
  • some 키워드에 대해 설명하시오.
  • Result타입에 대해 설명하시오.
  • Codable에 대하여 설명하시오.
  • Closure에 대하여 설명하시오.
  • Closure와 함수와의 관계에 대해 설명하시오.

ARC

  • ARC란 무엇인지 설명하시오.
  • Retain Count 방식에 대해 설명하시오.
  • Strong 과 Weak 참조 방식에 대해 설명하시오.
  • 순환 참조에 대하여 설명하시오.
  • 강한 순환 참조 (Strong Reference Cycle) 는 어떤 경우에 발생하는지 설명하시오.

Functional programing

  • 순수함수란 무엇인지 설명하시오.
  • 함수형 프로그래밍이 무엇인지 설명하시오.
  • 고차 함수가 무엇인지 설명하시오.
  • Swift Standard Library의 map, filter, reduce, compactMap, flatMap에 대하여 설명하시오.

Architecture

  • MVVM, MVI, Ribs, VIP 등 자신이 알고있는 아키텍쳐를 설명하시오.
  • 의존성 주입에 대하여 설명하시오.

SwiftUI

  • @State에 대해서 설명하시오.

Combine

  • PassthroughSubject에 대해서 설명하시오
  • @Published에 대해서 설명하시오
  • AnyCancellable에 대해서 설명하시오
  • sink에 대해서 설명하시오
  • throttle과 debounce의 차이점을 설명하시오.
  • Data를 Binding 하는 방법에 대해서 설명하시오.

https://www.acmicpc.net/problem/16236

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net

그래프 탐색 문제다. 너비 우선 탐색으로 풀었다. 상어의 움직임에 대해 오래 고민했던 문제다.

 

풀이

상, 좌, 우, 하 순서로 너비 우선 탐색을 수행한다. 빈 곳이거나 같은 사이즈의 물고기를 만난다면 큐에 담아 이동을 수행, 자신보다 작은 사이즈의 물고기를 만나면 해당 좌표를 다른 배열에 저장하였다.

탐색이 끝난 뒤 문제의 조건에 맞게 먹을 수 있는 물고기가 담긴 배열을 시간, x좌표, y좌표 순으로 정렬한 뒤 가장 가까운 좌표로 이동하여 해당 물고기를 먹으면 된다. 처음에는 이러한 정렬 없이 먹을 수 있는 물고기를 만나면 바로 먹어버리고 탐색을 종료했는데, 같은 거리에 있는 먹을 수 있는 물고기에 대한 조건이 안 맞아 오답이 나왔다.

탐색 함수는 상어가 이동한 좌표와 걸린 시간을 반환하게 하였다. 상어의 좌표에 이동이 없는 경우 먹을 수 있는 물고기가 없는 것으로 판단하여 반목문을 빠져나오는 것으로 코드를 작성했다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[12015] 가장 긴 증가하는 부분 수열2  (0) 2022.11.23
[2166] 다각형의 면적  (0) 2022.11.22
[9019] DSLR  (0) 2022.11.19
[9663] N-Queen  (0) 2022.11.17
[16234] 인구 이동  (0) 2022.11.16

https://www.acmicpc.net/problem/9019

 

9019번: DSLR

네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

www.acmicpc.net

그래프 탐색 문제다. 너비 우선 탐색으로 해결했다.

 

풀이

0부터 9999에 해당하는 움직임을 담는 문자열 배열을 생성한 뒤, 입력되는 A부터 시작하여 너비 우선 탐색을 수행한다. D, S, L, R 연산에 해당하는 숫자를 만들고 해당 인덱스의 배열에 현재까지의 움직임에 해당 움직임 문자열을 더하여 탐색을 수행한 뒤 탐색이 끝나면 B인덱스의 배열 값을 출력하면 된다.

 

정답 코드

시간초과를 마주하여 조금 더 동작을 빠르게 해결하기 위해 27번 라인에 B번째 배열의 값이 갱신되면 탐색을 곧바로 종료하는 조건을 추가하였다.

'Problem Solving > BOJ' 카테고리의 다른 글

[2166] 다각형의 면적  (0) 2022.11.22
[16236] 아기 상어  (0) 2022.11.21
[9663] N-Queen  (0) 2022.11.17
[16234] 인구 이동  (0) 2022.11.16
[15685] 드래곤 커브  (0) 2022.11.15

https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

백트래킹 대표 유형 문제다. 예전에 시도했던 문제지만 시간제한에 걸려 풀지 못했던 문제다. 결국 다른 분의 풀이를 확인하고 풀 수 있었다.

 

풀이

해당 문제는 같은 행과 열, 그리고 우측에서 좌측으로 내려오는 대각선과 좌측에서 우측으로 내려오는 대각선이 겹치는지 확인하여 N번의 조건을 백트래킹을 통해 풀어야 한다. 단순하게 매 횟수마다 2차원 배열의 true false를 통해 조건을 탐색하게 된다면 시간 초과가 일어나게 된다.

이번 풀이는 열, 좌측 하행 대각선, 우측 하행 대각선을 담당하는 Bool 타입 1차원 배열을 각각 따로 생성하여 조건을 확인하는 방법이다. 행에 대한 배열이 없는 이유는 한 행에 하나의 퀸만 놓을 수 있기에 따로 퀸을 놓게 되면 바로 다음 행으로 넘어가기 때문이다.

N = 4일 경우의 각 배열의 양상이다. 2차원 보드판 위치의 기준으로 각 배열에 확인해야 하는 인덱스를 넣어 놓았다. 3가지 배열 모두 해당 인덱스에 퀸이 없을 경우에만 퀸을 배치하고 다음 열로 넘어가게 된다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[16236] 아기 상어  (0) 2022.11.21
[9019] DSLR  (0) 2022.11.19
[16234] 인구 이동  (0) 2022.11.16
[15685] 드래곤 커브  (0) 2022.11.15
[14500] 테트로미노  (0) 2022.11.14

https://www.acmicpc.net/problem/16234

 

16234번: 인구 이동

N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모

www.acmicpc.net

그래프 탐색을 통해 해결할 수 있는 문제다. 너비 우선 탐색으로 진행했다.

 

풀이

지도를 탐색하면서 인접 배열과의 인구수를 비교, 조건에 맞다면 큐에 담아낸 뒤 마지막에 큐에 담겨있는 좌표를 확인하면서 값을 갱신한다. 문제에서는 몇 차례의 변동이 일어났는지 횟수를 요구하기 때문에 반복문으로 수행한 뒤 Bool 타입의 flag 변수를 사용하여 종료 여부를 확인하였다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[9019] DSLR  (0) 2022.11.19
[9663] N-Queen  (0) 2022.11.17
[15685] 드래곤 커브  (0) 2022.11.15
[14500] 테트로미노  (0) 2022.11.14
[21610] 마법사 상어와 비바라기  (0) 2022.11.11

+ Recent posts