
Strong, Weak, Unowned? 이 세가지 키워드는 모두 참조에 관한 키워드입니다. Strong , Weak 는 단어만 봤을 땐 뭔가 강하고 약한 것을 의미하는 것 같은데요, Unowned 는 어떤 의미인지 감이 잘 안잡히기도 합니다. 이번에는 세 키워드가 하는 역할과 차이에 대해 알아보려 합니다. Strong 말 그대로 "강한" 참조를 의미합니다. 앞서 Unowned ARC에 대한 포스팅에서 ARC 라는 것은 메모리 할당과 해제를 자동으로 해주는 Swift의 기능 이라고 설명한 적이 있는데요. 그러면서 ARC가 증가할 때가 바로 S
| 2022-03-13 23:12:00
ARC? ARC 는 Auto Reference Counting , 즉 "자동으로 메모리를 관리해주는 친구!" 라고만 알고 있었습니다. 이번 기회 ARC 에 대해 더욱 자세하게 알아보려 합니다. Swift 문서에서는 ARC 를 이렇게 소개합니다. Swift는 ARC를 사용하여 앱의 메모리 사용량을 추적하고 관리합니다. ... ARC는 해당 인스턴스에서 사용하는 메모리를 자동으로 해제합니다. 너무나 정직한 이름을 가진 친구입니다... 그 아래 AR
| 2022-03-03 09:46:00
Codable 이란? 자신을 외부 표현으로 또는 외부 표현으로 변환할 수 있는 형식입니다. Apple Developer에서는 Codable 을 위와 같이 설명한다. 여기서 외부 표현(External Representation)의 좋은 예로 JSON 형태의 파일이 있을 수 있다. Codable = Decodable & Encodable
추가로 위와 같이 정의 되어있는데,
| 2022-02-20 21:39:00
defer의 실행 순서 defer 는 코드의 실행 순서에 관여하는 기능이니만큼 규칙을 확실하게 인지하고 있어야한다. - 기본적으로 defer 는 선언된 역순으로 실행되는 Stack 형식이다. - 현재 코드 블록을 빠저나가기 전에 실행된다. func Print() {
defer {
print ( "첫번째 defer" )
}
defer {
| 2022-02-13 20:58:00
defer 이란? defer 가 무엇인지에 대해 간단히 알아보려한다. 자주 쓰는 기능은 아니지만 적절한 상황에 사용하면 유용할 것 같다. 기본적으로 defer 은 현재 코드 블럭을 나가기 전에 꼭 실행하게 도와주는 기능이다. func Print() {
defer {
print ( "Print 함수 끝나요~" )
}
print ( "헬로 월드!!" )
}
| 2022-02-10 00:15:00
init과 Convenience init의 차이 Swift에서 초기화는 2가지 종류가 있다. 지정 초기화인 init , (Designated init이라고도 한다.)와 Convenience init 이다. init 은 클래스의 모든 프로퍼티가 초기화 되어야 한다는 특성이 있다. class Student {
var name: String
var age: Int
| 2022-02-04 23:49:00
Struct VS Class 이 포스팅에서는 Struct 가 무엇인지, Class 가 무엇인지 보단 해당 질문의 의도인 차이점에 포커스를 두고 정리해 보았다. 대표적인 차이점으로는 Struct 는 값 타입 , Class 는 참조 타입 이라는 것이다. Call By Value (값 타입) 값 타입은 데이터를 전달할 때 값을 복사하여 전달하며 원본은 그대로 유지된다. struct Point {
var x = 0.0
| 2022-01-23 20:22:00
Safe Area란 ? iOS 11이 되며 기존의 topLayoutGuide , bottomLayoutGuide 를 대신해 나오게 되었다. 이는 iPhone X 가 출시되며 노치가 생겼기 때문이기도 한데 아래 그림을 보면 이해가 빠르다. 사진과 같이 iPhone 8 에 있던 홈버튼이 없어지면서 iPhone X 에서 휴대폰은 돌렸을 때 하단부분에 여백이 생기게 된것이다. 위 그림의 회색부분이 Safe Area 이다. 녹색 부분에 상태바, 내비게이션바, 탭바 등이 위치하게 돼도 View가 가려지지 않기 위해 제공되는
| 2022-01-19 21:28:00
StoryBoard? UIKit으로 iOS 프로젝트를 개발 시 UI를 개발하는 방법으론 StoryBoard 또는 Code로 개발 , 총 2가지 방법이 있다. (이 2가지를 섞어 쓰는 경우도 많다.) UIKit으로 많은 프로젝트를 해보진 않았지만 StoryBoard로 예제를 만들어본 결과 단점이 매우 명확하게 느껴졌다. 먼저, 가독성이 떨어진다는 점이다. 뷰가 여러개가 되거나, 한 화면에 많은 오브젝트들이 배치될 시 그들을 한눈에 파악하기가 힘들었다. 두 번째로는 재사용성이 떨어진다는 점이다. 뒤로가기 버튼이나 확인 버튼 등 중복해서 사용될 여지가 있는 오브젝트들을 StoryBoard로 만들게 되면 재사용하기가 매우 어렵다.
| 2022-01-14 22:48:00
Priority StoryBoard 에서 오브젝트를 클릭하면 위 사진과 같이 두개의 Priority 를 설정할 수 있다. Hugging Priority 우선순위가 높으면 내 크기는 유지. 우선순위가 낮으면 내 크기를 늘림. 위 사진과 같은 상황이라 가정해보자. 두 Label이 있는데 width를 지정해주지 않고 leading, trailing, top만 지정해줬다면 사진과 같은 오류를 볼 수 있을 것이다. 두 Label사이의 거리를 10이라 지정해준다면 공간이 비는데, Hugging Priority 가 같으니 어떤
| 2022-01-09 22:12:00
AutoLayout? AutoLayout 은 뷰 계층 구조에 있는 모든 뷰의 크기와 위치를 뷰에 배치된 제약 조건에 따라 동적으로 계산하는 것이다. StoryBoard 에서 AutoLayout 을 사용하는 방법은 위 사진과 같다. 가시적으로 보기 쉽다는 장점이 있지만, 동적으로 생성되는 객체와 같은 경우엔 코드로 AutoLayout 을 작성해야만 한다. 코드로 AutoLayout 을 작성하는 방법은 NSLayoutConstraint , Layout Anchor ,
| 2022-01-08 21:12:00
URLSession? 애플에서는 URLSession을 아래와 같이 설명한다. 관련된 네트워크 데이터 전송 작업 그룹을 조정하는 개체입니다. URLSession 은 iOS에서 제공하는 HTTP를 이용한 네트워킹을 통해 데이터를 주고 받을 수 있게 도와주는 API를 제공하는 클래스이다. URLSession 은 Thread-Safty 하기 때문에 어떤 스레드에서든 자유롭게 Session 과 Task 를 생성할 수 있다. URLSession 은
| 2022-01-06 13:46:00
NotificationCenter란? 등록된 관찰자에게 정보를 브로드캐스트할 수 있도록 하는 알림 디스패치 메커니즘입니다. 쉽게 말해 NotificationCenter 는 객체로부터 어떤 이벤트를 받아 자신에게 등록된 객체들에게 알림을 보내주는 객체이다. NotificationCenter 는 싱글톤으로 구성되어 있어 사용자가 인스턴스를 만들지 않고 NotificationCenter 를 부를 수 있다. 아래는 예제를 살펴보기 전에 먼저 알아둬야하는 내용이다. - NotificationCenter
| 2022-01-01 22:40:00
Foundation Kit이란? 필수 데이터 유형, 컬렉션 및 운영 체제 서비스에 액세스하여 앱의 기본 기능 계층을 정의합니다. Foundation 프레임워크는 코코아 터치 프레임 워크에 포함된 프레임 워크이자, 원시 데이터 타입, 컬렉션 타입 및 운영체제 서비스를 사용해 애플리케이션의 기본적인 기능을 관리 하는 프레임워크이다. 몇 가지 Foundation 의 기능들에 대해 알아보자. Fundamentals Number, Data, and Basic Values : 기본적인 변수 타입
| 2021-12-29 20:49:00
UIKit 이란? iOS 또는 tvOS 앱용 그래픽 이벤트 기반 사용자 인터페이스를 구성하고 관리합니다. iOS 앱 을 만들고, User Interface 를 구성하는 데 필수적인 프레임워크가 바로 UIKit 이다. UIKit이 하는 역할은 크게 2가지로 나뉘는데 User Interface , User Interactions 이 있다. User Interface View and Control: 화면에 컨텐츠 표시 View Controller: UI 관리
| 2021-12-26 22:40:00
멀티 스레딩 멀티 스레딩은 여러개의 프로세스를 동시에 실행하는 것을 의미한다. 대표적인 예로 로딩 애니메이션과 데이터를 불러오는 두 개의 프로세스가 동시에 처리 되어야하는 경우가 있다. Swift에서는 멀티 스레딩 을 처리하기 위해 GCD 와 Operation , 총 2가지 API를 제공한다. GCD GCD 는 Grand Central Dispatch의 약자로 멀티 코어, 멀티 프로세서 환경에서 프로그래머가 보다 편리하게 개발을 할 수 있도록 애플에서 개발한 기술이다. Swift에서는 DispatchQueue 로 사용할 수 있다. DispatchQueu
| 2021-12-24 16:53:00
App Life Cycle 상태 변화에 따라 다른 동작을 처리하기 위한 App Delegate Method 들이 있다. Foreground & Background 포스트에서 앱의 상태에 대해 공부해본 적이 있었다. 이번에는 각각의 앱의 상태에 따른 동작을 처리하기 위한 함수들에 대해 알아보자. 앱이 처음 실행될 때 func application( _ application: UIApplication , didFinishLaunchingWithOptions launc
| 2021-12-21 09:37:00
App State Foreground 와 Background 는 앱의 상태를 뜻한다. 앱은 크게 5가지 상태를 가지는데, not Running , Inactive , Active , Background , Suspend 가 있다. not Running : 앱이 실행되지 않은 상태 Foreground 상태 Inactive : 앱이 실행중이지만 아직 아무런 이벤트를 받지
| 2021-12-19 22:48:00
Swift에서 @main이 뭘까? 모든 프로그램에는 항상 앱이 시작되어야 하는 진입점이 있으며 Swift도 예외는 아니다. 마치 c언어의 main함수 같이 말이다. 예전에는 아래와 같이 main.m 파일이 그 진입점 역할이었다. // main.m
int main (int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain (argc, argv, nil
| 2021-12-17 22:22:00
App Thinning이 뭐지? WWDC 15에 App Thinning in Xcode 세션이 소개됐다. WWDC 15 면접 준비가 아니었다면 볼 일이나 있었을까.. 하는 생각이 들만큼 처음 들어보는 녀석이다. App Thinning in Xcode 은 쉽게 말해 설치 최적화 기술을 의미한다. 그 안에는 Slicing , Bitcode , On-Demand Resource 가 있는데 하나하나 알아보자.
| 2021-12-16 00:12:00
앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체? 바로 UIViewController 가 그 역할을 한다. 애플에서는 UIViewController를 아래와 같이 설명한다. UIKit 앱의 뷰 계층 구조를 관리하는 개체입니다. 뷰 컨트롤러는 앱 내부 구조의 기초이다. 모든 앱에는 적어도 하나의 ViewController 가 있으며 대부분의 앱에는 여러개의 ViewController 가 있다. 각 뷰 컨트롤러는 인터페이스와 기본 데이터 간의 상호작용을 관리한다. 앱에서 매우 중요한 역할을 하기 때문에
| 2021-12-12 22:18:00
UserDefaults와 CoreData로 디바이스에 데이터를 저장해보자. UserDefaults 와 CoreData 는 둘 다 디바이스에 데이터를 저장할 수 있는 기능을 제공해준다. 둘의 차이점 과 장단점 , 사용방법 에 대해 간단히 정리해보자. UserDefaults? 애플의 개발자 문서를 참고하면 앱을 실행하는 동안 지속적으로 키-값 쌍을 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스입니다. 이라 정의되어있다.
| 2021-12-11 23:18:00
Xcode Simulator 앱을 개발하다 보면 실 기기대신 시뮬레이터 를 통해 테스트하는 경우가 대다수였다. 시뮬레이터 의 한계는 어디까지일까? 시뮬레이터의 한계 사실 상식적으로 생각해보면 시뮬레이터 에서 되는 할 수 있는 것과 없는 것을 나누는 것이 하드웨어 센서 라는 것을 쉽게 알 수 있다. 애플 공식 개발 문서
위 주소를 통해 공식 문서를
| 2021-12-08 00:11:00
Bounds와 Frame의 차이는? Bounds 와 Frame 는 기본적으로 좌표 시스템을 나타내는 UIView 의 프로퍼티이며 CGRect 를 상속받고 있다. Bounds? 애플의 개발자 문서를 참고하면 자체 좌표계에서 뷰의 위치와 크기를 설명하는 경계 사각형. 이라 정의되어있다. Bounds 의 핵심은 자체 좌표계 라는 것에 있다. Bounds 는 왼쪽 상단을
| 2021-12-05 22:18:00
문제 학생들의 평균을 구하는데, 학생 자기 자신이 평가한 점수가 가장 높거나 가장 낮을 땐 해당 점수를 제외하고 평균을 구하는 문제. 문제 링크 문제 해결 순서 x, y 좌표를 저장할 front, back 배열을 선언. 반복문을 돌며 arr i 번째를 front에, arr i 번째를 back에 저장하는데 이미 있는 값이면 해당 값을 제거하고 저장하지 않는다. 직사각형이 되려면 같은 좌표가 2개씩 있어야 한다는 점을 이용. ex) [1, 3] [1, 6] [4, 3] [4, 6] -> 1 두개, 3 두개, 6 두개, 4 두개
| 2021-08-12 19:20:00
스프링이란? 스프링은 프레임워크이다.
Frame - 틀, Work - 일하다. 즉 틀안에서 일하다, 뼈대를 가지고 일하다. 라는 뜻이다.
예를들어 장난감 키트를 생각해보자, 우리는 직접 플라스틱을 자르거나 나무를 다듬어 장난감을 만들 수도 있지만
그 보다 더 편리하게 시중의 장난감 키트를 이용할 수 있다.
이 처럼 여러 메뉴얼과 규약을 정해 쉽게 개발의 생산성과 품질을 높이는 역할을 하는 것이 프레임 워크이다.
- 스
| 2021-08-11 19:29:00
문제 다섯 개의 자연수가 있다. 이 수의 적어도 대부분의 배수는 위의 수 중 적어도 세 개로 나누어 지는 가장 작은 자연수이다. 서로 다른 다섯 개의 자연수가 주어질 때, 적어도 대부분의 배수를 출력하는 프로그램을 작성하시오. 문제 해결 순서 다섯 개의 자연수 중에서 적어도 3개의 자연수의 최소공배수 중 가장 작은 수를 구하는 문제. 유클리드 호제법을 사용해 최대공약수와 최소공배수를 구하는 함수를 만듦. 브루트 포스로 모든 경우의 수를 탐색하며 가장 작은 최소공배수를 구해냄. import java.util. Scanner ;
public class test2 {
| 2021-06-24 19:29:00
문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다. 한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다. 맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오. 문제 해결 순서 처음엔 손에 익은 dfs(깊이 우선 탐색으로 풀었다.) 벽을 부셨을 때를 boolean으로 넘겨줘서 탐색하는 방식을 썼다. 결과는 시간초과... 최악의 경우를 못
| 2021-04-25 19:29:00
문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오. 문제 해결 순서 시작과 끝을 가르키는 s, e 변수를 선언한다. 끝을 늘려가며 합을 구해 S보다 큰 지 검사 크다면 (끝 - 시작) 값을 정답에 넣고, 시작 포인터를 +1 해주고, 합에서 현재 시작값을 빼줌. 끝이 범위를 벗어나거나 시작이 범위를 벗어나면 종료. import java.util. Scanner ;
public class Main {
| 2021-04-17 19:29:00
문제 이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다. 조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오. 문제 해결 순서 조규현의 좌표를 기준으로 류재명이 있을 수 있는 점을 쭉 이어 그리면 하나의 원이 된다. 마찬가지로 백승환의 좌표를 기준으로 류재명이 있을 수 있는 점을 쭉 이어 그리면 하나의 원이 된다. 그럼 두 원의 접점이 류재명이 있을 수 있는 위치가 된다. 6가지의 경우의 수로 나눠 계산했다. (주석 참고)
| 2021-04-14 19:29:00
문제 지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다. 각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오. 문제 해결 순서 처음 아이디어가 맞았는데 while문 안에 크레인이랑 박스 개수만큼 이중 for문을 돌아서 시간초과남. while문 하나로 idx(크레인 카운트), tmp(박스 카운트) 두개를 컨트롤 하는게 포인트. 추가적으로 처음엔 박스의 무게를 1000001로 바꿔서 옮김을 체크했는데 박스를 리스트로 바꿔 옮긴 박스는 삭제해버림.
| 2021-03-19 19:29:00
문제 첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 물어봐도 괜찮아. 나는 언제든지 질문에 답해줄 준비가 되어있어. 둘째 줄부터 N개의 줄에 포켓몬의 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬까지 한 줄에 하나씩 입력으로 들어와. 포켓몬의 이름은 모두 영어로만 이루어져있고, 또, 음... 첫 글자만 대문자이고, 나머지 문자는 소문자로만 이루어져 있어. 포켓몬 이름의 최대 길이는 20이야. 그 다음 줄부터 총 M개의 줄에 내가 맞춰야하는 문제가 입력으로 들어와. 문제가 알파벳으로만 들어오면 포켓몬 번호를 말해야 하고, 숫자로만 들어오면, 포켓몬 번호에 해당하는 문자를 출력해야해. 입력으로 들어오는 숫자는 반드시 1보다 크거나 같고, N보다 작거나 같고, 입력으로 들어오는 문자는 반드시 도감에
| 2021-03-15 19:29:00
문제 김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오. 문제 해결 순서 처음엔 n, m 각각의 개수만큼 숫자를 저장하는 리스트를 생성해서 자바의 Contains클래스를 활용했다. 위 방법은 어떻게 써도 시간초과가 떠서 실패함. 2번째 방법으로 n + m 만큼 반복하며 하나의 리스트에 전부 저장한 후 리스트를 정렬. 정렬된 리스트를 돌며 i번째와 i + 1번째가 같다면 sb에 추가하고 count를 증가시켜줌. 위 방법은 통과했는데, 자바의 Contains는 그리 빠른 클래스가 아닌가보다. sort가 더 빠른듯. import java.io.*;
impo
| 2021-03-10 19:29:00
문제 널리 잘 알려진 자료구조 중 최소 힙이 있다. 최소 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오. 배열에 자연수 x를 넣는다.
배열에서 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
### 문제 해결 순서
1. 자바에서 제공하는 우선순위 큐 클래스를 사용함.
2. 입력받은 값이 0이고 큐가 비어있으면 0을 출력, 큐가 비어있지 않으면 맨 앞의 값을 출력하고 삭제.
3. 입력받은 값이 0이 아닌 자연수라면 큐에 삽입.
4. 우선순위 큐까지 구현하는게 맞을까..? 아니면 있는 클래스 가져다 쓰는게 좋을까..?
```java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws
| 2021-03-08 19:29:00
문제 n×m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오. 0 1 0 0
0 1 1 1
1 1 1 0
0 0 1 0
위와 같은 예제에서는 가운데의 2×2 배열이 가장 큰 정사각형이다. 문제 해결 순서 dp 유형의 문제. 점화식을 최대한 빠르게 알아내기 위해선 무조건 반대로 생각하기. 메모이제이션 배열이 존재한다는 것을 잊지않기. 2, 3번에 따라서 배열 맨 마지막 부터 차근차근 생각해보자... 왼쪽에서 오른쪽으로, 위에서 아래로 배열을 탐색하기 때문에 마지막인 오른쪽 아래에 주목. 예를들어 2 * 2 정사각형에서 (1, 1)에 메모이제이션의 값을 넣기 위해선 (0, 0), (0, 1),
| 2021-03-03 19:29:00
Access Controll 이란? 먼저 접근제한자 (Access Controll) 이란,
접근제한자는 다른 소스 파일이나 모듈이 코드로 접근하는 것을 제하는 것이다.
이렇게 함으로써, 우리는 코드의 세부 구현 사항을 숨길 수 있다 (은닉화)
접근제한자는 클래스, 구조체 및 열거와 같은 개별 타입과, 해당 타입에 속하는 프로퍼티, 메소드, 이니셜라이저에 사용할 수 있다.
### Access Controll의 종류
접근제한자의 종류로는 `open, public, internal, fileprivate, private` 이렇게 총 5개가 있다.
- open : 모듈 외부에서 access가능 (Class만 사용 가능)
- 일반적으로 Framework에 공용 인터페이스를 지정할 때 사용
- public : open과 동일, 하지만 외부 상속 불가 & class 멤버 override 불가
- 일반적으로 Framework에
| 2021-02-28 19:29:00
Swift의 3가지 컬렉션 타입 먼저 컬렉션 타입이란. 컬렉션 타입은 데이터들의 집합이라 할 수 있다. Swift에서 컬렉션 타입이란 지정된 타입의 데이터들의 묶음이다. 굳이 지정된 타입이라고 하는 이유는 Swift에서는 컬렉션 타입들이 모두 제네릭 컬렉션으로 구현되어 있기 때문이다. 제네릭(Generic)이란 제네릭이란 컬렉션 타입에 여러가지 데이터 타입들을 담을 수 있도록 지정할 수 있다는 의미이다.
튜플처럼 하나의 컬렉션 타입에 여러개의 데이터 타입들을 담을 수 있다는 것은 아니고 하나의 컬렉션 타입은 하나의 데이터 타입만을 담을 수 있다.
### 컬렉션 타입의 종류
#### 배열 (Array)
Swift에서 배열은 같은 데이터 타입의 값들을 순서대로 저장하는 리스트이다.
그리고 배열은 중복 값을 저장할 수 있는데 어차피 순서가 정해져 있어서 구분할 수 있기 때문이다.
#### 세트 (Se
| 2021-02-28 19:29:00
Swift의 Tuple 먼저 Tuple은 Collection Type이 아니다. Collection Type에는 Array, Dictionary, Set만이 있다. 그래도 Type이긴 하다. Tuple은 구조체와 비슷하다. var tuple = (1, "Hello, world!", true) 이런식으로 여러가지 타입을 한꺼번에 묶어서 사용할 수 있다. 여기서 Tuple도 타입이기 때문에 Tuple안에 Tuple도 가능하다. Tuple 사용방법 실제로 다른 컬렉션 타입이나 구조체 때문에 Tuple을 쓸 일은 거의 없다.
그래도 사용방법에 대해 알아보자.
```Swift
var tuple = (1, "Hello, world!", true)
tuple.0 // 1
tuple.1 // "Hello, world!"
```
이런식으로 인덱스만 찍어주면 바로 값에 접근이 가
| 2021-02-28 19:29:00
SwiftUI List SwiftUI에서 기본으로 제공해주는 DisclosureGroup이 있지만 커스텀에 제약이 많다... 직접 DropDown을 만들어 여러 속성을 추가해서 커스텀할 수 있도록 짠 코드이다. expand변수를 통해서 box를 열었을 때, 닫았을 때를 체크해줬다. 그리고 .animation(.spring()) 로 애니메이션도 추가할 수 있다. DropDown struct struct DropDown : View {
@State var expand = false
var body:
| 2021-02-28 19:29:00
SwiftUI HexColor SwiftUI에서 Hex 코드로 Color를 지정해야 할 때가 있다. (ex: fbfbfb, bbbbbb)
SwiftUI 자체적으로는 Hex 코드로 Color를 지정할 수 없기 때문에 extension을 통해 따로 포팅 해줘야한다.
아래는 Color.init(hex: String) 코드이다.
### HexColor.swift
```Swift
import SwiftUI
extension Color {
init(hex: String) {
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int: UInt64 = 0
Scanner(string: hex).scanHexInt64(&int)
let a, r, g, b: UInt64
switch hex.count {
| 2021-02-28 19:29:00
SwiftUI List SwiftUI에서 List Struct를 사용하다 보면 분리선을 없애고 싶을 때가 있다.
구글링하면 버전별로 수많은 방법이 나오는데 가장 깔끔한 방법을 찾은 것 같다.
### NoSeparatorList
```Swift
struct NoSeparatorList : View where Content: View {
let content: () - Content
init(@ViewBuilder content: @escaping () - Content) {
self.content = content
}
var body: some View {
if #available(iOS 14.0, *) {
ScrollView {
LazyVStack(spacing: 0) {
self.co
| 2021-02-28 19:29:00
SwiftUI List SwiftUI에서 ModalView를 띄우는 가장 쉬운 방법이다.
FullScreen Modal밖에 띄우지 못한다는 것이 단점이지만, ios에서 제공하는 가장 안정적인 view이기도 하고 여러 부가 옵션을 사용할 수 있다는 장점이 있다..
### ModalView
```Swift
Button(action: {
// some action...
}, label: {
// some label...
})
.sheet(isPresented: self.$showModal, content: {
// some modalview content
})
```
Button 속성으로 위와 같은 코드를 적어주면 된다.
content안에 적은 코드가 ModalView로 보이게 된다.
| 2021-02-28 19:29:00
SwiftUI RestAPI GET으로 json 데이터 받기 SwiftUI에서 RestAPI를 통해 json 데이터를 받아서 처리해야할 때 사용한 코드이다. RestAPI GET통신 import SwiftUI
class ProgramCardViewModel: ObservableObject {
init () {
fetchPrograms ()
}
let url = "http://localhost
| 2021-02-28 19:29:00
SwiftUI SideMenu SwiftUI로 사이드메뉴를 구현한 간단한 예제이다. 기본적으로 SideMenuView.swift와 그 안에 표시해줄 MenuButtonView.swift 두 파일이 있으며, SideMenuView는 ZStack으로 메인 화면에 보여주게 된다. MainView.swift struct MainView: View {
// 사이드 메뉴를 열고 닫음을 저장할 변수
@State var sideMenuBarToggle: Bool = false
| 2021-02-28 19:29:00
SwiftUI Singleton 싱글톤 패턴이란 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 지금같은 경우는 로그인한 유저의 정보를 관리하기 위해 싱글톤 패턴을 사용했다. Singleton.swift class Singleton{
static let sharedInstance = Singleton ()
var LoginUser = User (id:
| 2021-02-28 19:29:00
SwiftUI OpenAPI XML 파일 공공데이터 포털에서 OpenAPI를 사용하려고 보면 json말고 XML로 값을 리턴해주는 api가 꽤 있다. json은 Key, value로 값을 가져오면 되지만. XML은 태그를 구분에 데이터 값을 가져오는 방식인 것 같다. hospitalViewController.swift class FetchData: NSObject , XMLParserDelegate {
// 코로나 선별 진료소를 담을 배열
var hospitals: [ Hospital
| 2021-02-28 19:29:00
문제 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다) 예를 들어, 그림이 아래와 같은 경우에 RRRBB GGBBB BBBRR BBRRR RRRRR 적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1) 그림이 입력으로 주어졌을
| 2021-02-28 19:29:00
문제 호텔의 층 수 H, 각 층의 방 수 W, 몇 번째 손님 N을 입력받아 N번째 손님에게 배정되어야 하는 방 번호을 출력하는 문제 손님은 정문 엘레베이터와 가까운 방을 우선으로 선호하며 엘레베이터로 이동하는 거리는 신경쓰지 않음 즉, 102호 보다 301호를 선호 문제 해결 순서 T를 입력받아 몇개의 테스트 데이터를 입력받을지 정함 손님을 배정하는 순서는 층 -> 다음 호수의 방 순서 (3층일 경우, 101, 201, 301, 102, 202, 302...) N % H 로 몇 번째 층에 배정되어야 하는지 구함. 만약 '0'이면 꼭대기 층이라는 뜻이므로 H 로 초기화 N / H + 1 로 몇 번째 순서에 있는 방인지 구함. 첫 시작을 101호로 시작하기 때문에 1을 더해줌
| 2021-02-28 19:29:00
문제 첫 번째줄에 정수 n이 주어짐 이후 n개의 줄에 정수 1개씩 주어지는데 정수가 '0'일 경우 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 씀 최종적으로 적은 수의 합을 출력 문제 해결 순서 입력받은 수를 저장할 list를 생성 n만큼 반복문을 돌면서 정수를 입력 입력받은 정수가 0이면 list의 마지막 원소를 삭제 0이 아니라면 list에 add() list의 원소를 모두 더해서 출력 import java.util. ArrayList ;
import java.util.
| 2021-02-28 19:29:00
문제 나이와 이름이 한 세트인 정보가 입력되면 그 정보를 나이순, 나이가 같다면 입력순으로 정렬하는 문제 문제 해결 순서 Person 클래스를 하나 만들어주고 반복문을 돌며 persons배열에 정보 저장 자바 Arrays.sort의 compre함수를 오버라이드해서 구현 나이가 같다면 이름순으로 출력하면 되기 때문에 나이만 검사 import java.util.*;
public class Main {
static class Person{
int age;
String name;
| 2021-02-28 19:29:00
문제 숫자카드가 N개 있고 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드가 몇 개 있는지 구하는 문제 문제 해결 순서 숫자카드에는 -10000000 ~ 10000000의 숫자가 적혀있기 때문에 배열의 길이를 넉넉하게 20000002로 초기화 N번 반복하며 숫자카드에 적힌 숫자번째의 배열 값을 + 1 M번 반복하며 입력된 숫자번째의 배열 값을 출력하면 숫자카드의 개수가 출력됨 import java.util. ArrayList ;
import java.util. Scanner ;
| 2021-02-28 19:29:00
문제 입력받은 숫자들 중 최소값과 최대값을 구하는 문제 문제 해결 순서 맨 처음 입력받은 숫자로 max, min을 초기화 n-1만큼 반복문을 돌면서 입력받은 숫자가 min보다 작으면 min = temp 입력받은 숫자가 max보다 크면 max = temp `java import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int temp = scan.nextInt(); int max, min; max = temp; min = temp; for(int i = 1; i < n; i++){ temp = scan.nextInt(); if(min &
| 2021-02-28 19:29:00
문제 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 다섯 가지이다. push X: 정수 X를 스택에 넣는 연산이다. pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다. size: 스택에 들어있는 정수의 개수를 출력한다. empty: 스택이 비어있으면 1, 아니면 0을 출력한다. top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다. 문제 해결 순서 맨 처음에 자바에 있는 스택을 사용하려 했으나 System.out.println 때문인지 시간초과가 떴다. StringBuilder을 사용하며 배열로 아예 Stack을 구현하기로 함. Stack이 뭔지 알
| 2021-02-28 19:29:00
문제 정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 여섯 가지이다. push X: 정수 X를 큐에 넣는 연산이다. pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. size: 큐에 들어있는 정수의 개수를 출력한다. empty: 큐가 비어있으면 1, 아니면 0을 출력한다. front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. 문제 해결 순서 배열로 구현. 길이가 정해져 있어서 다른건 생각안해도 됐다. 큐가 뭔지만 알면 쉽게 풀 수 있는
| 2021-02-28 19:29:00
문제 정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 여덟 가지이다. push front X: 정수 X를 덱의 앞에 넣는다. push back X: 정수 X를 덱의 뒤에 넣는다. pop front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. pop back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. size: 덱에 들어있는 정수의 개수를 출력한다. empty: 덱이 비어있으면 1을, 아니면 0을 출력한다. front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. back: 덱의 가장 뒤에 있는
| 2021-02-28 19:29:00
문제 N이 주어졌을 때, N번째 피보나치 수를 구하는 문제 문제 해결 순서 입력받은 N만큼 반복문을 돌며 피보나치 수의 규칙인, Fn = Fn-1 + Fn-2 (n>=2) 를 이용 import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
Scanner sca
| 2021-02-28 19:29:00
문제 정수 N의 팩토리얼을 출력하는 문제 문제 해결 순서 반복문을 돌면서 N번째까지 곱해준다. import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
Scanner scan = new Scanner (
| 2021-02-28 19:29:00
문제 N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오. 문제 해결 순서 그냥 통째로 외우자... depth를 인자로 받는 permutation 함수를 하나 선언 depth 가 N일 경우에 출력 아닐때 N만큼 반복하며 i번째 방문 -> 방문한 숫자 출력배열에 저장 -> depth + 1 해서 재귀 호출 -> i번째 방문 해제 4번에 4가지 스텝만 외우면 됨. import java.util. Scanner ;
class Main {
| 2021-02-28 19:29:00
문제 예제를 보고 규칙을 유추한 다음에 별을 찍는 문제 예제 링크 문제 해결 순서 총 n*2 번 반복하면서 n 만큼 출력하는데 별과 공백을 번갈아 출력하는 규칙 홀수 줄은 별 먼저, 짝수 줄에는 공백 먼저 출력 ( 1차 삽질 다른 경우는 다 이해되는데 1인 경우 별 하나 출력되는게 무슨 규칙인지 모르겠음.. 그냥 예외처리 함) `java import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt();
| 2021-02-28 19:29:00
문제 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 문제 문제 해결 순서 반복문을 돌면서 동전의 종류를 오름차순으로 입력받음 동전의 종류를 내림차순으로 반복문을 돌며 입력받은 가격이 동전의 종류보다 같거나 크면 나눠서 몫을 count에 더함 M에는 나머지를 넣고 반복한다. import java.util. Scanner ;
class Main {
public static void main (
| 2021-02-28 19:29:00
문제 자연수 N과 정수 K가 주어졌을 때 이항 계수를 구하는 문제 문제 해결 순서 nCk(조합)을 구하라는 뜻, 공식 : n! / (n-r)!r! 팩토리얼을 구하는 fac함수를 먼저 구현 공식에 맞게 출력 import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
Sca
| 2021-02-28 19:29:00
문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 문제 해결 순서 전형적인 DP 문제. 무엇을 메모이제이션 할 건 지, 어떤 규칙이 있는지 확인하는 것이 키 포인트. i번째는 그 이전 (0 ~ i-1)까지의 메모값 중 가장 큰 값 + 1이 된다. 처음엔 자꾸 바로 이전 값에서 규칙을 찾으려다 보니 안 찾아짐. (0 ~ i-1)까지 범위를 늘리는 것에 두려워하지 말것. import java.util.*;
c
| 2021-02-28 19:29:00
문제 널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오. 배열에 자연수 x를 넣는다.
배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
### 문제 해결 순서
1. 자바의 우선순위 큐 클래스를 사용
2. 선언시 Collections.reverseOrder()를 추가하면 큰 값이 앞에 오게끔 정렬됨.
```java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Priorit
| 2021-02-28 19:29:00
문제 ATM에 줄을 서있는 사람의 수 N과 각 사람이 돈을 인출하는 시간 P가 주어졌을 때, 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구하는 문제 문제 해결 순서 시간의 최솟값이 되려면 ATM에 줄 서있는 사람이 오름차순으로 정렬되어 있어야함 Arrays.sort() 를 이용해 입력받은 배열을 정렬한다 반복문을 돌면서 걸리는 시간을 하나씩 더하고 그 값을 answer 에 더한다 ([1] + [1+2] + [1+2+3] ...) import java.util. Scanner ;
import java.util.
| 2021-02-28 19:29:00
문제 2차원 평면 위의 점 N개가 주어질 때 좌표를 x가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 문제 문제 해결 순서 N만큼 반복하며 좌표를 입력받음 Arrays.sort() 를 이용해 배열을 정렬하는데, 내장함수 compare를 알맞게 오버라이딩 해줌 x좌표를 먼저 정렬하는데 이때, x좌표가 같으면 y좌표를 비교해서 정렬함 import java.util.*;
class Main {
public static void main (
| 2021-02-28 19:29:00
문제 2차원 평면 위의 점 N개가 주어졌을 때, 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순으로 정렬하는 문제 문제 해결 순서 먼저 x, y좌표를 가지고 있는 Location 클래스를 선언 Location 클래스에 Comparable 인터페이스의 compareTo 메소드를 오버라이드함 만약 y좌표가 같다면 x좌표를 오름차순으로, y좌표가 다르다면 y좌표를 오름차순으로 정렬 반복문으로 x, y좌표를 입력받고 Collections.sort() 를 통해 정렬 출력 후 마무리 import java.util. ArrayList ;
| 2021-02-28 19:29:00
문제 입력받은 N의 소인수분해 결과를 출력하는 문제 문제 해결 순서 x가 1이 될 때까지 반복문을 돔 2부터 x까지 반복문을 돌며 x % i == 0 이면 x의 소인수라는 뜻 i를 출력하고 x는 x / i 로 초기화 import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
| 2021-02-28 19:29:00
문제 비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오. add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
all: S를 {1, 2, ..., 20} 으로 바꾼다.
empty: S를 공집합으로 바꾼다.
### 문제 해결 순서
1. 자바의 List를 활용하여 구현함.
2. 1, 0을 출력해주는 부분을 `System.out.println`으로 구현하니 시간초과 뜸.
3. StringBuilder를 이용하여 출력함.
```java
impor
| 2021-02-28 19:29:00
문제 요세푸스 문제는 다음과 같다. 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 이다.
N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.
### 문제 해결 순서
1. 큐로 구현.
2. k번 poll해서 다시 큐에 삽입.
3. k번째는 출력하고 pop.
4. 큐에 값이 하나 남을 때까지 반복.
```java
import java.util.Scanner;
import java.util.LinkedList;
import java.util.Queue;
publ
| 2021-02-28 19:29:00
문제 주어진 (x, y)좌표에 해당하는 사분면을 출력하는 문제 (단, x와 y는 0이 아니다.) 문제 해결 순서 x가 0보다 크고 y가 0보다 클 때 -> 1사분면 x가 0보다 자고 y가 0보다 클 때 -> 2사분면 x가 0보다 작고 y가 0보다 작을 때 -> 3사분면 x가 0보다 크고 y가 0보다 작을 때 -> 4사분면 `java import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int x, y; x = scan.nextInt(); y = scan.nextInt(); if(x > 0 && y > 0){ Sy
| 2021-02-28 19:29:00
문제 파이프를 배열 끝으로 이동시키는 문제 문제 해결 순서 맨 처음 입력받은 숫자로 2차원 배열 arr을 초기화 (파이프 끝 부분만 생각하면 된다는 점이 포인트) 재귀함수 search() 를 만들어 각각의 조건에 맞으면 다시 search() 를 호출 isEscape() 함수를 통해 좌표값이 배열을 벗어나는지 import java.util. Scanner ;
class Main {
// 전역변수 선언
| 2021-02-28 19:29:00
문제 종강을 맞은 민준이는 고향인 마산으로 내려갈 계획을 짜고 있었다. 늘 그랬듯, 마산으로 갈 버스를 예약하려던 순간 민준이는 집으로 가는 다른 방법이 떠올랐다. 그것은 직접 지도를 보고 고향으로 가는 가장 짧은 길을 찾는 것이다. 그때, 먼저 고향으로 내려갔던 친구인 건우에게 연락이 왔다. 건우는 고향으로 내려가던 중 알 수 없는 일에 휘말려 외딴곳에 혼자 남겨지게 되었다. 건우는 유일한 구세주인 민준이에게 도움을 청한 것이었다. 그러나 마산의 남자인 민준이에게는 마산이 먼저였다. 민준이는 처량한 건우를 무시한 채 고향으로 떠나려고 했지만, 만약 고향으로 가는 길에 건우가 있다면 겸사겸사 도움을 줄 수 있을 것 같았다. 지도는 양방향 그래프 형태로 되어있다. 출발지는 1번 정점 마산은 V번 정점이다. 정점은 1~V까지 있다. 건우는 P번 정점에 있다. 그리고 항상 1번 정점에서 P번과 V번 정점으로 갈 수 있는 경로가 존재한다. 중복되는
| 2021-02-28 19:29:00
문제 N, M이 주어질 때 M학년이 뉴비라면 NEWBIE!, 올드비라면 OLDBIE!, TLE이라면 TLE!을 출력하는 문제 1, 2학년이면 뉴비, 뉴비가 아니지만 N학년 이하이면 올드비, 둘 다 아니면 TLE 문제 해결 순서 조건에 맞게끔 조건문 사용 import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
| 2021-02-28 19:29:00
문제 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다. ***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다. 문제 해결 순서 출력될 별을 2차원 배열로 가정하는것이 포인트. 3*3, 총 9개의 구간중 5번째 구간은 공백으로 처리, 나머지는 별을 출력 반복문을 x부터 x+N, y부터 y+N까지 size만큼 늘리며 돌면서 재귀함수 호출 (만약 N이 27이면 맨 처음에 0~27까지 0, 9, 18 이렇
| 2021-02-28 19:29:00
문제 4개의 역에 대해 기차에서 내린 사람 수와 탄 사람 수가 주어졌을 때, 기차에 사람이 가장 많을 때의 사람 수를 구하는 문제 문제 해결 순서 반복문을 4번 돌면서 만약 temp가 cur보다 작으면 temp를 cur로 초기화 a에 내린 사람, b에 탄 사람 수를 입력받음 cur에 cur - a + b를 더해 정류장에 도착했을 때 기차에 있는 사람 수를 저장 다시 1번 반복 import java.util. Scanner ;
class Main {
public static void
| 2021-02-28 19:29:00
문제 KOI 통신연구소는 레이저를 이용한 새로운 비밀 통신 시스템 개발을 위한 실험을 하고 있다. 실험을 위하여 일직선 위에 N개의 높이가 서로 다른 탑을 수평 직선의 왼쪽부터 오른쪽 방향으로 차례로 세우고, 각 탑의 꼭대기에 레이저 송신기를 설치하였다. 모든 탑의 레이저 송신기는 레이저 신호를 지표면과 평행하게 수평 직선의 왼쪽 방향으로 발사하고, 탑의 기둥 모두에는 레이저 신호를 수신하는 장치가 설치되어 있다. 하나의 탑에서 발사된 레이저 신호는 가장 먼저 만나는 단 하나의 탑에서만 수신이 가능하다. 예를 들어 높이가 6, 9, 5, 7, 4인 다섯 개의 탑이 수평 직선에 일렬로 서 있고, 모든 탑에서는 주어진 탑 순서의 반대 방향(왼쪽 방향)으로 동시에 레이저 신호를 발사한다고 하자. 그러면, 높이가 4인 다섯 번째 탑에서 발사한 레이저 신호는 높이가 7인 네 번째 탑이 수신을 하고, 높이가 7인 네 번째 탑의 신호는 높이가 9
| 2021-02-28 19:29:00
문제 첫 번째 줄부터 2*N-1 번째 줄까지 차례대로 별을 출력하는 문제 문제 해결 순서 N-1과 N으로 나눠서 별을 출력한다. import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
Scanner scan = new
| 2021-02-28 19:29:00
문제 입력받은 두 수의 최대공약수와 최소공배수를 구하는 문제 문제 해결 순서 먼저 최대공약수를 구하기 위해 gcd함수를 유클리드호제법을 이용해 만듦 두 수 a, b의 최소공배수는 a * b / 최대공약수 최고공배수와 최대공약수를 출력 import java.util. Scanner ;
class Main {
public static void main ( String [] args) {
| 2021-02-28 19:29:00
문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 문제 문제 해결 순서 System.out.print() 보다 빠른 StringBuilder 를 이용함 반복문으로 list에 N만큼 숫자를 넣음 JAVA 내장함수인 Collections.sort() 을 사용해 list를 정렬, 시간복잡도가 NlogN임 list에서 값을 하나씩 꺼내 sb에 저장 후 출력 import java.util. Scanner ;
import java.util. ArrayList
| 2021-02-28 19:29:00
문제 a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다는 계약 조항이 있을 때, k층의 n호에는 몇 명이 살고 있는지 구하는 문제 문제 해결 순서 k와 n이 최대 14까지이기 때문에 15x15 배열을 하나 만들어 준다 반복문을 돌면서 각 층의 1호는 모두 1명으로, 1층의 호는 i로 초기화 한다 k층의 n호는 k-1층의 n호의 사람 과 k층의 n-1호의 사람 을 더한 값 import java.util. Scanner ;
class Main {
| 2021-02-28 19:29:00
문제 달팽이가 아침에 A만큼 올라가고 밤에 B만큼 미끄러질때 V만큼 올라가는데 걸리는 날짜를 구하는 문제 문제 해결 순서 ( 1차 삽질 처음엔 그냥 반복문으로 했는데 시간제한에 걸려버렸다.. 다른 수식을 찾기로 함) 정상에 올라간 뒤에는 미끄러지지 않는다는것이 포인트. 결국 끝까지 올라가는데 미끄러지는 날이 하루 더 적다는 뜻. (V - B) / (A - B)가 결국 총 걸리는 날짜. 만약 나눠떨어지지 않는다면 A - B보다 작은 길이나 남아 있다는 뜻. 따라서 하루 더 걸리므로 day +1 import java.util. Scanner ;
class
| 2021-02-28 19:29:00
문제 입력 받은 시간에 45분을 뺀 시간을 출력하는 문제 문제 해결 순서 minute - sub의 값이 0 보다 큰지 작은지 검사 클 경우 그대로 출력 작을 경우 60 + (minute - sub) 으로 분을 먼저 구하고 시에서 1을 빼줌 시에서 1을 뺐을 때 -1이 되는 경우 23으로 바꿔줌 import java.util. Scanner ;
class Main {
public static void main (
| 2021-02-28 19:29:00
문제 세 점이 주어졌을 때, 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 문제. 문제 해결 순서 4개의 x좌표에는 2개의 값만 있는걸 이용. (y좌표도 마찬가지) 만약 첫번째 x좌표와 2번째, 3번째중 같은 좌표가 없으면 첫번째 x좌표가 4번째 좌표의 x좌표. 만약 첫번째 x좌표와 2번째, 3번째중 같은 좌표가 있으면 2번째, 3번째 좌표중 4번째 좌표의 x좌표가 있다는 것. y좌표도 똑같이 적용. import java.util. Scanner ;
class Main {
public static
| 2021-02-28 19:29:00
문제 N개의 링 중 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지를 기약분수로 출력하는 문제 문제 해결 순서 맨 처음 한 바퀴 도는 링을 t에 입력 받음 N-1만큼 반복문을 돌며 조건을 검사 만약 t % a == 0 이면 약분이 필요없음 만약 t % a != 0 이라면 gcd() 함수를 통해 최소공배수를 구함 최소공배수로 분자 분모를 나눠 기약분수를 만듦 import java.util. Scanner ;
class Main {
| 2021-02-28 19:29:00
문제 10개의 정수를 입력 받아 각각 42로 나눴을 때 서로 다른 값이 몇 개 있는지 출력하는 문제 문제 해결 순서 42로 나눴을 때 나올 수 있는 나머지는 0~41까지 총 42개 이므로 길이 42의 배열을 선언한다. 반복문을 10번 돌며 배열의 입력 받은 수 % 42 번째를 +1 해준다. 반복문을 42번 돌며 remainder 의 i번째 값이 0이 아니면 해당 i번째의 나머지 값이 있었다는 뜻이므로 정답을 +1 해준다. import java.util. Scanner ;
class Main {
| 2021-02-28 19:29:00
문제 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하는 문제 문제 해결 순서 무한루프를 돌며 주어진 문자열이 "0 0 0" 인지 확인 아니라면 StringTokenizer 을 통해 a, b, c를 공백을 기준으로 나눠 입력받음 그 중 가장 큰 값을 저장 큰 값^2 = 나머지1^2 + 나머지2^2 으로 직각삼각형임을 구분 import java.io.*;
import java.util. StringTokenizer ;
class Main {
| 2021-02-28 19:29:00
문제 등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다. 캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다. 강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까? 강산이는 조금 더 일반화해서 문제를 풀려고 한다. 캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V) 문제 해결 순서 그리디 유형의 문제. 먼저 휴가중에 캠핑장을 가서 최대 일수로 즐길 수 있는 횟수를 구한다. (V % P) 만약 남은 일수가 캠핑장 운영일수 보다 작으면, (V / P * L) + (V % P)
| 2021-02-28 19:29:00
문제 주어진 두 수에 대해서 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력하는 문제 0, 0이 입력되면 반복문을 중단 문제 해결 순서 무한 루프를 돌며 a, b가 0이 입력되는지 검사 만약 b % a == 0 이면 factor 출력 a % b == 0 이면 multiple 출력 둘 다 아니라면 neither 출력 import java.util. Scanner ;
class Main {
| 2021-02-28 19:29:00
문제 3개의 햄버거 가격과 2개의 음료수 가격을 입력받아 가장 싼 세트의 가격을 구하는 문제 (단, 음식의 가격은 2000원을 넘지 않는다.) 문제 해결 순서 3번 도는 반복문, 2번 도는 반복문으로 나눠 입력 받는다. 3번 도는 반복문에서는 ham_min 변수의 값과 입력받은 값 중 작은 값을 ham_min 에 저장한다. 2번 도는 반복문에서는 drink_min 변수의 값과 입력받은 값 중 작은 값을 drink_min 에 저장한다. `java import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int ham_mi
| 2021-02-28 19:29:00
문제 30명의 학생 중 과제를 제출하지 않은 2명의 학생의 출석번호를 구하는 문제 문제 해결 순서 28번 반복문을 돌며 과제를 제출한 학생의 출석번호에 해당하는 배열의 값을 true로 바꿈 30번 반복문을 돌며 출석번호에 해당하는 배열의 값이 true가 아니면 과제를 제출하지 않은 경우 import java.util. Scanner ;
import java.util. Arrays ;
class Main {
public static
| 2021-02-28 19:29:00
문제 어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 문제 문제 해결 순서 한 학생의 정보가 한 줄로 주어지므로 입력받은 한 줄을 이름 생년월일로 나눔 Student 클래스 배열을 만들어 학생 정보를 입력 Arrays.sort의 compare을 오버라이드해 나이순으로 정렬 import java.util. Arrays ;
import java.util. Comparator ;
import java.util.
| 2021-02-28 19:29:00
문제 입력받은 키와 몸무게를 기준으로 덩치가 큰 순서를 출력하는 문제 문제 해결 순서 int형의 x, y 배열을 선언해 각각 키와 몸무게를 입력받음 n만큼 2중 for문을 돌면서 i와 j가 같으면 같은 사람을 비교하는 것이므로 그냥 넘김 i와 j가 다르면 키와 몸무게를 비교해 둘 다 작을 시 해당 번째의 rank를 ++ import java.util. Scanner ;
class Main {
public static void main (
| 2021-02-28 19:29:00
문제 철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일수를 알고 싶어 한다. 토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을
| 2021-02-28 19:29:00
문제 입력받은 괄호 문자열이 올바른 문자열인지 확인하는 문제. 문제 해결 순서 입력받은 괄호 문자열을 반복문을 돌며 스택에 하나씩 넣음 여는 괄호면 스택에 추가, 닫는 괄호면 스택에서 제거 스택이 비어있는데 닫는 괄호차례이면 잘못된 괄호 문자열이므로 return false 반복문이 끝나고 스택이 비어있으면 올바른 괄호 문자열이므로 return true import java.io.*;
import java.util. Scanner ;
import java.util.
| 2021-02-28 19:29:00
문제 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다. 파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다. N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오. 문제 해결 순서 n이 6부터 [n-1] + [n-5] 라는 규칙이 적용된다. 0번째 부터 5번째 까지 정해진 값을 넣어준다. 정답이 저장될 배열을 만들어 점화식을 적용해 값을 채워준다.
| 2021-02-28 19:29:00
QuickSort 알고리즘이란 QuickSort 알고리즘은 pivot을 기준으로 pivot보다 작은 값을 pivot 왼쪽에, 큰 값을 pivot 오른쪽에 정렬하는 알고리즘이다. (오름차순 기준) pivot을 기준으로 해 좌우로 값을 보내고 난 후 start에서 pivot - 1, pivot + 1에서 last를 재귀 호출해 주면 된다. 코드 주석을 확인하며 디버깅하면 무슨 뜻인지 쉽게 알 수 있을 것이다. 보통 pivot은 배열의 중간 값으로 많이 정한다고 하는데 아래 예제에서는 배열의 마지막 값으로 정했다. import java.util. Scanner ;
public class
| 2021-02-28 19:29:00
Java 프로그램 실행 시간 측정 알고리즘 문제를 풀다보면 자신의 코드가 시간이 얼마나 걸리는지, 어느부분이 느린지 확인해야 하는 경우가 종종 있다. 그럴 때 유용하게 사용할 수 있는 코드이다. long beforeTime = System . currentTimeMillis (); // 알고리즘 시작 시간 받아오기
// 알고리즘 코드 실행
long afterTime = System . currentTimeMillis (); // 알고리즘 끝난 시간 받아오기
| 2021-02-28 19:29:00
Access Controll 이란? 먼저 접근제한자 (Access Controll) 이란,
접근제한자는 다른 소스 파일이나 모듈이 코드로 접근하는 것을 제하는 것이다.
이렇게 함으로써, 우리는 코드의 세부 구현 사항을 숨길 수 있다 (은닉화)
접근제한자는 클래스, 구조체 및 열거와 같은 개별 타입과, 해당 타입에 속하는 프로퍼티, 메소드, 이니셜라이저에 사용할 수 있다.
### Access Controll의 종류
접근제한자의 종류로는 `open, public, internal, fileprivate, private` 이렇게 총 5개가 있다.
- open : 모듈 외부에서 access가능 (Class만 사용 가능)
- 일반적으로 Framework에 공용 인터페이스를 지정할 때 사용
- public : open과 동일, 하지만 외부 상속 불가 & class 멤버 override 불가
- 일반적으로 Framework에
| 2021-02-28 19:29:00
Swift의 3가지 컬렉션 타입 먼저 컬렉션 타입이란. 컬렉션 타입은 데이터들의 집합이라 할 수 있다. Swift에서 컬렉션 타입이란 지정된 타입의 데이터들의 묶음이다. 굳이 지정된 타입이라고 하는 이유는 Swift에서는 컬렉션 타입들이 모두 제네릭 컬렉션으로 구현되어 있기 때문이다. 제네릭(Generic)이란 제네릭이란 컬렉션 타입에 여러가지 데이터 타입들을 담을 수 있도록 지정할 수 있다는 의미이다.
튜플처럼 하나의 컬렉션 타입에 여러개의 데이터 타입들을 담을 수 있다는 것은 아니고 하나의 컬렉션 타입은 하나의 데이터 타입만을 담을 수 있다.
### 컬렉션 타입의 종류
#### 배열 (Array)
Swift에서 배열은 같은 데이터 타입의 값들을 순서대로 저장하는 리스트이다.
그리고 배열은 중복 값을 저장할 수 있는데 어차피 순서가 정해져 있어서 구분할 수 있기 때문이다.
#### 세트 (Se
| 2021-02-28 19:29:00
Swift의 Tuple 먼저 Tuple은 Collection Type이 아니다. Collection Type에는 Array, Dictionary, Set만이 있다. 그래도 Type이긴 하다. Tuple은 구조체와 비슷하다. var tuple = (1, "Hello, world!", true) 이런식으로 여러가지 타입을 한꺼번에 묶어서 사용할 수 있다. 여기서 Tuple도 타입이기 때문에 Tuple안에 Tuple도 가능하다. Tuple 사용방법 실제로 다른 컬렉션 타입이나 구조체 때문에 Tuple을 쓸 일은 거의 없다.
그래도 사용방법에 대해 알아보자.
```Swift
var tuple = (1, "Hello, world!", true)
tuple.0 // 1
tuple.1 // "Hello, world!"
```
이런식으로 인덱스만 찍어주면 바로 값에 접근이 가
| 2021-02-28 19:29:00
SwiftUI List SwiftUI에서 기본으로 제공해주는 DisclosureGroup이 있지만 커스텀에 제약이 많다... 직접 DropDown을 만들어 여러 속성을 추가해서 커스텀할 수 있도록 짠 코드이다. expand변수를 통해서 box를 열었을 때, 닫았을 때를 체크해줬다. 그리고 .animation(.spring()) 로 애니메이션도 추가할 수 있다. DropDown struct struct DropDown : View {
@State var expand = false
var body:
| 2021-02-28 19:29:00
SwiftUI HexColor SwiftUI에서 Hex 코드로 Color를 지정해야 할 때가 있다. (ex: fbfbfb, bbbbbb)
SwiftUI 자체적으로는 Hex 코드로 Color를 지정할 수 없기 때문에 extension을 통해 따로 포팅 해줘야한다.
아래는 Color.init(hex: String) 코드이다.
### HexColor.swift
```Swift
import SwiftUI
extension Color {
init(hex: String) {
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int: UInt64 = 0
Scanner(string: hex).scanHexInt64(&int)
let a, r, g, b: UInt64
switch hex.count {
| 2021-02-28 19:29:00
SwiftUI List SwiftUI에서 List Struct를 사용하다 보면 분리선을 없애고 싶을 때가 있다.
구글링하면 버전별로 수많은 방법이 나오는데 가장 깔끔한 방법을 찾은 것 같다.
### NoSeparatorList
```Swift
struct NoSeparatorList : View where Content: View {
let content: () - Content
init(@ViewBuilder content: @escaping () - Content) {
self.content = content
}
var body: some View {
if #available(iOS 14.0, *) {
ScrollView {
LazyVStack(spacing: 0) {
self.co
| 2021-02-28 19:29:00
SwiftUI List SwiftUI에서 ModalView를 띄우는 가장 쉬운 방법이다.
FullScreen Modal밖에 띄우지 못한다는 것이 단점이지만, ios에서 제공하는 가장 안정적인 view이기도 하고 여러 부가 옵션을 사용할 수 있다는 장점이 있다..
### ModalView
```Swift
Button(action: {
// some action...
}, label: {
// some label...
})
.sheet(isPresented: self.$showModal, content: {
// some modalview content
})
```
Button 속성으로 위와 같은 코드를 적어주면 된다.
content안에 적은 코드가 ModalView로 보이게 된다.
| 2021-02-28 19:29:00
SwiftUI RestAPI GET으로 json 데이터 받기 SwiftUI에서 RestAPI를 통해 json 데이터를 받아서 처리해야할 때 사용한 코드이다. RestAPI GET통신 import SwiftUI
class ProgramCardViewModel: ObservableObject {
init () {
fetchPrograms ()
}
let url = "http://localhost
| 2021-02-28 19:29:00
SwiftUI SideMenu SwiftUI로 사이드메뉴를 구현한 간단한 예제이다. 기본적으로 SideMenuView.swift와 그 안에 표시해줄 MenuButtonView.swift 두 파일이 있으며, SideMenuView는 ZStack으로 메인 화면에 보여주게 된다. MainView.swift struct MainView: View {
// 사이드 메뉴를 열고 닫음을 저장할 변수
@State var sideMenuBarToggle: Bool = false
| 2021-02-28 19:29:00
SwiftUI Singleton 싱글톤 패턴이란 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 지금같은 경우는 로그인한 유저의 정보를 관리하기 위해 싱글톤 패턴을 사용했다. Singleton.swift class Singleton{
static let sharedInstance = Singleton ()
var LoginUser = User (id:
| 2021-02-28 19:29:00
SwiftUI OpenAPI XML 파일 공공데이터 포털에서 OpenAPI를 사용하려고 보면 json말고 XML로 값을 리턴해주는 api가 꽤 있다. json은 Key, value로 값을 가져오면 되지만. XML은 태그를 구분에 데이터 값을 가져오는 방식인 것 같다. hospitalViewController.swift class FetchData: NSObject , XMLParserDelegate {
// 코로나 선별 진료소를 담을 배열
var hospitals: [ Hospital
| 2021-02-28 19:29:00
문제 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다.
이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다.
즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
##### 문제 해결 순서
1. 쉽게 생각해서 반복문을 돌며 price * i 만큼 sum을 더해주려했다.
2. 통과는 했지만 다른 사람의 코드를 보니 수학적 수식을 통해 반복문을 쓰지 않고도 구할 수 있었다.
3. swift로 알고리즘을 많이 안풀어봐서 그런지 너무 1차원적으로 생각하는 것 같다.
##### for문을 사용한 코드
```swift
| 2021-02-28 19:29:00
문제 https://programmers.co.kr/learn/courses/30/lessons/42889 문제 해결 순서 프로그래머스는 정답 자료형이 정해져 있어서 int형 배열로 바꾸는 부분에서 애를 먹었다. 기본적인 아이디어로는 실패율을 계산해 해시맵에 저장함.
3. 해시맵을 정렬하는데 실패율순으로 정렬하고 만약 같으면 스테이지 순으로 정렬함.
4. 이 과정에서 리스트를 배열로 바꾸는 부분에 시간을 많이 투자함. 다시 풀면 좀 더 깔끔하게 풀 수 있을듯.
```java
import java.util.*;
class Solution {
public static int[] solution(int N, int[] stages) {
int[] answer;
int[] temp = new int[N + 2];
// 실패율 저장 배
| 2021-02-28 19:29:00
문제 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다. 효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하고 있다. 1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하는 프로그램을 작성하시오. 예를 들어 6개의 포도주 잔이 있고, 각각의 잔에 순서대로 6, 10, 13, 9, 8, 1 만큼의 포도주가
| 2021-02-27 19:29:00
문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오. 문제 해결 순서 너비우선탐색 문제이므로 큐를 이용해 구현. +1, -1, *2, 3가지 경우를 차례대로 큐에 삽입. 배열 arr에 몇 초가 걸렸는지 저장. 하나씩 큐에서 빼며 동생의 위치인지 검사. 큐에서 뺀 값이 동생의 위치와 같다면 배열 arr의 동생 번째를 출력.
| 2021-02-25 19:29:00
문제 x, y좌표와 w, h길이의 직사각형이 주어질 때 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 문제 문제 해결 순서 (x, y)좌표에서 각 변까지의 거리를 구한 후 가장 작은 거리를 출력 ( 1차 삽질 멍청하게 직사각형을 4등분으로 나눠서 (x, y)좌표가 어느 사분면에 있는지 구하고 등등 이상한 방법으로 접근함. 왜 그랬을까..) import java.util. Scanner ;
class Main {
public static void m
| 2021-02-16 19:29:00
문제 어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 주어진 단어가 팰린드롬인지 구별하는 문제 문제 해결 순서 맨 처음 한번 문자열을 입력받는다. 문자열이 "0"이 아닐때만 반복문을 돌며 StringBuffer.reverse() 를 통해 뒤집은 문자열과 비교한다. import java.io. BufferedReader ;
import java.io. IOException ;
import java.io.
| 2021-02-16 19:29:00
문제 숌은 영화 제목에 666을 넣어 제목을 지을 생각이다. 666, 1666, 2666, 3666... N일때, 666이 포함된 N번째 숫자를 구하는 문제 문제 해결 순서 반복문을 돌면서 Integer.toString() 을 통해 문자열로 변환 후 contains() 를 통해 666이 포함되어 있는지 검사 카운터를 증가시키며 입력받은 n과 같으면 n번째 숫자를 출력하고 종료 `java import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); // N번째인지 비교할 count변수 int count = 0; // 반복문을 돌면서 숫자에 6
| 2021-02-16 19:29:00
문제 정수 N에 사용할 수 있는 연산은 아래의 세 가지 N이 3으로 나눠 떨어지면, 3으로 나눈다. N이 2로 나눠 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때 위의 3가지 연산을 적절히 사용해서 1을 만들 때, 연산을 사용하는 횟수의 최소값을 구하는 문제 문제 해결 순서 N+1만큼 크기의 배열 arr을 선언하고 99999999로 초기화 배열의 순번 I가 곧 I를 1로 만들기 위해 사용하는 연산 횟수의 최소값 1은 연산을 할 필요가 없으므로 0으로 초기화 2부터는 1) 2로 나눴을 때 기존의 arr[i]와 arr[i/2]+1 중 더 작은 값을 arr[i]로 초기화
&nbs
| 2021-02-16 19:29:00
문제 주어진 고정비용, 가변비용, 제품가격을 통해 손익분기점을 구하는 문제 (손익분기점이 없으면 -1을 출력) 문제 해결 순서 제품 가격이 가변비용보다 같거나 작으면 손익분기점을 넘을 수 없으므로 -1출력 (제품 가격 - 가변비용) / 고정비용 + 1 을 구하면 손익분기점을 넘어가기위해 팔아야하는 제품의 개수가 나온다. ( 1차 삽질 처음엔 while문을 이용해 직접 제품 개수를 늘려가며 구했는데 고정비용, 가변비용, 제품가격의 최대값이 21억이고 주어진 시간이 적었기 때문에 시간초과가 떴다. 생각해보니 제품 한개 팔았을 때 나오는 이익으로 고정 비용을 나누면 몇 개를 팔아야 흑자를 볼 수 있는지 알 수 있었다.) import java.util.
| 2021-02-16 19:29:00
문제 첫째 줄에 N, 다음 줄에 N개의 정수가 오고 셋째 줄에 M, 다음 줄에 M개의 정수가 옴 M개의 수들 중 N안에 존재하면 1, 아니면 0 출력 문제 해결 순서 N개의 숫자를 Hashset인 hs에 저장 크기 M인 배열을 생성하고 M개의 숫자를 저장 hs.contains(arr[i]) 로 배열에 숫자가 존재하는지 확인 Hashset.contains() 함수는 시간복잡도가 o(1)이라 시간초과가 안뜸 import java.util. Scanner ;
import java.util.
| 2021-02-16 19:29:00
문제 N이상 M이하의 소수를 모두 출력하는 문제 문제 해결 순서 기본적으로 에라스토테네스의 체 방식을 이용한다. ( 1차 삽질 반복문으로 대충 구하려하니 당연하게도 시간초과가 떴다.) ( 2차 삽질 13번째줄의 반복문에 int j = i; 식을 썼었는데 컴파일 에러가 떴다. 여러 예제를 넣어보고 알아낸게, j를 i로 초기화 해버리면 숫자가 커졌을 때 i*j <= m 식에서 int형의 크기를 벗어날 수가 있다는 것이다.) import java.util. Scanner ;
class
| 2021-02-16 19:29:00
문제 입력받은 숫자 중 소수(prime number)가 몇 개인지 구하는 문제 문제 해결 순서 반복문을 돌면서 처음에 prime 변수를 true로 초기화한다. a 를 j = 2 부터 a 자기 자신까지 반복문을 돌며 나눠지는지 검사한다. 하나라도 나눠지게 되면 소수가 아니므로 prime 변수를 false 로 바꾸고 반복문을 탈출한다. 끝까지 나눠지지 않는다면 소수이므로 count 를 1 증가시키고 계속 진행한다. `java import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new S
| 2021-02-16 19:29:00
문제 자연수 N이 주어졌을 때 N의 가장 작은 생성자를 구하는 문제 예를 들어 245의 분해합은 256(=245+2+4+5), 반대로 245는 256의 생성자 문제 해결 순서 입력받은 N-1만큼 반복문을 돌며 N을 String형으로 변경한 후 한 자리씩 sum에 더함 i + sum이 입력받은 N과 같다면 result에 i를 넣음 result 출력 import java.util. Scanner ;
class Main {
public static void mai
| 2021-02-16 19:29:00
문제 일곱 난쟁이의 키의 합은 100, 아홉 난쟁이의 키가 주어질때 진짜 일곱 난쟁이의 키를 오름차순으로 출력하는 문제 문제 해결 순서 아홉 난쟁이의 키의 합을 sum에 저장 sum에서 100을 뺀 수를 sub에 저장 2중 for문을 돌며 arr[i] + arr[j] == sub 이면 가짜 난쟁이라는 뜻 break loop를 이용해 반복문을 탈출, 값을 찾자마자 탈출하지 않으면 arr[i] + arr[j] == sub 이 가능한 다른 값을 찾아 여러개의 배열이 0으로 바뀔 수 있음 배열을 정렬해서 출력 import java.util. Scanner ;
| 2021-02-16 19:29:00
문제 모래시계 모양으로 별을 출력하는 문제 아래는 3을 입력 받았을 때 예시 ` * *** * *** * ` ##### 문제 해결 순서 1. 가장 큰 반복문은 2*n-1 만큼 돌아야한다. 2. i는 0 ~ 9까지 돌며 i가 time보다 작을 때, 크거나 같을 때 두 경우로 나눈다. 3. 작을 경우 모래시계 윗 부분을 출력한다. 4. 크거나 같을 경우 모래시계 아랫 부분을 출력한다. ( 1차 삽질 그냥 삼각형 2개로 나눠서 출력할걸 그랬다.. 반복문 하나 안에서 해보려다 결국 더 안 좋은 코드를 짠 듯 하다..) import java.util.
| 2021-02-16 19:29:00