이번 문제는 0레벨에 있는 문제 시리즈 중 하나인데 최근 푼 문제 중에 가장 재밌었다. 문제 가장 먼저 7조각의 피자를 인원 수에 딱 맞게 시킬 경우와 그렇지 않은 경우를 판단해야 했다. 7의 배수라면 7*X와 같이 총 조각 수가 나오게 될 것이고, 피자는 X판을 주문하면 됐다. 나머지 경우는 한 판을 여유롭게 시켜야 했다. 그런데 이렇게 생각할 경우 n이 7 미만일 때가 애매했다. 풀이 그래서 인원 수에 맞게 주문할 경우와 아닌 경우는 %연산자를 통해 7의 배수인지 확인했고, 나머지 경우에서 주문할 피자 수를 구할 때는 n을 7로 나눈 몫을 사용하면 n이 7 미만이어도 이미 +1을 해두었기 때문에 문제가 없었다.
오랜만에 코딩 문제를 풀어보려하니 생각보다 머리가 안 돌아간다. 그래서 다시 낮은 레벨부터 시작해보기로 했다. 문제 풀이 먼저 1부터 입력된 n까지 반복문을 통해 홀수를 찾는 것을 목표로 했다. 이 때, 반복문을 1부터 n번 반복할 필요는 없다고 생각했다. 홀수 찾기가 목표이기에 2씩 건너뛸 방법을 찾아보았다. 내가 찾은 방법은 for문에서 step을 사용해 해결할 수 있었다. 그 다음 찾은 홀수를 어떻게 배열에 담을까 고민하다 이전에 List를 Array로 만들어 리턴해 주기로 했다. List를 사용한 이유는 Array의 크기는 수정할 수 없고, for문 안에 사용된 i를 통해 간단히 Array의 index에 접근하기에는 무리가 있었다. 문제에서 Array를 오름차순으로 리턴하라고 했지만 for문을 1..
안드로이드에서 사용하는 확장자로는 apk와 aab가 있다. 오늘은 apk에 대해 먼저 소개해보려 한다. apk라는 확장자를 많이 들어본 사람도 있을 것이다. 몇 년 전 다들 아직 저작권이란 개념이 많이 없었던 시기에 여기저기 소위 말하는 크랙 파일들이 많이 돌아다녔다. 유료 게임의 크랙 버전이나 무료 게임이라도 재화가 무제한으로 주어지는 등의 크랙 파일이 기억에 남는다. 물론, 그런 출처가 불분명한 파일들을 다운로드 받는다는 것 자체가 해킹의 표적이 될 수 있다는 사실도 다들 간과했을 것이다. 나는 께림칙해서 기피했지만 말이다. 다시, 본론으로 돌아가 APK에 대해 알아보자. APK(Android Application Package)는 하나의 완성된 앱이라고 할 수 있다. APK의 생성과정을 살펴보면 이..
오늘은 레벨1에서 정답률이 높은 편에 있던 문제를 풀어보았다. 문제 이 문제는 문자열 길이만큼 반복문을 사용해 각 자리가 숫자인지 판별하고 숫자가 아니면 false를 숫자이면 true를 반환하면 되는 문제였다. 풀이 이 문제에서 반복문을 사용할 때 라벨을 사용해보았다. 주어진 s의 길이만큼 반복하며 숫자인지 확인하고 숫자가 아니라면 break를 사용해 반복문을 종료하기 위해 라벨을 loop라는 이름으로 지어줬다.
오늘은 오랜만에 문제를 풀어보게 되었는데 사실 이 문제를 풀면서 또 다시 공식 문서의 중요성을 깨닫게 되었다. 문제 사실 굉장히 간단한 문제라고 생각했다.(공식 문서의 중요성은 조금 뒤에 말해보겠다) 일반적인 경우, 전달된 배열을 리스트로 바꾸고 최솟값을 제거한 뒤 다시 배열로 만들어 리턴하면 되고, 배열의 길이가 1인 경우 곧바로 -1만 들어있는 배열을 만들어 리턴하면 된다. 풀이 최종 정답을 받은 풀이는 위 사진의 코드이다. 하지만, 이전 코드는 약간 달랐다. 차이점도 있었고, 에러가 났던 부분도 설명해보겠다. class Solution { fun solution(arr: IntArray): IntArray { var answer = intArrayOf() if (arr.size == 1) answe..
1. 옵셔널의 개념 값이 있을수도, 없을수도 있음을 표현한다. nil이 할당될 수 있는지 없는지 여부의 표현이다. 2. 옵셔널을 쓰는 이유 - nil의 가능성을 코드만으로 표현할 수 있다. - 문서/ 주석 작성 시간을 절약할 수 있다. - 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용할 수 있다. - 예외 상황을 최소화하는 안전한 코딩 기법이다. 3. 옵셔널 문법과 선언 옵셔널 문법은 enum + generics 라고 한다. enum Optional: ExpressibleByNiliteral { case none case some(Wrapped) } let optionalValue: Optional = nil let optionalValue: Int? = nil 나는 지금까지 자바나 코틀..
1. for-in 기존 언어의 for each문과 유사하다. Dictionary의 경우, iteration 아이템으로 튜플이 들어온다. var integers = [1, 2, 3] for (integer in integers) { print(integer) } let people = ["kim": 20, "lee": 35, "park": 50] for (name, age) in people { print("\(name), \(age)") } 2. while, repeat-while 먼저 while문은 사용형태가 이전 조건문에서의 차이점 정도만 다르고 방법은 같다. repeat-while문은 do-while과 형태와 동작이 비슷하다. while integers.count > 2 { //실행문 } repea..
1. if-else 먼저 if-else문은 다른 언어와 차이점이 거의 없었다. 내 관점(Kotlin을 주로 하던)에서 보면 차이점이 있었다. 먼저, if나 else if문을 사용 시 Kotlin에서는 조건문에 무조건 괄호를 사용해야 했는데 Swift에서는 선택 사항이었다. 또, Kotlin에서는 실행문이 1줄이라면 중괄호 "{}"를 생략할 수 있었는데 Swift에서는 불가능했다. 2. switch 기본적으로 사용하던 정수 값만 비교하는 것이 아니라 대부분의 Swift 기본 타입을 지원한다. 각각의 case 내부에는 실행 가능한 코드가 반드시 위치해야 한다. 대부분의 상황에서 default문도 작성해주어야 한다. 명시적 break가 필요없이 자동으로 case 내부의 실행문이 종료되면 break가 실행된다...
1. 파라미터 기본값 파라미터에 기본으로 전달될 값을 미리 지정해둘 수 있다. 여기서 기본값을 지정할 파라미터는 파라미터 목록 중 뒤쪽에 위치하는 것이 좋다고 한다. func 함수 이름(파라미터 이름: 파라미터 타입, 파라미터 이름: 파라미터 타입 = 파라미터 기본값) -> 리턴 타입 { //함수 구현 return 리턴값 } //게다가 함수 호출 시 기본값이 있는 파라미터는 생략이 가능하다 2. 전달인자 레이블(Argument Label) 사용자 입장에서 함수 호출 시 파라미터 역할을 더 명확히 알 수 있도록 할 때 사용한다. 전달인자 레이블을 변경해 동일한 이름의 함수를 중복으로 생성 가능하다. 이 부분이 제대로 이해가 안됐는데 밑에 코드로 다시 적어보겠다. func 함수 이름(전달인자 레이블 파라미터..