everyday-develop-myself의 등록된 링크

 everyday-develop-myself로 등록된 티스토리 포스트 수는 244건입니다.

안드로이드의 Context [내부링크]

Context란? Context는 애플리케이션의 환경에 대한 전역정보가 컨텍스트로 연결된다. Context는 Android 시스템에 의해 제공되는 추상 클래스로 애플리케이션 별로 리소스 및 클래스에 대한 접근은 물론 Activity의 실행, 브로드 캐스팅 및 Intent 수신과 같은 애플리케이션 레벨에 대한 호출을 허용한다. 말이 조금 어려운데 간단하게 말하자면 Context는 안드로이드 앱의 실행 환경에 대한 정보를 제공하는 클래스이다. 안드로이드 앱은 Context를 사용해 다양한 작업을 수행하고, 시스템 서비스에 접근하며, 리소스에 액세스할 수 있다. 안드로이드에서는 앱의 실행 환경이 다양한 상황과 조건에 따라 변경될 수 있다. 이러한 실행 환경을 표현하고 조작하기 위해 Context 클래스가 사용..

안드로이드의 앱 구성요소 (4대 컴포넌트) [내부링크]

안드로이드 4대 컴포넌트 안드로이드 앱은 필수적인 기본 구성 요소가 4가지 존재한다. 이를 안드로이드 4대 컴포넌트라고 부른다. 각 구성 요소는 시스템이나 사용자가 앱에 들어올 수 있는 진입점이 된다. 구성 요소는 다음과 같다. 1. Activity (액티비티) 2. Service (서비스) 3. Broadcast Receiver (브로드캐스트 수신자) 4. Content Provider (콘텐츠 제공자) 액티비티 액티비티는 사용자 인터페이스를 포함한 화면 하나를 나타낸다. 예를 들어 이메일 앱이라면 목록을 표시하는 액티비티가 하나 있고, 이메일을 작성하는 액티비티가 또 하나가 존재한다. 이렇듯 액티비티는 시스템과 앱의 주요 상호작용을 돕는다. 서비스 서비스는 백그라운드에서 실행되는 구성 요소로, 오랫동..

자물쇠와 열쇠 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 고고학자인 "튜브"는 고대 유적지에서 보물과 유적이 가득할 것으로 추정되는 비밀의 문을 발견하였습니다. 그런데 문을 열려고 살펴보니 특이한 형태의 자물쇠로 잠겨 있었고 문 앞에는 특이한 형태의 열쇠와 함께 자물쇠를 푸는 방법에 대해 다음과 같이 설명해 주는 종이가 발견되었습니다. 잠겨있는 자물쇠는 격자 한 칸의 크기가 1 x 1인 N x N 크기의 정사각 격자 형태이고 특이한 모양의 열쇠는 M x M 크기인 정사각 격자 형태로 되어 있습니다. 자물쇠에는 홈이 파여 있고 열쇠 또한 홈과 돌기 부분이 ..

Scope Function (범위 지정 함수) with let, run, with, apply, also [내부링크]

범위 지정 함수란? Kotlin의 표준 라이브러리에는 개체의 컨텍스트 내에서 코드 블록을 실행하는 것이 목적인 여러 범위 지정 함수들이 있다. 람다 식이 있는 개체에서 이러한 함수를 호출하면 임시 범위가 형성되고 이런 범위에서는 이름 없이 객체에 액세스할 수 있다. 이러한 범위 함수의 종류로는 let, run, with, apply, also의 다섯 가지가 있다. 기본적으로 범위 함수들은 동일한 목적을 가지고 작업을 수행한다. 다른 점은 이 개체가 블록 내에서 사용 가능하게 되는 방식이 전체 표현식의 결과이다. 이런 이유로 하나의 범위 함수를 고르는 것은 힘든 일이다. 이제부터 범위 기능과 해당 규칙의 차이점에 대한 자세한 설명을 제공하겠다. 범위 함수 요약 위의 테이블은 범위 함수의 차이점들을 나타..

Generics (제네릭) [내부링크]

제네릭이란? 제네릭을 사용하지 않았을 경우 우리가 String 문자열을 저장하는 리스트를 생성한다고 생각 해보자. 우리는 다음과 같이 코드를 작성할 것이다. val stringList: List = listOf("Hello", "World") // 문자열을 저장하는 리스트 생성 이제 이 문자열의 요소를 출력해주는 메소드를 만들려고 한다. fun printStringList(list: List) { for (item in list) { println(item) } } 그렇다면 우리는 위와 같이 메소드를 작성해야 할 것이다. 이번엔 Int 문자열을 저장하는 리스트를 생성하고 이를 출력해주는 메소드를 만들어보겠다. val integerList: List = listOf(10, 20) // 정수를 저장하는 리스..

PCB (Process Control Block, 프로세스 제어 블록) [내부링크]

PCB란? PCB는 운영 체제에서 프로세스를 관리(Process Management) 하기 위해 사용되는 데이터 구조이다. 운영체제는 하드웨어 자원을 관리하고 프로그램들을 지원해주는 역할을 한다. 커널은 이 운영체제의 핵심으로 프로그램과 하드웨어의 중간다리 역할을 한다. 위의 그림을 보게 되면 커널에는 Data Structure for Hardware(하드웨어의 데이터 구조)와 PCB가 있는 것을 알 수 있다. 그리고 프로세스와 하드웨어를 관리하기 위한 데이터가 담겨있는 이런 데이터 구조체를 통틀어 metadata(메타데이터)라고 부른다. PCB는 각 프로세스에 대해 운영 체제가 생성하고 유지하며, 해당 프로세스에 대한 정보를 저장한다. PCB가 가지는 정보 PCB가 가지는 정보는 아래와 같다. PCB를..

JVM과 커널의 동작 [내부링크]

c 커널이란? 운영체제에 공부를 하다보면 커널이라는 것을 접하게 된다 커널을 간단하게 설명하자면 운영체제의 메모리에 상주해 있는 프로그램이라고 할 수 있다. 커널은 응응 프로그램들이 자원에 접근할 때 사용되는데, 이 때 위의 그림과 같은 과정을 거치게 된다. 쉘이란 이런 프로그램들이 메모리에 로딩되고 언제 메모리에서 해제되는지 관리해주는 프로그램이다. 다만 쉘이 직접 메모리에 관여한다면 여러 프로그램들이 꼬이게 되어 엉뚱한 곳에 데이터를 읽거나 쓰는 상황이 발생할 수 있다. 그래서 쉘은 I/O를 할 때 커널에게 요청을 하고 커널은 이를 받아드려 해당하는 I/O를 대신 진행해준다. 이런 요청을 System Call (시스템 콜)이라고 한다. 이 때 사용되는 것이 위의 그램에 존재하는 mode bit 이다...

가장 긴 팰린드롬 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다. 문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요. 예를들면, 문자열 s가 "abcdcba"이면 7을 return하고 "abacde"이면 3을 return합니다. 제한사항 문자열 s의 길이 : 2,500 이하의 자연수 문자열 s는 알파벳 소문자로만 구성 나의 풀이 이 문제에서 주어진 문자열의 길이가 2500으로 비교적 짧은 길이이..

입국 심사 - Kotlin (이분 탐색) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다. 모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다. 입국심사를 기다리는 사람 수 n, 각 심사관이 한 명..

경주로 건설 - Kotlin (BFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 건설회사의 설계사인 죠르디는 고객사로부터 자동차 경주로 건설에 필요한 견적을 의뢰받았습니다. 제공된 경주로 설계 도면에 따르면 경주로 부지는 N x N 크기의 정사각형 격자 형태이며 각 격자는 1 x 1 크기입니다. 설계 도면에는 각 격자의 칸은 0 또는 1 로 채워져 있으며, 0은 칸이 비어 있음을 1은 해당 칸이 벽으로 채워져 있음을 나타냅니다. 경주로의 출발점은 (0, 0) 칸(좌측 상단)이며, 도착점은 (N-1, N-1) 칸(우측 하단)입니다. 죠르디는 출발점인 (0, 0) 칸에서 출발한 자..

합승 택시 요금 - Kotlin (플로이드 워셜) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/72413 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 밤늦게 귀가할 때 안전을 위해 항상 택시를 이용하던 무지는 최근 야근이 잦아져 택시를 더 많이 이용하게 되어 택시비를 아낄 수 있는 방법을 고민하고 있습니다. "무지"는 자신이 택시를 이용할 때 동료인 어피치 역시 자신과 비슷한 방향으로 가는 택시를 종종 이용하는 것을 알게 되었습니다. "무지"는 "어피치"와 귀가 방향..

디스크 컨트롤러 - Kotlin (우선순위 큐) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를들어 - 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청 와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다. 한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같..

여행 경로 - Kotlin (DFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다. 항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한사항 모든 공항은 알파벳 대문자 3글자로 이루어집니다. 주어진 공항 수는 3개 이상 10,000개 이하입니다. tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다. 주어진 항공권은 모두 사용해야 합니..

섬 연결하기 - Kotlin (최소 스패닝 트리) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요. 다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다. 제한사항 섬의 개수 n은 1 이상 100 이하입니다. costs의 길이는 ((n-1) * n) / 2이하입니다..

[2] MVVM Repository에 Room과 Hilt 사용하기 [내부링크]

이 게시글은 아래의 게시글에서 이어진 내용입니다. [1] MVVM Repository에 Room과 Hilt 사용하기 만약 MVVM Repository 패턴에 대한 이해가 부족하다면 아래의 게시글을 갔다가 오기 바란다. MVVM Pattern with Repository Pattern(저장소 패턴) by Kotlin MVVM에 대한 설명은 아래의 게시글에서 확인하길 바란다. everyday-develop-myself.tistory.com Hilt & Dagger2 Hilt는 Dagger2를 기반으로 한 안드로이드용 의존성 주입 라이브러리이다. 안드로이드 애플리케이션의 구성 요소 간의 의존성을 관리하고 의존성을 주입하는 기능을 제공한다. Dagger2 Dagger2는 Google에서 개발한 Java 및 ..

[1] MVVM Repository에 Room과 Hilt 사용하기 [내부링크]

만약 MVVM Repository 패턴에 대한 이해가 부족하다면 아래의 게시글을 갔다가 오기 바란다. MVVM Pattern with Repository Pattern(저장소 패턴) by Kotlin MVVM에 대한 설명은 아래의 게시글에서 확인하길 바란다. 이 게시글에 내용은 위의 게시글의 MVVM 패턴에서 이어지는 내용임으로 해당 게시글의 내용을 구현했음을 가정한다. 아키텍처 패턴 - MVVM everyday-develop-myself.tistory.com Room 이란? 데이터베이스에 데이터를 가져오려면 기본적으로 우리는 서버를 거치고 REST API를 사용해야 한다. 이렇게 되면 데이터베이스에 접근이 불편하고 번거롭다. 그리고 컴파일 타임에서 오류를 검출할 수 없게 된다. Room은 이런 번거로움..

가장 먼 노드 - Kotlin (BFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다. 노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요. 제한사항 노드의 개수 n은 2 이상 20,000 이하입..

징검다리 건너기 - Kotlin (이분탐색) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 카카오 초등학교의 "니니즈 친구들"이 "라이언" 선생님과 함께 가을 소풍을 가는 중에 징검다리가 있는 개울을 만나서 건너편으로 건너려고 합니다. "라이언" 선생님은 "니니즈 친구들"이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다. 징검다리는 일렬로 놓여 있고 각 징검다리의 디딤돌에는 모두 숫자가 적혀 있으며 디딤돌의 숫자는 한 번 밟을 때마다 1씩 줄어듭니다. 디딤돌의 숫자가 0이 되면 더 이상 밟을 수 없으며..

보석 쇼핑 - Kotlin (투 포인터) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤 합니다. 어피치는 쇼핑을 할 때면 매장 진열대의 특정 범위의 물건들을 모두 싹쓸이 구매하는 습관이 있습니다. 어느 날 스트레스를 풀기 위해 보석 매장에 쇼핑을 하러 간 어피치는 이전처럼 진열대의 특정 범위의 보석을 모두 구매하되 특별히 아래 목적을 달성하고 싶었습니다. 진열된 모든 종류의 보석을 적어도 1개 이상 ..

불량 사용자 - Kotlin (DFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 사용자라는 이름으로 목록을 만들어서 당첨 처리 시 제외하도록 이벤트 당첨자 담당자인 "프로도" 에게 전달하려고 합니다. 이 때 개인정보 보호을 위해 사용자 아이디 중 일부 문자를 '*' 문자로 가려서 전달했습니다. 가리고자 하는 문자 하나에 '*' 문자 하나를 사용하였고 아이디 당 최소 하나 이상의 '*' 문자를 사용하..

베스트앨범 - Kotlin (구현) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의..

단어 변환 - Kotlin (DFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다. 2. words에 있는 단어로만 변환할 수 있습니다. 예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> ..

네트워크 - Kotlin (BFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다. 컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution..

이중 우선순위 큐 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다. 명령어수신 탑(높이) 이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요. 나의 풀이 이 문제는 제목에서 적혀있는 대로 우선순위 큐를 2개를 사용해야 하는 문제이다. 우선순위 큐는 FIFO 구조로 처음 들어간 데이터가 가장 먼저 나오게 된다. 최대, 최소 큐를 2개를 두고..

2011번: 암호코드 - Kotlin [내부링크]

2011번: 암호코드 나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다. www.acmicpc.net 문제 상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다. 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야. 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어. 상근: 그렇네. 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "YAN", "YKD", "..

[Android] Fragment Life Cycle (프래그먼트 생명주기) [내부링크]

프래그먼트는 항상 액티비티 내에서 호스팅되어야 하며 해당 프래그먼트의 수명 주기는 호스트 액티비티의 수명 주기에 직접적으로 영향을 받는다. 예를 들어 액티비티가 일시정지되는 경우, 그 안의 모든 프래그먼트도 일시정지되며 액티비티가 소멸되면 모든 프래그먼트도 마찬가지로 소멸된다. 그러나 액티비티가 실행 중인 동안에는 각 프래그먼트를 추가 또는 제거하는 등 개별적으로 조작할 수 있다. 프래그먼트 생명주기 기본적으로 프래그먼트는 액티비티에 안에서 호스팅된다. 그래서 프래그먼트의 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 매우 비슷하다. 액티비티 수명 주기와의 조화 프래그먼트가 있는 액티비티의 수명 주기는 해당 프래그먼트의 수명 주기에 직접적인 영향을 미친다. 따라서 액티비티에 대한..

[Android] Activity Life Cycle (액티비티 생명주기) [내부링크]

안드로이드 앱을 개발하면서 모든 수명 주기 메서드를 구현할 필요는 없다. 하지만 각각의 수명 주기 메서드를 이해하고, 사용자가 예상한 대로 앱이 동작하도록 필요한 수명 주기 메서드를 구현하는 것이 중요하다. 액티비티 생명주기 onCreate() onCreate()는 시스템이 활동을 생성할 때 가장 먼저 실행되는 것으로, 액티비티에서는 필수적으로 구현해야 한다. 활동이 생성되면 생성됨 상태가 된다. onCreate()에서는 활동의 전체 수명 주기 동안 한 번만 발생하여 하는 기본 애플리케이션 시작 로직을 작성하면 된다. 예를 들면 데이터를 목록에 바인딩하고, 활동을 ViewModel과 연결하고, 일부 클래스 범위 변수를 인스턴스화 하는 등을 작성하면 된다. 활동은 생성됨 상태에 머무르지 않고 onC..

2981번: 검문 - Kotlin (유클리드 호제) [내부링크]

2981번: 검문 트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간 www.acmicpc.net 문제 트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간을 때우기 위해서 수학 게임을 하기로 했다. 먼저 근처에 보이는 숫자 N개를 종이에 적는다. 그 다음, 종이에 적은 수를 M으로 나누었을 때, 나머지가 모두 같게 되는 M을 모두 찾으려고 한다. M은 1보다 커야 한다. N개의 수가 주어졌을 때, 가능한 M을 모두 찾는 프로그램을 작성하시오. ..

2096번: 내려가기 - Kotlin [내부링크]

2096번: 내려가기 첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다. www.acmicpc.net 문제 N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다. 먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다. 별표..

1865번: 웜홀 - Kotlin (벨만-포드) [내부링크]

1865번: 웜홀 첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500), www.acmicpc.net 문제 때는 2020년, 백준이는 월드나라의 한 국민이다. 월드나라에는 N개의 지점이 있고 N개의 지점 사이에는 M개의 도로와 W개의 웜홀이 있다. (단 도로는 방향이 없으며 웜홀은 방향이 있다.) 웜홀은 시작 위치에서 도착 위치로 가는 하나의 경로인데, 특이하게도 도착을 하게 되면 시작을 하였을 때보다 시간이 뒤로 가게 된다. 웜홀 내에서는 시계가 거꾸로 간다고 생각하여도 좋다. 시간 여행을 매우 좋아하는 백준이는 한 가지 궁금증에 빠졌다. 한 지점..

2565번: 전깃줄 - Kotlin [내부링크]

2565번: 전깃줄 첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 www.acmicpc.net 문제 두 전봇대 A와 B 사이에 하나 둘씩 전깃줄을 추가하다 보니 전깃줄이 서로 교차하는 경우가 발생하였다. 합선의 위험이 있어 이들 중 몇 개의 전깃줄을 없애 전깃줄이 교차하지 않도록 만들려고 한다. 예를 들어, < 그림 1 >과 같이 전깃줄이 연결되어 있는 경우 A의 1번 위치와 B의 8번 위치를 잇는 전깃줄, A의 3번 위치와 B의 9번 위치를 잇는 전깃줄, A의 4번 위치와 B의 1번 위치를 잇는 전깃줄을 없애면 남아있는 모든 전깃줄이 서로 교차하지 않게 된다...

1967번: 트리의 지름 - Kotlin (BFS) [내부링크]

1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연 www.acmicpc.net 문제 트리(tree)는 사이클이 없는 무방향 그래프이다. 트리에서는 어떤 두 노드를 선택해도 둘 사이에 경로가 항상 하나만 존재하게 된다. 트리에서 어떤 두 노드를 선택해서 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우가 있을 것이다. 이럴 때 트리의 모든 노드들은 이 두 노드를 지름의 끝 점으로 하는 원 안에 들어가게 된다. 이런 두 노드 사이의 경로의 길이를 트리의 지름이라고 한다. 정확히 정의하자면 트리에 존재하는 모든 경로들 중에서 ..

Reflection (리플렉션) [내부링크]

리플렉션이란? 리플렉션은 자바의 기능 중 하나로, Runtime(실행 중)에 클래스의 정보를 동적으로 검사하고 조작할 수 있도록 한다. 리플렉션을 사용하면 클래스의 메서드, 필드, 생성자 등에 접근하고 호출할 수 있다. 리플렉션에 대해 이해하기 위해서는 JVM의 작동방식에 대해 이해할 필요가 있다. JVM은 클래스 로드시 Class Loader(클래스 로더)를 사용해 클래스에 대한 정보들을 저장한다. 이 때, 리플렉션에 사용되는 MetaData(메타데이터)를 Native Memory의 Metaspace(메타스페이스)에 저장한다. 리플렉션을 호출하는 시점에는 이미 해당 클래스의 로딩과 메타데이터 저장이 완료된 상태일 수 있다. 정리하자면 리플렉션은 로딩된 클래스의 메타데이터를 활용하여 클래스의 정보를 동적..

JVM의 내부 구조와 작동 [내부링크]

자바의 프로세스는 JVM에서 실행되는 독립적인 실행 프로그램이다. 자바 프로세스는 운영 체제에서 실행되기 위해 자원을 할당받고, 메모리 공간을 사용하며, 시스템 자원을 활용하여 작업을 수행한다. 자바 프로세스는 JVM을 통해 자바 언어로 작성된 소스 코드를 바이트 코드로 변화하고, 해당 바이트 코드를 실행해 프로그램을 동작시킨다. 이제부터 JVM에 대해 자세히 알아보겠다. 만약 JVM이 뭔지를 모른다면 아래의 게시글을 읽고 돌아오길 바란다. JVM & JRE & JDK 자바를 공부해본 사람이라면 자바는 플랫폼에 독립적이고, WORA("Write Once Run Anywhere" - 한 번 작성하면 모든 곳에서 돌릴 수 있다)는 말을 들어봤을 것이다. public class Main { public sta..

17070번: 파이프 옮기기 1 - Kotlin (DFS) [내부링크]

17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net 문제 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다. 오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다. 파이프는 회전시킬 수..

17144번: 미세먼지 안녕! - Kotlin [내부링크]

17144번: 미세먼지 안녕! 미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사 www.acmicpc.net 문제 미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼지..

1504번: 특정한 최단 경로 - Kotlin [내부링크]

1504번: 특정한 최단 경로 첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존 www.acmicpc.net 문제 방향성이 없는 그래프가 주어진다. 세준이는 1번 정점에서 N번 정점으로 최단 거리로 이동하려고 한다. 또한 세준이는 두 가지 조건을 만족하면서 이동하는 특정한 최단 경로를 구하고 싶은데, 그것은 바로 임의로 주어진 두 정점은 반드시 통과해야 한다는 것이다. 세준이는 한번 이동했던 정점은 물론, 한번 이동했던 간선도 다시 이동할 수 있다. 하지만 반드시 최단 경로로 이동해야 한다는 사실에 주의하라. 1번 정점에서 ..

미로탈출 - Kotlin (BFS) [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 1 x 1 크기의 칸들로 이루어진 직사각형 격자 형태의 미로에서 탈출하려고 합니다. 각 칸은 통로 또는 벽으로 구성되어 있으며, 벽으로 된 칸은 지나갈 수 없고 통로로 된 칸으로만 이동할 수 있습니다. 통로들 중 한 칸에는 미로를 빠져나가는 문이 있는데, 이 문은 레버를 당겨서만 열 수 있습니다. 레버 또한 통로들 중 한 칸에 있습니다. 따라서, 출발 지점에서 먼저 레버가 있는 칸으로 이동하여 레버를 당긴 후 미로를 빠져나가는 문이 있는 칸으로 이동하면 됩니다. 이때 아직 레버를 당기지 않았더라도 ..

[Kotlin Coroutine] (6) - 채널 2 [내부링크]

ConsumeEach() 그럼 명시적인 이터레이션을 사용하지 않고 채널에 있는 내용을 수신할 수는 없을까?? 이를 위한 메서드가 바로 consumeEach()이다. channel.consumeEach { println("Receiving Num $it") delay(100) } 위의 함수를 사용하면 송신측의 receive를 했을 때와 똑같은 결과를 얻을 수 있다. 또한 한 채널에서 생성한 데이터를 여러 개의 수신측이 가져갈 수도 있다. 이를 통해 데이터를 분류해서 처리할 수 있게 될 것이다. Produce() sequence() 함수와 비슷한 동시성 스트림을 생성할 수 있는 produce()라는 코루틴 빌더가 있다. 이 빌더는 ProducerScope 영역을 도입한다. fun main() { runBlo..

1707번: 이분 그래프 - Kotlin (BFS) [내부링크]

1707번: 이분 그래프 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에 www.acmicpc.net 문제 그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다. 그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오. 입력 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의..

2225번: 합분해 - Kotlin [내부링크]

2225번: 합분해 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 문제 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오. 덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다. 입력 첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다. 출력 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. 나의 풀이 이 문제는 DP를 사용해야 하는 문제이다. 이 문제의 특징은 한 개의 수를 여러 번 쓸 수 있고, 0을 포함할 수 있다는 것이다. 이 말은 만약 입력이 [1, 4] 가 들어간다고 했을 ..

Android App Archutecture (안드로이드 앱 아키텍처) [내부링크]

앱 아키텍처 가이드 | Android 개발자 | Android Developers 앱 아키텍처 가이드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 가이드에는 고품질의 강력한 앱을 빌드하기 위한 권장사항 및 권장 아키텍처가 포함 developer.android.com 앱의 구성요소는 개별적이고 비순차적으로 실행될 수 있으며, 운영체제나 사용자가 언제든지 앱 구성요소를 제거할 수 있다. 이러한 이벤트는 직접 제어할 수 없기 때문에 앱 구성요소에 애플리케이션 데이터나 상태를 저장해서는 안 되며 구성요소가 서로 종속되면 안된다고 안드로이드는 말한다. 4가지의 일반 아키텍처 원칙 그래서 안드로이드의 앱은 견고성을 높이며 앱을 더 쉽게 테스트할 수 있도록 아키텍처를 정의하는..

RxJava에 대해 [내부링크]

RxJava에 대한 공부를 시작하는 이유 요즘 프로젝트를 진행하면서 Retrofit2를 이용해 서버와 통신을 많이 진행하고 있다. 네트워크 요청은 Call 객체를 통해 비동기적으로 수행되고, enqueue() 메서드를 호출해 비동기로 요청을 실행하거나 execute() 메서드를 호출하여 동기적으로 실행할 수 있다. 예시는 아래와 같다. interface MyApiService { @GET("users/{id}") fun getUser(@Path("id") userId: String): Call } val BASE_URL = "baseurl" val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFacto..

11054번: 가장 긴 바이토닉 부분 수열 - Kotlin [내부링크]

11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net 문제 수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다. 예를 들어, {10, 20, 30, 25, 20}과 {10, 20, 30, 40}, {50, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20, 30} 은 바이토닉 수열이 아니다. 수열 A가 주어졌을 때, 그 수열의 부분 수열..

[Kotlin Coroutine] (5) - Channel (채널) [내부링크]

채널이란? 채널은 2개의 코루틴 사이를 연결할 수 있는 파이프 같은 것이다. 임의의 데이터 스트림을 코루틴 사이에 공유할 수 있다. 만약 채널 내부의 용량이 다 찼는데 데이터를 채널에 보내려고 하면, 채널은 현재 코루틴을 일시 중단시키고 나중에 재개하게 된다. 이 부분이 자바의 동시성 API에서의 Blocking Queue와 채널의 가장 큰 차이이다. 채널의 타입 채널의 타입은 크게 4가지로 나눌 수 있다. 1. Buffered 2. Rendezvous (Unbuffered) 3. Unlimited 4. Conflated 이제부터 이 4가지의 타입을 어떻게 사용하는지 알아보겠다. 1. Buffered 고정된 크기의 버퍼를 생성하는 타입이다. 아래의 예제를 보자 fun main() { runBlocking..

[Kotlin Coroutine] (4) - 예외 처리 [내부링크]

예외 처리의 경우, 코루틴 빌더들은 다음의 전략을 따른다 1. 부모 코루틴이 자식에게 발생한 오류와 동일한 오류로 취소된다. 2. 자식들이 모두 취소되면 부모는 예외를 코루틴 트리의 윗부분으로 전달한다. 아래의 코드를 보면서 이해해보자 코드 fun main() { runBlocking { launch { throw Exception("A에 에러 발생") println("A 완료") } launch { delay(1000) println("B 완료") } println("메인") } } 결과 메인 Exception in thread "main" java.lang.Exception: A에 에러 발생 위의 코드를 보게 되면 최상위 코루틴이 "A 완료" 를 시작하기 전에 예외가 발생한다. 이로 인해 최상위 코루..

1890번: 점프 - Kotlin (DFS) [내부링크]

1890번: 점프 첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 www.acmicpc.net 문제 N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다. 각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래..

2623번: 음악프로그램 - Kotlin (위상 정렬) [내부링크]

2623번: 음악프로그램 첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한 www.acmicpc.net 문제 인터넷 방송 KOI(Korea Open Internet)의 음악 프로그램 PD인 남일이는 자기가 맡은 프로그램 '뮤직 KOI'에서 가수의 출연 순서를 정하는 일을 매우 골치 아파한다. 순서를 정하기 위해서는 많은 조건을 따져야 한다. 그래서 오늘 출연 예정인 여섯 팀의 가수에 대해서 남일이가 보조 PD 세 명에게 각자 담당한 가수의 출연 순서를 정해오게 하였다. 보조 PD들이 가져온 것은 아래와 같다. 1 4 3 6 2 5 4 2 3 첫..

4386번: 별자리 만들기 - Kotlin (최소 스패닝 트리) [내부링크]

4386번: 별자리 만들기 도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일 www.acmicpc.net 문제 도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일직선으로 이은 형태이다. 모든 별들은 별자리 위의 선을 통해 서로 직/간접적으로 이어져 있어야 한다. 별들이 2차원 평면 위에 놓여 있다. 선을 하나 이을 때마다 두 별 사이의 거리만큼의 비용이 든다고 할 때, 별자리를 만드는 최소 비용을 구하시오. 입력 첫째 줄에 별의 개..

10986번: 나머지 합 - Kotlin (누적 합) [내부링크]

10986번: 나머지 합 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) www.acmicpc.net 문제 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다. 입력 첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 106, 2 ≤ M ≤ 103) 둘째 줄에 N개의 수 A1, A2, ..., AN이 주어진다...

11441번: 합 구하기 - Kotlin (누적 합) [내부링크]

11441번: 합 구하기 첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는 www.acmicpc.net 문제 N개의 수 A1, A2, ..., AN이 입력으로 주어진다. 총 M개의 구간 i, j가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤..

MVVM Pattern with Repository Pattern(저장소 패턴) by Kotlin [내부링크]

MVVM에 대한 설명은 아래의 게시글에서 확인하길 바란다. 이 게시글에 내용은 위의 게시글의 MVVM 패턴에서 이어지는 내용임으로 해당 게시글의 내용을 구현했음을 가정한다. 아키텍처 패턴 - MVVM Pattern with Kotlin MVVM (Model - View - ViewModel) MVVM은 UI와 비즈니스 로직을 분리하여 개발하는데 사용되는 패턴이다. MVVM는 응용 프로그램을 세 가지의 구성요소로 나눈다. Model - Model은 사용자 인터페이스에 표시되거 everyday-develop-myself.tistory.com 저장소 패턴이란? 저장소 패턴(Repository Pattern)은 데이터를 저장하고 검색하는 기능을 구현하는 데 사용되는 일반적인 방법을 제공한다. 저장소 패턴은 데이..

2294번: 동전2 - Kotlin [내부링크]

2294번: 동전 2 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주 www.acmicpc.net 문제 n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다. 사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다. 입력 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,00..

11779번: 최소비용 구하기 2 - Kotlin [내부링크]

11779번: 최소비용 구하기 2 첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스 www.acmicpc.net 문제 n(1≤n≤1,000)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1≤m≤100,000)개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. 그러면 A번째 도시에서 B번째 도시 까지 가는데 드는 최소비용과 경로를 출력하여라. 항상 시작점에서 도착점으로의 경로가 존재한다. 입력 첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 ..

7579번: 앱 - Kotlin (배낭 문제) [내부링크]

7579번: 앱 입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활 www.acmicpc.net 문제 우리는 스마트폰을 사용하면서 여러 가지 앱(App)을 실행하게 된다. 대개의 경우 화면에 보이는 ‘실행 중’인 앱은 하나뿐이지만 보이지 않는 상태로 많은 앱이 '활성화'되어 있다. 앱들이 활성화 되어 있다는 것은 화면에 보이지 않더라도 메인 메모리에 직전의 상태가 기록되어 있는 것을 말한다. 현재 실행 중이 아니더라도 이렇게 메모리에 남겨두는 이유는 사용자가 이전에 실행하던 앱을 다시 불러올 때에 직전의 상태를 메인 메모리로부터 읽어 들여 실행 준비를 빠르게 마치..

[Kotlin Coroutine] (4) - 코루틴 컨텍스트(JOB) [내부링크]

잡은 동시성 작업의 생명주기를 표현하는 객체이다. 잡을 사용하면 작업 상태를 추적하고 필요할 때 그 작업을 취소할 수 있다. 잡의 객체에는 3개의 상태변수가 있다. isActive: 잡이 활성화 되었는지 isCancelled: 잡이 취소중이거나 취소 뒤었는지 isCompleted: 잡이 완료되거나 취소 되었는지 잡은 생성되자 마자 디폴트 상태인 활성화 상태가 된다. 잡을 생성할 때, CoroutineStart 타입의 파라미터를 지정해서 초기 상태를 지정할 수도 있다. CoroutineStart.DEFAULT: 디폴트 동작이며 잡을 즉시 시작한다. CoroutineStart.LAZY: 잡이 신규 상태가 되고 시작을 기다리게 된다. 다음의 예제를 보자 코드 fun main() { runBlocking { v..

[Kotlin Coroutine] (3) - 코루틴 스코프과 컨텍스트(Dispatcher) [내부링크]

지금까지 살펴본 코루틴은 GlobalScope에서만 실행되었다. 경우에 따라서는 어떤 연산을 수행하는 도중에만 실행되기를 원할 수 있다. 어떤 코루틴을 다른 코루틴의 문맥에서 실행하면 후자가 전자의 부모가 되고 이런 관계로 인해 이런 실행 시간 제한이 가능하게 된다. 자식의 실행이 모두 끝나야 부모가 끝날 수 있도록 자식의 생명 주기가 연관된다. 이런 기능을 구조적 동시성이라고 부르며, 블럭이나 서브루틴을 사용하는 경우 구조적 동시성을 비교할 수 있다. 다음은 이런 구조적 동시성을 나타낸 예제이다. import kotlinx.coroutines.* fun main() { println("메인 스레드 시작") runBlocking { println("부모 task 시작") launch { println("..

Database Index [내부링크]

인덱스란? 데이터베이스 인덱스는 데이터베이스의 효율적인 검색 및 데이터 접근을 지원하기 위해 사용되는 자료 구조다. 인덱스는 테이블의 컬럼 또는 컬럼의 조합에 대한 정렬된 데이터 구조로, 검색 속도를 향상시키고 데이터 접근 시간을 줄여준다. 인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치라고 볼 수 있다. 즉 메모리 영역의 일종의 목차를 생성하는 개념이다. B - Tree 인덱스는 보통 B - Tree라는 자료 구조로 이루어져 있다. B - Tree는 루트 노드, 리프 노드 그리고 루트 노드와 리프 노드 사이에 있는 브랜치 노드로 나뉜다. 트리 탐색은 맨 위 루트 노드부터 탐색이 일어나며 브랜치 노드를 거쳐 리프 노드까지 내려온다. 위의 그림처럼 이렇게 루트 노드부터 시작하여 마지막 리프 노드에 도달..

17142번: 연구소 3 - Kotlin (BFS) [내부링크]

17142번: 연구소 3 인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고 www.acmicpc.net 문제 인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고, 활성 상태인 바이러스는 상하좌우로 인접한 모든 빈 칸으로 동시에 복제되며, 1초가 걸린다. 승원이는 연구소의 바이러스 M개를 활성 상태로 변경하려고 한다. 연구소는 크기가 N×N인 정사각형으로 나타낼 수 있으며, 정사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽..

1600번: 말이 되고픈 원숭이 - Kotlin [내부링크]

1600번: 말이 되고픈 원숭이 첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있 www.acmicpc.net 문제 동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다. 그 녀석은 말(Horse)이 되기를 간절히 원했다. 그래서 그는 말의 움직임을 유심히 살펴보고 그대로 따라 하기로 하였다. 말은 말이다. 말은 격자판에서 체스의 나이트와 같은 이동방식을 가진다. 다음 그림에 말의 이동방법이 나타나있다. x표시한 곳으로 말이 갈 수 있다는 뜻이다. 참고로 말은 장애물을 뛰어넘을 수 있다. x x x x 말 x x x x 근데 원숭이는 한 가지 착각..

15684번: 사다리 조작 - Kotlin (백트래킹, DFS) [내부링크]

15684번: 사다리 조작 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선 www.acmicpc.net 문제 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선이 같은 위치를 갖는다. 아래 그림은 N = 5, H = 6 인 경우의 그림이고, 가로선은 없다. 초록선은 세로선을 나타내고, 초록선과 점선이 교차하는 점은 가로선을 놓을 수 있는 점이다. 가로선은 인접한 두 세로선을 연결해야 한다. 단, 두 가로선이 연속하거나 서로 접..

[Kotlin Coroutine] (2) - 코루틴의 기본 개념 [내부링크]

코루틴이란 together를 뜻하는 co와 작업들의 집합을 뜻하는 Routine이 합쳐져 만들어진 단어로 '협동 루틴'을 뜻한다. 일반적으로 루틴은 하나의 입구와 출구를 가지는 반면, 코루틴은 여러개의 입구와 출구를 가질 수 있다. 이런 특징으로 이전에 실행이 중단된 지점에서 다시 실행을 재개할 수 있는 기능을 가진다. 코루틴의 개념 코루틴을 이해하기 위해서는 3개의 기본 개념을 이해하야 한다. Coroutine Scope (코루틴 스코프): MainScope, GlobalScope, Coroutine Scope 등이 있다. Coroutine Builders (코루틴 빌더): 코루틴을 생성하는 메소드를 의미한다. launch, async, withContext, runBlocking 등이 있다. Coro..

Transaction ACID & Integrity(무결성) [내부링크]

트랜잭션이란? 트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다. 즉 여러 개의 작업을 하나로 묶은 실행 유닛이다. 트랜잭션은 데이터베이스의 일관성과 무결성을 보장하기 위해 사용된다. 트랜잭션은 ACID 원칙에 기반을 두고 있다. Atomicity (원자성) 트랜잭션은 작업의 모든 단계가 완료되거나 아무 것도 수행되지 않은 상태를 보장하는 특징이다. 트랜잭션을 커밋했는데, 문제가 발생해 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것을 말한다. 예를 들어 내가 마트에서 물건을 사려고 한다고 가정해보자. 나는 지금 100만원이 있고 내가 사려는 물건은 50만원이다. 이 때 물건을 구매하기 위해서는 3단계의 과정을 거친다. 1) 내가 얼마를 가지고 있는지 확인한다..

2146번: 다리 만들기 - Kotlin (BFS) [내부링크]

2146번: 다리 만들기 여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다 www.acmicpc.net 문제 여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다는 생각을 하게 되었다. 그래서 그는, 생색내는 식으로 한 섬과 다른 섬을 잇는 다리 하나만을 만들기로 하였고, 그 또한 다리를 가장 짧게 하여 돈을 아끼려 하였다. 이 나라는 N×N크기의 이차원 평면상에 존재한다. 이 나라는 여러 섬으로 이루어져 있으며, 섬이란 동서남북으로 육..

[Kotlin Coroutine] (1) - 자바 동시성, 스레드 [내부링크]

안드로이드 개발을 하다 보면 어쩔 수 없이 동시성에 관련된 문제들을 마주치기 마련이다. 안드로이드 개발에서는 코틀린의 코루틴을 통해 UI 스레드가 중단되는 문제를 효율적으로 처리할 수 있다. 이제부터 코루틴에 대한 기본 개념과 사용 방법을 알아보고자 한다. 자바 동시성 코틀린이 존재하기 전 자바에서는 동시성을 어떻게 처리했을까? 바로 자바 동시성 기본 요소를 사용하는 것이다. 자바 동시성 기본 요소를 사용하면 스레드 안전성을 달성할 수 있다. 하지만 엄청난 단점이 존재한다. 대부분의 동시성 연산이 Blocking 연산임으로 스레드를 블럭하고 실행을 재개할 때 Context Switch(문맥 교환)를 해야 하므로 프로그램 성능에 부정적인 영향을 미치게 된다. 그래서 동시성 스레드를 많이 사용하는 것은 비실..

Serializable & Parcelable [내부링크]

안드로이드 앱을 개발할 때 데이터를 전달해야 하는 경우가 있다. 이 때 복잡한 클래스의 객체를 이동하려는 경우 Serializable 또는 Parcelable을 사용해 직렬화하여 데이터를 전달해야 한다. 이제부터 이 2가지에 대해서 알아보도록 하겠다. ※ 직렬화란? 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 바이트 코드 형태로 나열하는 것 JVM의 메모리에 상주 되어있는 객체 데이터를 바이트 형태로 변환하는 기술 Serializable 자바에서는 Value Object를 쉽게 직렬화 하기위해 Android SDK가 아닌 표준 자바의 인터페이스인 Serializable 이라는 인터페이스가 있다. 이 인터페이스를 구현한 클래스는 다음과 같다. By Java import java.io.Se..

운영체제(5) - CPU Scheduling Algorithm [내부링크]

CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야 하는 일을 스레드 단위로 CPU에 할당한다. 이 때 어떤 프로그램에 CPU 소유권을 줄 것인지 결정하는 것이 바로 CPU 스케줄링 알고리즘이다. CPU 스케줄링 알고리즘은 다음과 같이 나눌 수 있다. Non Preemptive (비선점형) 비선점형 방식은 프로세스가 스스로 CPU 소유권을 포기하는 방식으로 강제로 프로세스를 중지하지 않는다. FCFS (First Come First Served) 큐에 가장 먼저 도착한 순서대로 CPU 할당 실행 시간이 짧은 게 뒤로 가면 평균 대기 시간이 길어짐으로 준비 큐에서 오래 기다리는 현상인 'Convoy Effect' 가 발생한다 SJF (Shortest Job First) 수행시간이 가장 짧다..

운영체제(4) - DeadLock (교착 상태) [내부링크]

교착 상태란? 교착 상태는 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태이다. 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되는 상태가 그러하다. 교착 상태의 원인으로는 다음 4가지가 존재한다. 1. 상호 배제 (Mutual Exclusion): 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능하다. 2. 점유 대기 (Hold and W..

5052번: 전화번호 목록 - Kotlin [내부링크]

5052번: 전화번호 목록 첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 www.acmicpc.net 문제 전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오. 전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다. 예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자 긴급전화: 911 상근: 97 625 999 선영: 91 12 54 26 이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 ..

2293번: 동전 1 - Kotlin [내부링크]

2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. www.acmicpc.net 문제 n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다. 사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다. 입력 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 ..

4485번: 녹색 옷 입은 애가 젤다지? (BFS) [내부링크]

4485번: 녹색 옷 입은 애가 젤다지? 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주 www.acmicpc.net 문제 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹..

CI / CD [내부링크]

CI / CD란 무엇인가? CI / CD는 소프트웨어 개발과정에서 품질 향상과 빠른 제품 출시를 위해 사용되는 개발 방범론과 관련된 개념이다. CI / CD의 기본 개념은 기속적인 통합, 지속적인 서비스 제공, 지속적인 배포이다. CI / CD는 새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제를 해결하기 위한 솔루션이다. 특히, CI / CD는 애플리케이션의 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션의 라이프사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공한다. 이런 구축 사례를 일반적으로 "CI / CD 파이프라인" 이라 부르며, 개발 및 운영팀의 애자일 방식 협력을 통해 DevOps 또는 SRE(사이트 신뢰성 엔지니어링) 방식으로 지원된다. CI (Cont..

운영체제(3) - 공유 자원과 임계 영역 [내부링크]

공유 자원은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 메모리, 파일, 데이터 등의 자원이나 변수를 의미한다. 이런 상태의 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태라고 한다. Race Condition (경쟁 상태) 경쟁 상태는 공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태를 말한다. 이런 상태는 동시 접근 시 일관성을 해치는 결과가 나타날 수 있다. 경쟁 상태가 발생하는 경우는 다음과 같다. 공유 데이터 접근: 여러 스레드 또는 프로세스가 공유된 메모리나 파일 등의 데이터에 동시에 접근하고 수정하려고 할 때 경쟁 상태가 발생할 수 있다. 예를 들어, 한 스레드가 데이터를 수정하는 도중에 다른 스레드가 같은 데이터를 읽..

12851번: 숨바꼭질 2 - Kotlin (BFS) [내부링크]

12851번: 숨바꼭질 2 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장..

1647번: 도시 분할 계획 - Kotlin (최소 스패닝 트리) [내부링크]

1647번: 도시 분할 계획 첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 www.acmicpc.net 문제 동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다. 그러다가 평화로운 마을에 가게 되었는데, 그곳에서는 알 수 없는 일이 벌어지고 있었다. 마을은 N개의 집과 그 집들을 연결하는 M개의 길로 이루어져 있다. 길은 어느 방향으로든지 다닐 수 있는 편리한 길이다. 그리고 각 길마다 길을 유지하는데 드는 유지비가 있다. 마을의 이장은 마을을 두 개의 분리된 마을로 분할할 계획을 가지고 있다. 마을이 너무 커서 혼자..

1197번: 최소 스패닝 트리 - Kotlin (크루스칼) [내부링크]

1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net 문제 그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하는 프로그램을 작성하시오. 최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 말한다. 입력 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다..

2252번: 줄 세우기 - Kotlin (위상 정렬) [내부링크]

2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의 www.acmicpc.net 문제 N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다. 일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오. 입력 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 1..

9663번: N-Queen - Kotlin (백트래킹) [내부링크]

9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (1 ≤ N < 15) 출력 첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다. 위의 문제에서 가장 먼저 생각해야 할 것은 퀸들은 같은 열이나 행, 대각선에 존재할 수 없다는 것이다. 만약 이 문제를 일반적인 DFS방식으로 풀려고 한다면 퀸들을 배정..

JVM & JRE & JDK [내부링크]

자바를 공부해본 사람이라면 자바는 플랫폼에 독립적이고, WORA("Write Once Run Anywhere" - 한 번 작성하면 모든 곳에서 돌릴 수 있다)는 말을 들어봤을 것이다. public class Main { public static void main(String[] args) { for (int i = 1; i < 10; i++) { System.out.println("%d ", i); } } } 우리가 위와 같이 자바로 코드를 작성하면 컴퓨터는 이 내용을 바로 이해하지 못한다. 그래서 우리는 우리가 작성한 코드를 컴퓨터가 이해할 수 있게 바꿔주는 과정이 필요하다. 이걸 코드를 번역(Compile) 한다고 한다. 작성한 언어를 번역하느냐, 혹은 통역(Interpret) 하느냐에 따라 나뉠 수..

1744번: 수 묶기 - Kotlin [내부링크]

1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net 문제 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다. 예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열..

13913번: 숨바꼭질 4 - Kotlin [내부링크]

13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠..

Sealed Class [내부링크]

때로는 우리가 프로그램에서 표현하고 싶은 개념이 몇 가지 정해진 변종의 집합으로 구성될 때가 있다. 이런 경우에는 똑같은 타입을 공유하는 미리 정의된 상수 집합을 표현하는 이넘 클래스를 사용해 표현할 수 있다. 이넘 클래스에 대한 설명은 아래의 게시글에서 참고할 수 있다. Enum Class 이넘 클래스란? 이넘 클래스는 미리 정의된 상수들로 이뤄진 제한된 집합을 표현하는 클래스다. 정수, 문자열 등과 비교할 때 이넘을 사용하면 어떤 값이 가능한 범위 안에 들어가 있는지를 일 everyday-develop-myself.tistory.com 하지만 어떤 경우에는 각 종류별로 애트리뷰트가 다를 수 있다. 한번 어떤 계산이 성공인지 실패인지를 표현하는 예제를 추상 클래스를 사용해 만들어 보겠다. 다만 성공인 ..

Enum Class [내부링크]

이넘 클래스란? 이넘 클래스는 미리 정의된 상수들로 이뤄진 제한된 집합을 표현하는 클래스다. 정수, 문자열 등과 비교할 때 이넘을 사용하면 어떤 값이 가능한 범위 안에 들어가 있는지를 일일이 검사할 필요가 없으므로, 정해진 상수들로 이뤄진 집합을 타입 안전하게 아룰 수 있다. 다음은 간단한 이넘 클래스의 예시이다. enum class Result { SUCCESS, ERROR } fun Result.isSuccess() = this == Result.SUCCESS fun main() { println(Result.SUCCESS.isSuccess()) // true println(Result.ERROR.isSuccess()) // false } 추가로 이넘은 내부 클래스나 함수 본문에서 정의할 수 없다. ..

Abstract Class & Interface [내부링크]

보통의 상위 클래스는 자기 자신에 대한 인스턴스를 만들 수 있는 타입들이다. 하지만 별도의 인스턴스가 있을 수 없고 구체적인 경우를 구현한 다른 클래스의 인스턴스만 만들 수 있는 추상적인 개념을 표현하는 클래스라면 인스턴스 생성은 바람직하지 않다. 그렇다면 추상적인 개념을 표현하려면 어떤 타입의 클래스를 사용해야 할까? 이 질문에 대한 대답이 바로 추상 클래스이다. 추상 클래스란? 추상 클래스는 자바에서도 지원하는 방식이다. 추상 클래스는 직접 인스턴스화 할 수 없고 다른 클래스의 상위 역할만 할 수 있는 클래스를 뜻한다. 클래스를 추상 클래스로 만들기 위해서는 abstract라는 변경자 키워드를 붙여야 한다. abstract class Entity(val name: String) // Success: ..

개인정보 수집 유효기간 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다. 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 20..

1309번: 동물원 [내부링크]

1309번: 동물원 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. www.acmicpc.net 문제 어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다. 이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다. 동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다. 입력 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. 출력 첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 ..

1629번: 곱셈 - Kotlin (분할 정복을 이용한 거듭제곱) [내부링크]

1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 문제 자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.3 출력 첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다. 나의 풀이 이 문제는 분할 정복 알고리즘을 사용해서 해결하는 거듭제곱을 진행하는 방법을 묻는 문제이다. 분할 정복 알고리즘에 대한 설명은 아래의 게시글에서 확인할 수 있다. 일단 ..

15685: 드래곤 커브 - Kotlin [내부링크]

15685번: 드래곤 커브 첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커 www.acmicpc.net 문제 드래곤 커브는 다음과 같은 세 가지 속성으로 이루어져 있으며, 이차원 좌표 평면 위에서 정의된다. 좌표 평면의 x축은 → 방향, y축은 ↓ 방향이다. 시작 점 시작 방향 세대 0세대 드래곤 커브는 아래 그림과 같은 길이가 1인 선분이다. 아래 그림은 (0, 0)에서 시작하고, 시작 방향은 오른쪽인 0세대 드래곤 커브이다. 1세대 드래곤 커브는 0세대 드래곤 커브를 끝 점을 기준으로 시계 방향으로 90도 회전시킨 다음 0세대 드래곤 ..

11660번: 구간 합 구하기 5 - Kotlin [내부링크]

https://www.acmicpc.net/problem/11660 11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 문제 N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는 프로그램을 작성하시오. (x, y)는 x행 y열을 의미한다. 예를 들어, N = 4이고, 표가 아래와 같이 채워져 있는 경우를 살펴보자. 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7 여기서 (2, 2)부터 (3, 4)까지 합을 구하면 3..

14002번: 가장 긴 증가하는 부분 수열 4 - Kotlin [내부링크]

14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 ..

9465번: 스티커 - Kotlin [내부링크]

9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에..

1339번: 단어 수학 - Kotlin [내부링크]

1339번: 단어 수학 첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대 www.acmicpc.net 문제 민식이는 수학학원에서 단어 수학 문제를 푸는 숙제를 받았다. 단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다. 이때, 각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제이다. 같은 알파벳은 같은 숫자로 바꿔야 하며, 두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다. 예를 들어, GCF + ACDEB를 계산한다고 할 때, A = 9, B = 4, C = 8, D = 6,..

1261번: 알고스팟 - Kotlin (0-1 BFS) [내부링크]

1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미 www.acmicpc.net 문제 알고스팟 운영진이 모두 미로에 갇혔다. 미로는 N*M 크기이며, 총 1*1크기의 방으로 이루어져 있다. 미로는 빈 방 또는 벽으로 이루어져 있고, 빈 방은 자유롭게 다닐 수 있지만, 벽은 부수지 않으면 이동할 수 없다. 알고스팟 운영진은 여러명이지만, 항상 모두 같은 방에 있어야 한다. 즉, 여러 명이 다른 방에 있을 수는 없다. 어떤 방에서 이동할 수 있는 방은 상하좌우로 인접한 빈 방이다. 즉, 현재 운영진이 (x, y)에 있을 때..

9019번: DSLR - Kotlin [내부링크]

9019번: DSLR 네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 www.acmicpc.net 문제 네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 저장된 n을 다음과 같이 변환한다. n의 네 자릿수를 d1, d2, d3, d4라고 하자(즉 n = ((d1 × 10 + d2) × 10 + d3) × 10 + d4라고 하자) D: D 는 n을 두 배로 바꾼다. 결과 값이 9999 보다 ..

9953번: 문자열 폭발 - Kotlin (스택) [내부링크]

9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모 www.acmicpc.net 문제 상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다. 폭발은 다음과 같은 과정으로 진행된다. 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다. 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다. 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다. 상근이는 모든 폭발..

3055번: 탈출 - Kotlin (BFS) [내부링크]

3055번: 탈출 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제 www.acmicpc.net 문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나타내어져 있다. 매 ..

11052번: 카드 구매하기 - Kotlin [내부링크]

11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net 문제 요즘 민규네 동네에서는 스타트링크에서 만든 PS카드를 모으는 것이 유행이다. PS카드는 PS(Problem Solving)분야에서 유명한 사람들의 아이디와 얼굴이 적혀있는 카드이다. 각각의 카드에는 등급을 나타내는 색이 칠해져 있고, 다음과 같이 8가지가 있다. 전설카드 레드카드 오렌지카드 퍼플카드 블루카드 청록카드 그린카드 그레이카드 카드는 카드팩의 형태로만 구매할 수 있고, 카드팩의 종류는 카드 1개가 포함된 카드팩, 카드 2개가 포함된 카드팩, ... 카드 N..

DAO, DTO, VO란? [내부링크]

DAO (Data Access Object) 란? DAO란 데이터베이스나 외부 데이터 소스에 접근하는 작업을 담당하는 객체이다. 데이터베이스와의 통신이나 CRUD(Create, Read, Update, Delete) 연산을 수행하는 쿼리 작성 등의 역할을 담당한다. 다른말로 데이터베이스에 접근하기 위한 로직 & 비즈니스 로직을 분리하기 위해 사용한다. DTO (Data Transfer Object) 란? 데이터 전송을 위한 객체로, 여러 계층 또는 시스템 간 데이터 교환에 사용된다. 주로 데이터베이스에서 조회한 데이터나 서비스 간에 데이터를 전달할 때 사용한다. 데이터를 보관하고 전송하는 목적으로 사용되며, 주로 getter/setter 메서드와 필드만을 가지는 단순한 구조를 갖는다. VO (Value ..

Strategy Pattern(전략 패턴) by kotlin [내부링크]

전략 패턴이란? 전략 패턴은 정책 패턴이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔 주면서 상호 교체가 가능하게 만드는 패턴이다. 이 패턴은 알고리즘을 독립적인 클래스로 정의하고, 클라이언트에서는 알고리즘 클래스를 인터페이스를 톨해 사용한다. 이렇게 함으로써 클라이언트는 알고리즘의 구체적인 구현과 분리되어 유연성과 확장성을 높일 수 있다. 클라이언트는 실행 시간에 다른 알고리즘 클래스를 선택하여 사용할 수 있으며, 이를 통해 동일한 인터페이스를 가진 다양한 알고리즘을 적용할 수 있다. 전략 패턴은 다음과 같은 장점이 있다. 유연성: 알고리즘을 캡슐화하고 교체 가능하게 함으로써, 실행 시간에 알고리즘을 변경할 수 있다. 확장성..

2156번: 포도주 시식 - Kotlin [내부링크]

2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 문제 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다. 효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하..

1932번: 정수 삼각형 - Kotlin [내부링크]

1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net 문제 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다. 입력 첫째 줄에 삼각형의 크기..

1149번: RGB 거리 - Kotlin [내부링크]

1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. 1번 집의 색은 2번 집의 색과 같지 않아야 한다. N번 집의 색은 N-1번 집의 색과 같지 않아야 한다. i(2 ≤ i ≤ N-1)번 집의 색..

변수 캡슐화하기 (Encapsulate Variable) [내부링크]

변수 캡슐화란? 변수 캡슐화는 객체 지향 프로그래밍에서 중요한 원칙 중 하나이다. 이는 클래스의 맴버 변수를 외부에서 직접 접근하는 것이 아니라, 해당 변수에 대한 접근을 제한하고 메서드를 통해 간접적으로 변수에 접근하는 것을 말한다. 변수 캡슐화를 하면 다음과 같은 이점이 생긴다. 정보 은닉: 변수를 private로 선언할 수 있어 클래스 내부의 데이터를 보호하고, 외부에 불필요한 세부 구현을 감춘다. 접근 제어: getter와 setter 메서드를 통해 변수에 접근하므로, 변수에 대한 유효성 검사, 제한된 접근 권한 설정 등을 수행할 수 있다. 유연성과 유지보수성: 변수에 대한 의존성을 제한하여 클래스 내부의 구현 변경에 유연하기 대처할 수 있으며, 코드의 유지보수성을 향상시킨다. 설명만 듣고선 알기..

Factory Pattern(팩토리 패턴) by Kotlin [내부링크]

팩토리 패턴이란? 팩토리 패턴(Factory Pattern)은 객체를 생성할 때 사용되는 디자인 패턴이다. 이 패턴은 객체 생성을 캡슐화하고, 클라이언트 코드와 객체 생성 코드를 분리함으로써 유연성과 확장성을 제공한다. 일반적으로 팩토리 패턴은 추상화된 인터페이스를 정의하고, 이를 구현하는 여러개의 팩토리 클래스를 만들어 사용한다. 클라이언트는 팩토리 인터페이스를 통해 객체를 생성하고 반환받을 수 있다. 팩토리 클래스는 객체 생성에 대한 로직을 구현하고, 실제 객체의 인스턴스를 생성하여 반환한다. 간단하게 말하자만 객체를 생성하는 부분을 Sub Class에 맡긴다고 생각하면 된다. 팩토리 패턴은 다음과 같은 장점이 있다. 객체의 생성을 중앙집중화해 코드의 유지보수성과 확장성을 향상시킨다. 구체적인 구현클..

1759번: 암호 만들기 - Kotlin (DFS) [내부링크]

1759번: 암호 만들기 첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다. www.acmicpc.net 문제 바로 어제 최백준 조교가 방 열쇠를 주머니에 넣은 채 깜빡하고 서울로 가 버리는 황당한 상황에 직면한 조교들은, 702호에 새로운 보안 시스템을 설치하기로 하였다. 이 보안 시스템은 열쇠가 아닌 암호로 동작하게 되어 있는 시스템이다. 암호는 서로 다른 L개의 알파벳 소문자들로 구성되며 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다고 알려져 있다. 또한 정렬된 문자열을 선호하는 조교들의 성향으로 미루어 보아 암호를 이루는 알..

15686번 치킨 배달 (DFS)- Kotlin [내부링크]

15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net 문제 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. ..

1-3. Gradient Descent (경사 하강법) [내부링크]

머신러닝에 대해서는 아래의 유튜브를 통해 학습하였다. Gradient Descent (경사 하강법) 경사 하강법은 머신 러닝과 최적화 알고리즘에서 매개변수를 조정하여 함수의 최솟값을 찾는 기법이다. 주어진 함수의 기울기를 활용하여 최적의 매개변수 값을 찾아가는 방법이다. 경사 하강법은 일반적으로 손실 함수를 최소화하는데 사용된다. 손실 함수는 모델의 예측값과 실제값 사이의 차이를 나타내는 함수로, 모델의 성능을 평가하는 지표이다. 경사 하강법은 손실 함수의 기울기를 따라 가장 빠르게 감소하는 방향으로 매개변수를 업데이트하여 최적의 매개변수 값을 찾아낸다. 경사 하강법에서 매개변수는 일반적으로 2가지가 있다. - 학습률 (learing rate): 평가 하는 데이터의 보폭, 일반적으로 (0.001, 0.0..

1-2. 데이터 세트 분리 [내부링크]

머신러닝에 대해서는 아래의 유튜브를 통해 학습하였다. 데이터 세트 분리 데이터 세트 분리는 머신 러닝 모델을 학습, 검증 및 테스트하기 위해 사용되는 데이터를 적절하기 나누는 과정이다. 일반적으로 우리가 가지고 이는 데이터를 훈련 세트와, 테스트 세트로 분류를 하게 된다. 전체 데이터의 80에 해당하는 만큼을 가지고 머신 러닝 모델을 훈련시킨 다음, 나머지 20에 해당하는 테스트 세트로 모델이 잘 동작하는가 평가를 하게 된다. 데이터 세트 분리의 목적은 모델이 학습 데이터에 과적합 되지 않고 새로운 데이터에 대해 일반화할 수 있는 능력을 갖추도록 하는 것이다. 학습 세트를 사용하여 모델을 학습시키고 검증 세트를 사용하여 모델의 성능을 조정하며, 테스트 세트를 사용하여 최종적인 성능을 평가한다. 데이터 세..

1-1. Linear Regression [내부링크]

머신러닝에 대해서는 아래의 유튜브를 통해 학습하였다. Linear Regression (선형 회귀) 선형 회귀는 통계학과 머신 러닝에서 가장 기본적이고 널리 사용되는 예측 모델 중 하나로, 입력 변수와 출력 변수 간의 선형 관계를 모델링하려는 것이다. 간단히 말해, 선형 회귀는 주어진 입력 변수에 대해 출력 변수를 예측하는 작업을 수행한다. 입력 변수는 종종 '독립 변수' 또는 '특성' 이라고도 불리며, 출력 변수는 '종속 변수' 라고도 불린다. 선형 회귀는 입력 변수와 출력 변수 사이의 선형적인 관계를 가정하고, 이 관계를 통해 새로운 입력 값에 대한 출력 값을 예측하는 것이 목표이다. 선형 회귀는 기본적으로 선형 방정식을 통해 모델을 구성한다. 간단한 경우를 살펴보자. 하나의 입력변수(x)와 하나의 ..

Machine Learning의 분류 [내부링크]

안드로이드 개발자를 목표로 하고 있는 사람으로서 머신러닝을 공부하지 않는다는 것은 한계가 분명 명확할 것이라고 생각한다. 머신러닝을 완벽하게는 아니더라도 어떤게 있고 나중에 프로젝트를 진행할 때, 어떤 방식으로 머신러닝을 진행하야 하는지, 학습방식은 어떤 방식이 있는지에 대해 미리 알고 있는것은 나중에 나에게 그런 일이 주어졌을 때에 큰 힘이 될 것이다. 그래서 이제부터 머신러닝은 어떤것이고, 어떤 학습방식이 있는지에 대해서 알아보려고 한다. 머신러닝에 대해서는 아래의 유튜브를 통해 학습하였다. 머신러닝이란? 머신러닝은 컴퓨터 시스템이 데이터로부터 학습하고 패턴을 식별하며 예측하는 방법이다. 기본적으로, 머신러닝은 명시적인 프로그래밍 없이 데이터를 분석하여 패턴과 통찰력을 발견하고 이를 기반으로 결정을 ..

REST API, Retrofit [내부링크]

요즘 들어 개인 프로젝트를 진행한다고 블로그를 작성하는 것에 소홀했었다. 안드로이드 개발을 한다고 하면 반드시 마주치게 되는 것이 바로 REST API와 Retrofit이다. 안드로이드 스튜디오 자체에서 다 해결할 수 있다면 사용하지 않을 수 도 있겠지만 앵간하면 분명 위의 2가지와 마주치게 될 것이다. 좋은 개발자가 되기 위해서는 관련 개념에 대한 깊은 이해가 필요하기에 이 게시글을 통해 이해를 하고 넘어가고자 한다. REST API REST API는 REpresentational State Transfer API의 약자로 HTTP 프로토콜을 사용해서 클라이언트와 서버 간 통신을 위한 아키텍처를 정의하는 웹 서비스 디자인 패턴이다. HTTP & HTTPS HTTP(HyperText Transfer Pr..

REST API에서 HATEOAS란? [내부링크]

HATEOAS란? HATEOAS(Hypermedia as th engine of application state)는 클라이언트가 API에서 제공되는 자원 간 관계를 탐색하고 이를 통해 애플리케이션 상태를 변경할 수 있는 기능을 제공한다. 만약 REST API에서 HATEOAS를 적용하지 않은 응답 예시를 들어보면, 클라이언트가 서버에스 응답받은 리소스의 URI를 기반으로 클라이언트가 가능한 동작을 수행하기 어렵다는 것이다. 이를 예를 들어 설명해 보겠다. 다음과 같은 REST API가 있다고 가정해 보겠다. GET /users/1 위의 API를 호출하면 서버는 클라이언트에게 원하는 유저의 정보를 반환할 수 있다. 그 응답은 아래와 같다. { "id": 1, "name": "John Smith", "em..

Adapter Pattern(어댑터 패턴) by Java, Kotlin [내부링크]

어댑터 패턴이란? 어댑터 패턴(Adapter pattern)은 소프트웨어 공학에서 사용되는 디자인 패턴 중 하나로, 기존의 클래스를 새로운 인터페이스에 맞게 변환하여 재사용할 수 있도록 해주는 패턴이다. 어떤 클래스나 객체를 다른 클래스나 객체에서 사용하려면, 그것들이 호환되는 인터페이스를 가져야 한다. 하지만 기존에 존재하는 클래스나 객체가 원하는 인터페이스를 갖추고 있지 않을 경우에는, 새로운 클래스나 객체를 만들거나, 기존 클래스나 객체를 수정해야 하는 경우가 있다. 이때 어댑터 패턴을 사용하면, 기존 클래스나 객체를 수정하지 않고도 새로운 인터페이스를 제공할 수 있다. 어댑터 패턴은 크게 두 가지 종류가 있다. 클래스 어댑터 패턴과 객체 어댑터 패턴이다. 클래스 어댑터 패턴은 기존 클래스를 상속받..

Singleton Pattern(싱글턴 패턴) by Java, Kotlin [내부링크]

싱글턴 패턴이란? 싱글턴 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 애플리케이션에서 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 패턴이다. 즉, 해당 클래스의 인스턴스가 오직 하나뿐이며, 어디서든지 그 인스턴스에 접근하여 사용할 수 있도록 만들어 준다. 싱글턴 패턴을 사용하는 이유는 다음과 같다. 자원 공유: 여러 객체에서 하나의 인스턴스를 공유하여 사용할 수 있다. 이를 통해 자원을 효율적으로 사용할 수 있다. 객체의 생성 비용 최소화: 인스턴스가 한 번 생성된 이후에는 다시 생성하지 않기 때문에, 객체 생성 비용이 큰 경우에 사용하면 효율적이다. 인스턴스의 수 제한: 클래스의 인스턴스가 하나뿐이기 때문에, 불필요한 인스턴스 생성을 방지할 수 있다. 싱글톤 패턴을 구현하..

1912번: 연속합 - Kotlin [내부링크]

1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 문제 n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다. 예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다. 입력 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1..

TCP / IP 계층에서 데이터 전달에 따른 프로토콜 동작 [내부링크]

TCP / IP 란? TCP / IP는 인터넷에서 데이터 통신을 위해 사용되는 프로토콜이며, 인터넷의 핵심 프로토콜로서 전 세계적으로 사용되고 있다. TCP/IP는 Transmission Control Protocol (TCP)와 Internet Protocol (IP) 두 개의 프로토콜로 구성되어 있다. TCP는 연결 지향적인 프로토콜로서, 안정적인 데이터 전송을 보장한다. 데이터를 전송하기 전에 먼저 연결을 설정하고, 데이터 전송이 완료된 후에는 연결을 종료한다. 이를 통해 데이터 손실을 최소화하고, 중복 전송을 방지하여 안정적인 데이터 전송을 보장한다. TCP / IP는 다음과 같은 계층적인 구조로 이루어져 있다. Application Layer(애플리케이션 계층): 응용 프로그램에서 사용하는 프로..

[Android Studio] 네이버 SENS로 SMS 인증 기능 Retrofit 구현하기 with kotlin (2) [내부링크]

Retrofit Interface 작성 이제부터는 API를 사용하기 위한 Retrofit Interface를 작성하겠다. Retrofit에 대한 이해가 없다면 Retrofit에 대해 공부를 하고 다시 돌아오는 것이 좋을 수 있다. 당장 따라서 구현하는 것은 할 수 있겠지만 앞으로 수도없이 사용할 것이기에 Retrofit에 대해 완벽하게 이해를 하는 것이 좋다. SMS API api.ncloud-docs.com API 통신을 하기 위해서는 위의 문서를 반드시 참고하여야 한다. Retrofit와 Rest API에 대한 지식이 충분하다면 위의 문서만으로도 충분히 구현할 수 있다. Retrofit을 사용하기 위해서는 가장 먼저 인터페이스를 통해 API 요청을 정의해야 한다. HTTP 메서드(GET, POST, ..

[Android Studio] 네이버 SENS로 SMS 인증 기능 Retrofit 구현하기 with kotlin (1) [내부링크]

나는 현재 개인 프로젝트를 진행하고 있다. 그 중에서, 지금은 회원가입 기능을 구현하고 있다. 회원가입을 할 때 우리가 항상 하는 것이 바로 SMS 인증이다. 국내에는 현재 무료로 이용할 수 있는 SMS 인증을 지원하는 API가 여러가지 존재한다. 나는 간단하게 핸드폰으로 6자리 랜덤 문자를 보내고 인증을 받을 수 있는 기능을 구현하고 싶어 여러가지 API들을 찾아보았다. 그런데 생각보다 관련 정보가 많이 없어서 이 블로그를 통해 나와 같은 고민이 있는 사람에게 도움이 되었으면 좋겠다는 생각에 글을 작성한다. 나는 직접적으로 SMS 인증을 지원하는 API를 사용하지 않고 간단하게 구현을 하려고 하였다. 그래서 SMS를 보낼 수 있는 API인 네이버 SENS를 사용해서 SMS 인증 기능을 구현하였다. 시작..

2579번: 계단 오르기 - Kotlin [내부링크]

2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 문제 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉..

9466번: 텀 프로젝트 - Kotlin (BFS) [내부링크]

9466번: 텀 프로젝트 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을 www.acmicpc.net 문제 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을 수도 있다. 프로젝트 팀을 구성하기 위해, 모든 학생들은 프로젝트를 함께하고 싶은 학생을 선택해야 한다. (단, 단 한 명만 선택할 수 있다.) 혼자 하고 싶어하는 학생은 자기 자신을 선택하는 것도 가능하다. 학생들이(s1, s2, ..., sr)이라 할 때, r=1이고 s1이..

Retrofit 이란? [내부링크]

Retrofit 이란? Retrofit은 Square에서 개발한 안드로이드 및 Java용 HTTP 클라이언트 라이브러리이다. RESTful API와 통신하기 위해 사용된다. Retrofit은 OkHttp 라이브러리와 함께 작동하여 간편하게 HTTP 요청을 만들고 응답을 처리할 수 있다. Retrofit은 간단하게 인터페이스를 정의하고, 이를 기반으로 HTTP 요청 및 응답 처리를 자동으로 생성할 수 있다. Retrofit Annotation (어노테이션) Retrofit의 핵심 개념 중 하나는 어노테이션을 사용하여 인터페이스 메서드를 HTTP 요청으로 매핑하는 것이다. 예를 들어, @GET, @POST, @PUT, @DELETE와 같은 어노테이션을 사용하여 HTTP 메서드를 지정하고, @Path, @Qu..

6. Retrofit을 이용한 AWS EC2 서버 통신 [내부링크]

이제부터는 우리가 지금까지 만들었던 서버와 Android간의 데이터 전달을 위한 Android 코드를 만들것이다. Android Studio의 코드를 작성하는데 생각보다 너무 많은 시간이 걸려서 이제 게시글을 작성한다. 우리가 할 것은 서버와 통신하기 위한 방법을 찾는 것이다. 서버와 통신할 수 있는 방법은 여러가지가 존재하는데 그 중 가장 많이 사용되고 가장 편리하게 사용할 수 있는 것이 바로 Retrofit이다. Retorfit에 대한 자세한 설명은 다음의 게시글을 참고하길 바란다. Retrofit Interface Retrofit을 사용하기 위해서는 Retrofit 인터페이스를 정의해야 한다. 이를 기반으로 HTTP 요청 및 응답 처리를 자동으로 생성한다. 내가 작성한 인터페이스는 다음과 같다. i..

FTP & FTPS [내부링크]

FTP(File Transfer Protocol) 이란? FTP는 인터넷 상에서 파일을 전송하기 위한 표준 프로토콜이며, TCP/ IP를 이용해 통신한다. FTP는 클라이언트와 서버 간에 데이터를 전송하는 데에 사용되며, 주로 웹 서버와 같은 리눅스 기반의 서버에서 사용된다. 기본적으로 암호화되지 않은 텍스트 기반 프로토콜이므로, 데이터 전송 중에 보안에 취약한면이 있다. 그래서 보안성을 강화한 방식인 FTPS가 개발되었다. 일반적으로 20, 21번 포트를 사용한다. FTPS(File Transfer Protocol Secure) 이란? FTPS는 FTP의 보안 버전으로, SSL/TLS 전용 포트인 990포트나 FTP와 동일한 20, 21 포트를 사용한다. FTPS의 방식은 이전에 설명했던 HTTP에서 ..

SSH & SCP & SFTP [내부링크]

SSH (Secure SHELL, 시큐어 셀) 란? SSH란 인터넷을 통해 다른 컴퓨터나 서버에 안전하게 원격으로 접속하고 명령을 실행하는 프로토콜이다. SSH는 암호화된 통신을 사용하기 때문에, 인터넷을 통해 전송되는 데이터가 제3자에게 노출되는 것을 방지할 수 있다. SSH 연결을 설정하려면 SSH 클라이언트를 사용하여 원격 컴퓨터에 접속하고, 원하는 작업을 수행한다. 일반적으로, SSH 클라이언트는 Unix 또는 Linux 시스템에서 기본으로 제공된다. Windows 운영체제를 사용하는 경우, PuTTY와 같은 SSH 클라이언트를 설치해야 한다. SSH는 어디에 사용하는가? 원격 서버에 로그인: SSH를 사용해 원격 서버에 로그인하면 로컬 머신에서 작업한 것과 동일한 명령을 원격 서버에서 수행할 수..

SSL & TLS [내부링크]

SSL(Secure Sockets Layer) 이란? SSL은 클라이언트와 서버 간의 통신을 암호화하는 보안 프로토콜이다. SSL 3.0 버전에서 보안 취약점이 발견되어, 이후 버전에서는 TLS 프로토콜이 사용된다. TLS는 SSL과 호환되며, 더욱 강력한 암호화 기능을 제공한다. 'HTTPS://' 로 사용되는 웹 사이트가 있다면 SSL을 사용하는 경우라고 볼 수있다. TLS(Transport Layer Security) TLS는 클라이언트와 서버 간의 통신을 암호화하기 위해 대칭키 암호화와 공개키 암호화를 혼합하여 사용한다. 대칭키 암호화는 데이터를 전송하는 데 사용되며, 공개키 암호화는 대칭키를 안전하게 전달하기 위해 사용된다. 또한, TLS는 디지털 인증서를 사용해 서버의 신원을 확인한다. 디지털..

HTTP & HTTPS [내부링크]

HTTP(HyperText Transfer Protocol) 이란? 기본적으로 HTTP는 애플리케이션 계층에서 인터넷에서 웹 페이지를 전송하기 위해 사용되는 프로토콜이다. HTTP는 클라이언트와 서버 간에 데이터를 주고받을 수 있는 규칙을 정의하고 있다. 클라이언트는 웹 브라우저를 통해 서버에 HTTP 요청을 보내면, 서버는 이 요청에 대한 응답을 다시 클라이언트에게 전송한다. 이 과정에서 요청과 응답은 HTTP 메시지 형태로 전송된다. HTTP는 일반적으로 TCP/IP 프로토콜을 사용한다. 클라이언트가 요청을 보내면 서버는 이에 대한 응답을 전송하고 연결을 종료한다. 이러한 방식을 '요청 / 응답' 모델이라고 한다. 상태가 존재하지 않는 Stateless 프로토콜 HTTP의 요청 및 응답방식은 인터..

5. Android 연동을 위한 PHP 작성 [내부링크]

이제는 생성된 데이터베이스와 Android를 연동시키기 위한 PHP를 구현해 보겠다. 가장 먼저 해야할 일은 안드로이드 앱과 연동하는 PHP 코드를 작성하는 것이다. PHP 파일을 작성한 다음, SSH 클라이언트를 사용해서 원격 서버로 업로드 하는 과정을 거치면 우리가 원하는 기능을 구현할 수 있다. PHP 개발환경 설정하기 PHP를 작성하기 위해 사용되는 텍스트 에디터는 여러 가지가 존재한다. 그 중에서 가장 유명하고 많이 사용되는 Visual Studio Code 일명 VSCode를 이용해서 PHP를 작성하고자 한다. ① VSCode 환경 설정 1) VSCode 설치 - 아래의 사이트에서 VSCode를 설치할 수 있다. Download Visual Studio Code - Mac, Linux, Win..

14890번: 경사로 - Kotlin [내부링크]

14890번: 경사로 첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다. www.acmicpc.net 문제 크기가 N×N인 지도가 있다. 지도의 각 칸에는 그 곳의 높이가 적혀져 있다. 오늘은 이 지도에서 지나갈 수 있는 길이 몇 개 있는지 알아보려고 한다. 길이란 한 행 또는 한 열 전부를 나타내며, 한쪽 끝에서 다른쪽 끝까지 지나가는 것이다. 다음과 같은 N=6인 경우 지도를 살펴보자. 이때, 길은 총 2N개가 있으며, 아래와 같다. 길을 지나갈 수 있으려면 길에 속한 모든 칸의 높이가 모두 같아야 한다. 또는, 경사로를 놓아서 지나갈 수 있는 길을 만들 수 있다. 경사로는 높이가 ..

4. MySQL Workbench 로 데이터베이스 구축 [내부링크]

이제부터는 개인 프로젝트를 위한 데이터베이스를 구축하기 위한 설정을 마무리하고, 본격적으로 데이터베이스를 만들어보겠다. MySQL Workbench MySQL Workbench는 MySQL 데이터베이스를 관리하고 시각화 하기 위한 공식 GUI 도구이다. 사용자가 데이터베이스를 만들고 수정하며 관리할 수 있도록 그래픽 인터페이스를 제공한다. MySQL Workbench는 데이터베이스 개발, 관리, 설계 및 문서화를 위한 통합 환경을 제공한다. 다양한 툴을 통해 MySQL 서버 관리와 데이터베이스 개발을 할 수 있다. 이런 장점이 많음으로 MySQL Workbench를 이용하고자 한다. 우리는 지금까지 AWS EC2 ubuntu에 APM를 설치하였다. MySQL Workbench의 설치는 아래에서 가능하다...

Database Schema (데이터베이스 스키마) [내부링크]

데이터 베이스 스키마란? 데이터베이스 스키마란, 데이터페이스에서 사용하는 데이터 구조, 데이터베이스 객체의 구성 및 관계 등을 정의하는 논리적인 구조를 의미한다. 데이터베이스 스키마는 데이터베이스의 구조와 데이터의 종류를 정의하는데 사용된다. 즉, 데이터베이스에 저장되는 데이터의 타입, 크기, 제약 조건, 테이블 간의 관계 등을 정의한다. 데이터베이스 스키마는 물리적인 데이터베이스 객체와 무관하며, 데이터베이스 객체를 생성할때 사용되는 템플릿 또는 설계도와 같은 역할을 한다. 따라서, 데이터베이스 스키마는 데이터의 무결성 및 일관성을 유지하기 위한 중요한 요소이다. 데이터베이스 스키마는 대개 데이터베이스 설계자 또는 데이터베이스 관리자가 작성하며, SQL 문법을 사용하여 생성할 수 있다. 예를 들어, C..

3. AWS EC2 인스턴스에 APM 설치 [내부링크]

우리는 이전의 게시글에서 SSH 클라이언트인 PuTTY를 사용해서 AWS EC2 우분투 서버에 로그인을 하였다. 하지만 이것만으로는 개인 프로젝트를 진행할때 백엔드를 다 구축했다고 말할 수 없다. 클라이언트에서 데이터베이스에서 원하는 값을 찾아오기 위해서는 다음 그림과 같은 과정을 거쳐야 한다. 웹 사이트를 개발할 때 Apache는 클라이언트의 요청을 받아들여 정적 웹 페이지를 반환하거나 PHP 스크립트를 실행하여 동적 웹 페이지를 생성하고, PHP는 스크립트를 실행하여 웹 페이지를 생성하고 MySQL은 데이터를 저장하고 관리한다. 이렇게 함께 작동하면서 웹 사이트를 구성하게 된다. 이 과정을 수행하기 위해서는 우리가 할당 받은 AWS EC2 ubuntu 서버에 APM를 설치하는 과정이 필요하다. 이제부..

1644번: 소수의 연속합 - Kotlin (투 포인터, 에라토스테네스의 체) [내부링크]

1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 문제 하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다. 3 : 3 (한 가지) 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지) 53 : 5+7+11+13+17 = 53 (두 가지) 하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다. 자연수가 주어졌을 때, 이 자..

2. SSH를 사용하여 AWS E2C 인스턴스에 로그인하기 [내부링크]

SSH에 대한 이해가 부족한 사람은 아래의 글을 참고하길 바란다 SSH & SCP & SFTP SSH (Secure SHELL, 시큐어 셀) 란? SSH란 인터넷을 통해 다른 컴퓨터나 서버에 안전하게 원격으로 접속하고 명령을 실행하는 프로토콜이다. SSH는 암호화된 통신을 사용하기 때문에, 인터넷을 통해 전 everyday-develop-myself.tistory.com SSH를 사용하여 AWS E2C 인스턴스에 로그인하기 ① PuTTY 다운로드 SSH 명령어를 사용하기 위해서는 SSH 클라이언트 애플리케이션을 설치해야 한다. SSH 클라이언트로는 PuTTY, OpenSSH, SecureCRT 등이 존재한다. 그 중에서 우리는 가장 많이 사용되는 PuTTY를 이용해서 SSH 명령어를 사용하고자 한다. P..

1. 서버 시작하기 by AWS EC2 서버 할당 [내부링크]

이번 게시글은 개인 프로젝트에서 필수적으로 필요한 서버를 할당 받는 방법을 알아보고자 한다. 개인 프로젝트를 시작할때 간단한 프로젝트가 아니라면 서버는 필수적인 요소이다. 서버를 만드는 방법은 크게 두 가지로 나뉜다. 클라우드 서비스 제공 업체에서 인스턴스 생성 AWS, Azure, GCP, DigitalOcean, Linode 등의 클라우드 서비스 제공 업체에서는 쉽게 서버 인스턴스를 생성할 수 있다. 이를 위해서는 해당 업체에서 제공하는 콘솔이나 CLI(Command Line Interface)를 사용하여 인스턴스 생성을 진행하면 된다. 대체로 다음과 같은 단계로 인스턴스를 생성할 수 있다. 원하는 운영 체제 선택 (예: Ubuntu, CentOS, Windows Server 등) 인스턴스 유형 ..

1005번: ACM Craft - Kotlin (위상 정렬) [내부링크]

1005번: ACM Craft 첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부 www.acmicpc.net 문제 서기 2012년! 드디어 2년간 수많은 국민들을 기다리게 한 게임 ACM Craft (Association of Construction Manager Craft)가 발매되었다. 이 게임은 지금까지 나온 게임들과는 다르게 ACM크래프트는 다이나믹한 게임 진행을 위해 건물을 짓는 순서가 정해져 있지 않다. 즉, 첫 번째 게임과 두 번째 게임이 건물을 짓는 순서가 다를 수도 있다. 매 게임시작 시 건물을 짓는 순서가 주어진다. 또한 모든 건물은 각각 건설을..

Topological sort (위상 정렬) with 2252번: 줄 세우기 - Kotlin [내부링크]

위상 정렬이란? 위상 정렬이란 방향이 있는 비순환 그래프(DAG, Directed Acyclic Graph)에서 모든 노드를 방향성에 따라 순서대로 정렬하는 알고리즘이다. 즉, 모든 노드들을 자신을 가리키는 화살표가 있는 다른 노드보다 앞에 오도록 배열하는 것이다. 이 알고리즘은 그래프 내부의 우선순위가 있는 작업들을 수행하는 순서를 결정하기 위해 사용된다. 위상 정렬 알고리즘의 핵심은 진입 차수(in-degree)를 이용하는 것이다. 진입 차수는 어떤 노드로 들어오는 화살표의 수를 의미한다. 위상 정렬은 진입 차수가 0인 노드부터 처리하면서, 해당 노드에서 출발하는 모든 화살표를 제거하고, 그 화살표를 제거한 노드의 진입차수를 감소시킨다. 이러한 과정을 반복하여 모든 노드를 처리하는 순서를 구한다. 위..

가독성이 좋은 코드를 작성해야 하는 이유 [내부링크]

가독성이 좋은 코드를 작성해야 하는 이유 코드가 가독성이 좋다면 여러 가지 이점이 존재한다. 유지보수 용이성: 가독성이 높은 코드는 코드를 수정하거나 유지보수하는 데 더 적은 시간과 노력이 필요하다. 코드를 쉽게 이해할 수 있으므로 버그를 찾고 수정하는 것도 쉬워진다. 협업 용이성: 가독성이 좋은 코드는 여러 사람이 함께 작업할 때 협업을 용이하게 만든다. 다른 사람이 작성한 코드를 빠르게 이해하고 수정할 수 있기 때문이다. 성능 개선: 가독성이 좋은 코드는 더 효율적이며 성능이 더 좋다. 이는 코드를 더욱 간결하게 작성하고 불필요한 코드를 제거하기 때문이다. 코딩 스타일 표준화: 가독성이 좋은 코드는 일관된 코딩 스타일을 유지하기 쉽다. 이는 코드의 가독성을 향상시키고, 일관성을 유지하며, 코드를 더 ..

Dependency Injection (DI, 의존성 주입) with Kotlin [내부링크]

의존성 주입이란? 객체는 다른 객체와 상호작용하면서 필요한 다른 객체에 의존한다. 이러한 의존 관계는 코드를 작성할 때 자연스럽게 발생하는데, 이러한 의존성이 많아지면 코드의 유지보수성이 떨어지고, 객체를 재사용하기 어려워진다. 이 때, 의존성 주입은 객체 간의 결합도를 낮추기 위해, 객체를 생성하는 시점에 필요한 의존성 객체를 외부에서 전달받는 방식이다. 즉, 객체 내부에서 직접 의존 객체를 생성하지 않고, 외부에서 전달받아 사용한다. 의존성 주입은 크게 3가지 방법이 존재한다. 생성자 주입(Constructor Injection): 생성자를 통해 의존 객체를 전달받는다. 세터 주입(Setter Injection): 세터 메서드를 통해 의존 객체를 전달받는다. 필드 주입(Field Injection):..

아키텍처 패턴 - MVVM Pattern with Kotlin [내부링크]

MVVM (Model - View - ViewModel) MVVM은 UI와 비즈니스 로직을 분리하여 개발하는데 사용되는 패턴이다. MVVM는 응용 프로그램을 세 가지의 구성요소로 나눈다. Model - Model은 사용자 인터페이스에 표시되거나 실행될 데이터를 정의하는 인터페이스이다. View - View는 사용자에게 데이터를 표시하는 UI 컴포넌트이다. ViewModel- ViewModel은 View와 Model 간의 통신을 관리하고 View에 표시할 데이터를 제공한다. MVVM 패턴은 View와 ViewModel 사이에서 데이터 바인딩을 사용하여 View와 ViewModel을 느슨하게 결합한다. 이는 ViewModel이 데이터를 업데이트하면 자동으로 View도 업데이트되도록 한다. 또한, ViewMo..

1238번: 파티 - Kotlin [내부링크]

1238번: 파티 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어 www.acmicpc.net 문제 N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다. 어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다. 각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다. 이..

1520번: 내리막 길 - Kotlin [내부링크]

1520번: 내리막 길 여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으 www.acmicpc.net 문제 여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으며, 각 지점 사이의 이동은 지도에서 상하좌우 이웃한 곳끼리만 가능하다. 현재 제일 왼쪽 위 칸이 나타내는 지점에 있는 세준이는 제일 오른쪽 아래 칸이 나타내는 지점으로 가려고 한다. 그런데 가능한 힘을 적게 들이고 싶어 항상 높이가 더 낮은 지점으로만 이동하여 목표 지점까지 ..

2206번: 벽 부수고 이동하기 - Kotlin (BFS) [내부링크]

2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net 문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 ..

2573번: 빙산 - Kotlin (BFS) [내부링크]

2573번: 빙산 첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 www.acmicpc.net 문제 지구 온난화로 인하여 북극의 빙산이 녹고 있다. 빙산을 그림 1과 같이 2차원 배열에 표시한다고 하자. 빙산의 각 부분별 높이 정보는 배열의 각 칸에 양의 정수로 저장된다. 빙산 이외의 바다에 해당되는 칸에는 0이 저장된다. 그림 1에서 빈칸은 모두 0으로 채워져 있다고 생각한다. 2 4 5 3 3 2 5 2 7 6 2 4 그림 1. 행의 개수가 5이고 열의 개수가 7인 2차원 배열에 저장된 빙산의 높이 정보 빙산의 높이는 바닷물에 많이 접해있는 부분..

택배 배달과 수거 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 당신은 일렬로 나열된 n개의 집에 택배를 배달하려 합니다. 배달할 물건은 모두 크기가 같은 재활용 택배 상자에 담아 배달하며, 배달을 다니면서 빈 재활용 택배 상자들을 수거하려 합니다. 배달할 택배들은 모두 재활용 택배 상자에 담겨서 물류창고에 보관되어 있고, i번째 집은 물류창고에서 거리 i만큼 떨어져 있습니다. 또한 i번째 집은 j번째 집과 거리 j - i만큼 떨어져 있습니다. (1 ≤ i ≤ j ≤ n) 트럭에는 재활용 택배 상자를 최대 cap개 실을 수 있습니다. 트럭은 배달할 재활용 택배 ..

교점에 별 만들기 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다. 예를 들어, 다음과 같은 직선 5개를 2x - y + 4 = 0 -2x - y + 4 = 0 -y + 1 = 0 5x - 8y - 12 = 0 5x + 8y + 12 = 0 좌표 평면 위에 그리면 아래 그림과 같습니다. 이때, 모든 교점의 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4), (1.5, 1.0), (2.1, -0.19), (..

혼자서 하는 틱택토 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 틱택토는 두 사람이 하는 게임으로 처음에 3x3의 빈칸으로 이루어진 게임판에 선공이 "O", 후공이 "X"를 번갈아가면서 빈칸에 표시하는 게임입니다. 가로, 세로, 대각선으로 3개가 같은 표시가 만들어지면 같은 표시를 만든 사람이 승리하고 게임이 종료되며 9칸이 모두 차서 더 이상 표시를 할 수 없는 경우에는 무승부로 게임이 종료됩니다. 할 일이 없어 한가한 머쓱이는 두 사람이 하는 게임인 틱택토를 다음과 같이 혼자서 하려고 합니다. 혼자서 선공과 후공을 둘 다 맡는다. 틱택토 게임을 시작한 후 "..

양궁대회 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 카카오배 양궁대회가 열렸습니다. 라이언은 저번 카카오배 양궁대회 우승자이고 이번 대회에도 결승전까지 올라왔습니다. 결승전 상대는 어피치입니다. 카카오배 양궁대회 운영위원회는 한 선수의 연속 우승보다는 다양한 선수들이 양궁대회에서 우승하기를 원합니다. 따라서, 양궁대회 운영위원회는 결승전 규칙을 전 대회 우승자인 라이언에게 불리하게 다음과 같이 정했습니다. 어피치가 화살 n발을 다 쏜 후에 라이언이 화살 n발을 쏩니다. 점수를 계산합니다. 과녁판은 아래 사진처럼 생겼으며 가장 작은 원의 과녁 점수는 ..

이모티콘 할인행사 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 카카오톡에서는 이모티콘을 무제한으로 사용할 수 있는 이모티콘 플러스 서비스 가입자 수를 늘리려고 합니다. 이를 위해 카카오톡에서는 이모티콘 할인 행사를 하는데, 목표는 다음과 같습니다. 이모티콘 플러스 서비스 가입자를 최대한 늘리는 것. 이모티콘 판매액을 최대한 늘리는 것. 1번 목표가 우선이며, 2번 목표가 그 다음입니다. 이모티콘 할인 행사는 다음과 같은 방식으로 진행됩니다. n명의 카카오톡 사용자들에게 이모티콘 m개를 할인하여 판매합니다. 이모티콘마다 할인율은 다를 수 있으며, 할인율은 10%..

순위 검색 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 카카오는 하반기 경력 개발자 공개채용을 진행 중에 있으며 현재 지원서 접수와 코딩테스트가 종료되었습니다. 이번 채용에서 지원자는 지원서 작성 시 아래와 같이 4가지 항목을 반드시 선택하도록 하였습니다. 코딩테스트 참여 개발언어 항목에 cpp, java, python 중 하나를 선택해야 합니다. 지원 직군 항목에 backend와 frontend 중 하나를 선택해야 합니다. 지원 경력구분 항목에 junior와 senior 중 하나를 선..

시소 짝궁 - Kotlin [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/152996#qna 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다. 이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 ..

1715번: 카드 정렬하기 - Kotlin (우선순위큐) [내부링크]

1715번: 카드 정렬하기 정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장 www.acmicpc.net 문제 정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장의 숫자 카드 묶음을 합치려면 50번의 비교가 필요하다. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶..

2003번: 부분합 - Kotlin (투포인터) [내부링크]

1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. 출력 첫째 줄에 구하고자 하는 최..

17298번: 오큰수 - Kotlin (스택) [내부링크]

17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net 문제 크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다. 예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, ..

2580번: 스도쿠 - kotlin (DFS) [내부링크]

2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루 www.acmicpc.net 문제 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루어진 정사각형 판 위에서 이뤄지는데, 게임 시작 전 일부 칸에는 1부터 9까지의 숫자 중 하나가 쓰여 있다. 나머지 빈 칸을 채우는 방식은 다음과 같다. 각각의 가로줄과 세로줄에는 1부터 9까지의 숫자가 한 번씩만 나타나야 한다. 굵은 선으로 구분되어 있는 3x3..

11404번: 플로이드 - Kotlin [내부링크]

11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net 문제 n(2 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다. 모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진..

조이스틱 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. - 다음 알파벳 - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로) - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서) - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서) 예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니..

혼자 놀기의 달인 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 혼자서도 잘 노는 범희는 어느 날 방구석에 있는 숫자 카드 더미를 보더니 혼자 할 수 있는 재미있는 게임을 생각해냈습니다. 숫자 카드 더미에는 카드가 총 100장 있으며, 각 카드에는 1부터 100까지 숫자가 하나씩 적혀있습니다. 2 이상 100 이하의 자연수를 하나 정해 그 수보다 작거나 같은 숫자 카드들을 준비하고, 준비한 카드의 수만큼 작은 상자를 준비하면 게임을 시작할 수 있으며 게임 방법은 다음과 같습니다. 준비된 상자에 카드를 한 장씩 넣고, 상자를 무작위로 섞어 일렬로 나열합니다. 상자..

호텔 대실 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다. 예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요. 나의 풀이 이 문제는 문제의 설명만큼 간단한 그리디 문제이다. 하지만 나는 이 문제를 풀때 중간에 check 부분을 반복문 밖에다가 설정해버려..

마법의 엘리베이터 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특별합니다. 마법의 엘리베이터에는 -1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10c (c ≥ 0 인 정수) 형태인 정수들이 적힌 버튼이 있습니다. 마법의 엘리베이터의 버튼을 누르면 현재 층 수에 버튼에 적혀 있는 값을 더한 층으로 이동하게 됩니다. 단, 엘리베이터가 위치해 있는 층과 버튼의 값을 더한 결과가 0..

숫자 카드 나누기 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다. 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고, 철수가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a 예를 들어, 카드들에 10, 5, 20, 17이 적혀 있는 경우에 대해 ..

무인도 여행 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습니다. 지도에는 바다와 무인도들에 대한 정보가 표시돼 있습니다. 지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 'X' 또는 1에서 9 사이의 자연수가 적혀있습니다. 지도의 'X'는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다. 지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 ..

후보키 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 후보키 프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다. 그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candidate Key)에 대한 고민이 필요하게 되었다. 후보키에 대한 내용이 잘 기억나지 않던 제이지는, 정확한 내용을 파악하기 위해 데이터베이스 관련 서적을 확인하여 아래와 같은 내용을 확인하였다. 관계 데이터베이스에서 릴레이션(Relation)..

하노이의 탑 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 하노이 탑(Tower of Hanoi)은 퍼즐의 일종입니다. 세 개의 기둥과 이 기동에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있습니다. 게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것입니다. 한 번에 하나의 원판만 옮길 수 있습니다. 큰 원판이 작은 원판 위에 있어서는 안됩니다. 하노이 탑의 세 개의 기둥을 왼쪽 부터 1번, 2번, 3..

문자열 압축 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다. 간단한 예로 "aabbaccc"의 경우 "2a2ba3c"(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수 있는데, 이러한 방식은 반복되는 문..

Euclidean algorithm (유클리드 호제법) [내부링크]

유클리드 호제법이란? 유클리드 알고리즘은 2개의 자연수의 최대 공약수를 구하는 알고리즘이다. 호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 예시 1071과 1029의 최대공약수를 구하면, 1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. ≫ 42 1029는 42로 나누어 떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. ≫ 21 42는 21로 나누어 떨어진다. 따라서, 최대공약수는 21이다. 78696과 19332의 최대공약수를 구하면, 78696 = 19332×4 + 1368 19332 = 1368×14 + 180 1368 = 180×7 + 108 180 = 108×1 + 72 108 = 72..

거리두기 확인하기 - Kotlin [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/81302 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다. 코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼 아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다. 대기실은 5개이며, 각 대기실은 5x5 크기입니다. 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요. 단 응시자가 앉아있는 자리 사..

2170번: 선 긋기 - Kotlin (라인스위핑) [내부링크]

https://www.acmicpc.net/problem/2170 2170번: 선 긋기 첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다. www.acmicpc.net 문제 매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자. 이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오. 선이 여러 번 그..

11053번: 가장 긴 증가하는 부분 수열 [내부링크]

11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는..

9095번: 1, 2, 3 더하기 - Kotlin [내부링크]

9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. 나의 풀이 이 문제는 문제에..

1463번: 1로 만들기 - Kotlin [내부링크]

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 나의 풀이 요즘 DP 문제를 접하고 있는데 DP 문제의 풀이 방식에 대한 기..

14500번: 테트로미노 - Kotlin [내부링크]

14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변 www.acmicpc.net 문제 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져..

개인 프로젝트 시작하기 [내부링크]

나는 지금 학교를 졸업하고 취업을 준비중이다. 알고리즘 문제와 자료구조, CS를 공부하며 남는 시간에 조금씩 개인 프로젝트를 해보려고 한다. 학교에서 팀 프로젝트를 진행해 봤지만 지금 그 프로젝트는 절차없이 닥치는 대로 하나하나 설계를 하는 식으로 주먹구구식으로 진행을 했기 때문에 개인 프로젝트는 나름의 절차를 가지며 제대로 만들어 보고자 한다. IT 프로젝트 과정 이 내용은 아래의 유튜브를 참고하여 제작하였다. 불꽃남자님의 유튜브를 보면 IT 프로젝트가 어떻게 진행이 되는지 상세하게 나와있다. 개인 프로젝트를 진행 하는데 까지 실제로 회사에서 IT 프로젝트들이 진행되는 과정처럼 프로젝트를 진행 할 필요는 없다. 다만 최대한 내가 할 수 있는 부분은 하나 하나 해보면서 나중에 취직했을때 도움이 되고자 개..

1987번: 알파벳 - Kotlin (DFS) [내부링크]

1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으 www.acmicpc.net 문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 ..

1753번: 최단경로 - Kotlin [내부링크]

1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 문제 방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다. 입력 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 주어진다. 셋째 줄부터 E개..

14502번: 연구소 - Kotlin [내부링크]

14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 문제 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크기가 N×M인 직사각형으로 나타낼 수 있으며, 직사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다. 일부 칸은 바이러스가 존재하며, 이 바이러스는 상하좌우로 인접한 빈 칸으로 모두 퍼져나갈 수 있다. 새로 세울 수 있는..

9251번: LCS - Kotlin [내부링크]

9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 문제 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. 입력 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다. 출력 첫째 줄에 입력으로 주어진 두 문자열..

10026번: 적록색약 - Kotlin (BFS) [내부링크]

10026번: 적록색약 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록) www.acmicpc.net 문제 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색..

1011번: Fly me to the Alpha Centauri [내부링크]

1011번: Fly me to the Alpha Centauri 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행 www.acmicpc.net 문제 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행사가 되어 새로운 세계에 발을 내려 놓는 영광의 순간을 기다리고 있다. 그가 탑승하게 될 우주선은 Alpha Centauri라는 새로운 인류의 보금자리를 개척하기 위한 대규모 생활 유지 시스템을 탑재하고 있기 때문에, ..

12865번: 평범한 배낭 - Kotlin [내부링크]

12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 문제 이 문제는 아주 평범한 배낭에 관한 문제이다. 한 달 후면 국가의 부름을 받게 되는 준서는 여행을 가려고 한다. 세상과의 단절을 슬퍼하며 최대한 즐기기 위한 여행이기 때문에, 가지고 다닐 배낭 또한 최대한 가치 있게 싸려고 한다. 준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 아직..

Knapsack Problem (배낭 문제) with 12865번: 평범한 배낭 [내부링크]

배낭 문제란? 배낭 문제는 조합 최적화 문제의 일종이다. 간략하게 말하자면, 담을 수 있는 최대 무게가 정해진 배낭과 함께 각각의 무게와 가치가 주어진 아이템의 집합이 주어졌을 때, 배낭에 담은 아이템들의 가치의 합이 최대가 되도록 하는 아이템들의 부분집합을 찾는 문제이다. 우리가 흔히 쓰는 배낭 문제는 Fraction Knapsack Problem 0-1 Knapsack Problem 이 2가지가 존재한다. Fraction Knapsack Problem (분할 가능한 배낭 문제) with Greedy Algorithm 내가 배낭 문제를 처음 접했을때 든 생각은 "어 이거 그리디 알고리즘 아닌가?" 였다. 그리디 알고리즘에서 가장 유명한 문제인 동전 거스름돈 문제는 일단 거스름돈으로 사용할 500원, 1..

7576번: 토마토 - Kotlin (BFS) [내부링크]

7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 문제 철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마..

BackTracking with 9663번: N-Queen [내부링크]

백트래킹이란? 백트래킹이란 원하는 값을 찾는 도중 현재 대상이 원하는 값이 아닐때, 더 이상 그 대상을 탐색하지 않고 전 단계로 돌아가서 원하는 값을 푸는 방식이다. 우리가 가장 많이 사용하는 방식인 DFS, BFS가 바로 백트래킹에 속한다고 한다. DFS, BFS가 바로 백트래킹에 속한다고 한다. 사실 이 말은 매우 불친절한 말이다. 백트래킹이 무엇인가에 대해 의문점이 생겨서 많은 게시글들을 참고하고 여기저기를 뒤져본 결과 나름 내가 내려본 결론은 백트래킹은 DFS 나 BFS에서 조건문을 통해 우리가 찾고자 하는 값이 절대 아닌 것들은 탐색하지 않고 우리가 찾고자 하는 값이 있는 것들만을 탐색하여 우리가 원하는 값을 찾는 방식이라고 생각한다. 이해를 돕기위한 예로 유명한 백트래킹 문제를 가져와 보겠다...

14503번: 로봇 청소기 - Kotlin [내부링크]

14503번: 로봇 청소기 첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽 www.acmicpc.net 나의 풀이 이 문제는 문제에서 말하는대로만 따라가다 보면 쉽게 해결할 수 있는 간단한 시뮬레이션 문제이다. 리팩토링을 통해 더 좋은 코드를 만들 수 있겠지만 나는 직관적으로 문제를 해결하였다. 이 문제는 주석을 통해 문제를 설명하겠다. val dx = arrayOf(-1, 0, 1, 0) val dy = arrayOf(0, 1, 0, -1) lateinit var room : Array fun main() = wi..

택배 상자 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 영재는 택배상자를 트럭에 싣는 일을 합니다. 영재가 실어야 하는 택배상자는 크기가 모두 같으며 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 영재에게 전달됩니다. 컨테이너 벨트는 한 방향으로만 진행이 가능해서 벨트에 놓인 순서대로(1번 상자부터) 상자를 내릴 수 있습니다. 하지만 컨테이너 벨트에 놓인 순서대로 택배상자를 내려 바로 트럭에 싣게 되면 택배 기사님이 배달하는 순서와 택배상자가 실려 있는 순서가 맞지 않아 배달에 차질이 생깁니다. 따라서 택배 기사님이 ..

행렬 테두리 회전하기 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다. x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다. 다음은 6 x 6 크기 ..

Floyd-Warshall Algirithm (플로이드 워셜 알고리즘) [내부링크]

플로이드 워셜 알고리즘이란? 플로이드 워셜 알고리즘은 그래프에서 가능한 모든 노드 쌍에 대해 최단 거리를 구하는 알고리즘이다. 이전에 배웠던 다익스트라 알고리즘은 한 노드에서 가능한 모든 노드 쌍에 대해 최단 거리를 구했기 때문에 이 점이 2가지의 알고리즘에 차이라고 할 수 있다. 플로이드 워셜 알고리즘의 시간 복잡도는 O(N³)으로 3중 for문으로 보통 모든 경우의 수를 비교한다. 플로이드 워셜 알고리즘의 핵심은 거쳐가는 정점을 기준으로 최단 거리를 구하는 것이다. 그래서 k를 두어서 모든 노드에 대해서 최단 거리를 구할 수 있도록 하였다. fun floydWarshall() { val d = Array(4) { IntArray(4) } for (i in 0 until 4) { for (j in 0 ..

Dijkstra Algorithm (다익스트라 알고리즘) with 프로그래머스 - 배달 [내부링크]

다익스트라 알고리즘이란? 다익스트라 알고리즘은 그래프의 한 정점에서 모든 정점까지의 최단거리를 각각 구하는알고리즘이다. 가능한 적은 비용으로 가장 빠르게 해답에 도달하는 경로를 찾아내는 대부분의 문제에 응용된다. 처음 고안되었을때의 다익스트라 알고리즘은 O(N²)의 시간복잡도를 가진다. 이후에 PriorityQueue 를 이용해서 O(NlogN) 까지 시간복잡도를 줄이는 방식이 고안되었다. 다익스트라 알고리즘은 다음과 같다. (P[A][B]는 A와 B 사이의 거리라고 가정한다. 출발점으로부터의 최단거리를 저장할 배열 d[v]를 만들고, 출발 노드에는 0을, 출발점을 제외한 다른 노드들에는 매우 큰 값 INF를 채워 넣는다. (정말 무한이 아닌, 무한으로 간주될 수 있는 값을 의미한다.) 보통은 최단거리 ..

PriorityQueue & Heap [내부링크]

PriorityQueue 우리는 이전에 Queue의 구조에 대하여 학습한적이 있다. Queue는 First In First Out 구조로 먼저 집어넣은 데이터가 먼저 나오는 구조를 가지고 있다. 하지만 PriorityQueue는 이름에서 알 수 있듯이 Queue의 구조에서 데이터의 우선순위에 따라서 우선순위가 높은 데이터가 먼저 나오는 구조를 가지고 있다. 위의 구조는 PriorityQueue의 구조이다. 데이터를 무작위로 Enqueue 했을때 그 순서와 상관없이 우선순위가 높은 데이터가 가장 왼쪽에 위치하는 것을 알 수 있다. 구현 PriorityQueue의 구현은 Array, LinkedList, Heap으로 가능하다. 다만 Array와 LinkedList는 매번 가장 높은 우선순위의 데이터를 가장 ..

ArrayList & LinkedList [내부링크]

이번에는 ArrayList와 LinkedList에 대해서 알아보도록 하겠다. 이름만 봐도 알 수 있듯 2개의 자료구조는 Java에서 제공하는 List 인터페이스를 구현한 Collection 구현체이다. 하지만 동작하는 기능은 서로 다르기 때문에 하나하나 알아보고자 한다. ArrayList ArrayList는 중복을 허용하고 순서를 가지며 인덱스로 원소들을 관리한다. 이 말을 들으면 우리는 바로 ArrayList는 Array와 매우 유사한 기능을 가지고 있다고 생각할 수 있다. ArrayLIst란 이름에서도 알 수 있듯이 Array의 이런 점, List의 데이터가 저장될 때 필요에 의해 자동으로 늘어나며 순서를 가지는 점을 가지고 있다. Array와 가장 큰 차이점은 Array는 처음에 크기를 지정하면 그..

롤케이크 자르기 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 철수는 롤케이크를 두 조각으로 잘라서 동생과 한 조각씩 나눠 먹으려고 합니다. 이 롤케이크에는 여러가지 토핑들이 일렬로 올려져 있습니다. 철수와 동생은 롤케이크를 공평하게 나눠먹으려 하는데, 그들은 롤케이크의 크기보다 롤케이크 위에 올려진 토핑들의 종류에 더 관심이 많습니다. 그래서 잘린 조각들의 크기와 올려진 토핑의 개수에 상관없이 각 조각에 동일한 가짓수의 토핑이 올라가면 공평하게 롤케이크가 나누어진 것으로 생각합니다. 예를 들어, 롤케이크에 4가지 종류의 토핑이 올려져 있다고 합시다. 토핑들을..

11559번: Puyo Puyo - kotlin (BFS) [내부링크]

11559번: Puyo Puyo 총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다. www.acmicpc.net 문제 뿌요뿌요의 룰은 다음과 같다. 필드에 여러 가지 색깔의 뿌요를 놓는다. 뿌요는 중력의 영향을 받아 아래에 바닥이나 다른 뿌요가 나올 때까지 아래로 떨어진다. 뿌요를 놓고 난 후, 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색 뿌요들이 한꺼번에 없어진다. 이때 1연쇄가 시작된다. 뿌요들이 없어지고 나서 위에 다른 뿌요들이 있다면, 역시 중력의 영향을 받아 차례대로 아래로 떨어지게 된다. 아래로 떨어지고 나서 다시..

17779번: 게리맨더링 2 - Kotlin [내부링크]

17779번: 게리맨더링 2 재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름 www.acmicpc.net 문제 재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름도 재현시로 변경했다. 이번 선거에서는 최대한 공평하게 선거구를 획정하려고 한다. 재현시는 크기가 N×N인 격자로 나타낼 수 있다. 격자의 각 칸은 구역을 의미하고, r행 c열에 있는 구역은 (r, c)로 나타낼 수 있다. 구역을 다섯 개의 선거구로 나눠야 하고, 각 구역은 다섯 선거구..

15683번: 감시 [내부링크]

15683번: 감시 스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감 www.acmicpc.net 문제 스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감시할 수 있는 방법은 다음과 같다. 1번 2번 3번 4번 5번 1번 CCTV는 한 쪽 방향만 감시할 수 있다. 2번과 3번은 두 방향을 감시할 수 있는데, 2번은 감시하는 방향이 서로 반대방향이어야 하고, 3번은 직각 방향이어야 한다. 4번은 세..

Brute Force (완전탐색) [내부링크]

브루트 포스(Brute Force) 알고리즘이란? 우리가 완전탐색이라고도 부르는 브루트 포스 알고리즘은 조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법이다. 엄청난 시간이 걸리는 데다 자원이 엄청나게 들어 무식한 방법이라고 할 수 있지만 100%로 완전 탐색할 수 있다는 장점이 있다. 이론적으로 가능한 모든 경우의 수를 다 검색하보는 것이라 암호학에서는 가장 확실한 방법으로 통용되고 있다. 브루트 포스는 크게 선형 구조와 비선형 구조로 나눌 수 있다. 선형 구조: 순차 탐색 비선형 구조: 백트래킹, DFS, BFS 우리는 이런 구조를 가지고 많은 알고리즘 문제를 해결해야 한다. 그러므로 우리는 이런 구조에 대한 이해를 확실하게 해서 해당하는 알고리즘 문제에 가장 알맞은 구조를..

20056번: 마법사 상어와 파이어볼 (시간초과 실패) - Kotlin [내부링크]

20056번: 마법사 상어와 파이어볼 첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치 www.acmicpc.net 문제 어른 상어가 마법사가 되었고, 파이어볼을 배웠다. 마법사 상어가 크기가 N×N인 격자에 파이어볼 M개를 발사했다. 가장 처음에 파이어볼은 각자 위치에서 이동을 대기하고 있다. i번 파이어볼의 위치는 (ri, ci), 질량은 mi이고, 방향은 di, 속력은 si이다. 위치 (r, c)는 r행 c열을 의미한다. 격자의 행과 열은 1번부터 N번까지 번호가 매겨져 있고, 1번 행은 N번과 연결되어 있고, 1번 열은 N번 열과 ..

두 큐 합 같게 만들기 - Kotlin [내부링크]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다. 큐는 먼저 집어넣은 원소가 먼저 나오는 구조입니다. 이 문제에서는 큐를 배열로 표현하며, 원소가 배열 앞쪽에 있을수록 먼저 집어넣은 원소임을 의미합니다. 즉, pop을 하면 배..

16235번: 나무 재테크 - Kotlin [내부링크]

16235번: 나무 재테크 부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 www.acmicpc.net 문제 부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다. 상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송..

2638번: 치즈 - Kotlin (DFS) [내부링크]

2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 www.acmicpc.net 문제 N×M의 모눈종이 위에 아주 얇은 치즈가 과 같이 표시되어 있다. 단, N 은 세로 격자의 수이고, M 은 가로 격자의 수이다. 이 치즈는 냉동 보관을 해야만 하는데 실내온도에 내어놓으면 공기와 접촉하여 천천히 녹는다. 그런데 이러한 모눈종이 모양의 치즈에서 각 치즈 격자(작 은 정사각형 모양)의 4변 중에서 적어도 2변 이상이 실내온도의 공기와 접촉한 것은 정확히 한시간만에 녹아 없어져 버린다. 따라서 아래 모양과 같은 치즈(회색으로 표시된 ..

14499번: 주사위 굴리기 - Kotlin [내부링크]

14499번: 주사위 굴리기 첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지 www.acmicpc.net 문제 크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 2 4 1 3 5 6 주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 ..

16236번: 아기 상어 - Kotlin (BFS) [내부링크]

16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net 문제 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가지고 있고, 이 크기는 자연수이다. 가장 처음에 아기 상어의 크기는 2이고, 아기 상어는 1초에 상하좌우로 인접한 한 칸씩 이동한다. 아기 상어는 자신의 크기보다 큰 물고기가 있는 칸은 지나갈 수 없고, 나머지 칸은 모두 지나갈 수 있다. 아기 상어는 자신의..

3190번: 뱀 - Kotlin [내부링크]

3190번: 뱀 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임 www.acmicpc.net 문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다. 먼저 뱀은..

16234번: 인구 이동 - Kotlin (DFS) [내부링크]

16234번: 인구 이동 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모 www.acmicpc.net 문제 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모든 나라는 1×1 크기이기 때문에, 모든 국경선은 정사각형 형태이다. 오늘부터 인구 이동이 시작되는 날이다. 인구 이동은 하루 동안 다음과 같이 진행되고, 더 이상 아래 방법에 의해 인구 이동이 없을 때까지 지속된다. 국경선을 공유하는 두 나라..

14891번: 톱니바퀴 - Kotlin [내부링크]

14891번: 톱니바퀴 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 www.acmicpc.net 문제 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다. 톱니바퀴를 회전시키..

2589번: 보물섬 - Kotlin (BFS) [내부링크]

2589번: 보물섬 첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의 www.acmicpc.net 문제 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다. 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다. 육지를 나타내는 두 곳 사이를 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거..

2309번: 일곱 난쟁이 - Kotlin [내부링크]

문제 왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오. 입력 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다. 출력 일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을..

2667번: 단지 번호 붙이기 - Kotlin (DFS) [내부링크]

2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 문제 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. 는 을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로..

2606번: 바이러스 - Kotlin (DFS) [내부링크]

2606번: 바이러스 첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어 www.acmicpc.net 문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨..

2178번: 미로 탐색 - Kotlin (BFS) [내부링크]

2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.acmicpc.net 문제 N×M크기의 배열로 표현되는 미로가 있다. 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다. 위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 ..

DFS와 BFS with 백준 1260번: DFS와 BFS [내부링크]

1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사 www.acmicpc.net 문제 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다. 입력 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개..

운영체제(2) - 프로세스와 스레드 [내부링크]

프로세스 프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 우리가 작업 관리자에 들어가 보았을 때 보이는 것들이 바로 프로세스라고 할 수 있다. 위의 사진에서 알 수 있는 것은 프로세스가 앱과 background 프로세스로 나누어져 있다는 것이다. 앱은 다른 말로 foreground 프로세스라고 할 수 있다. 하나의 프로세스에 할당되는 총 메모리 공간을 크게 커널 영역과 사용자 영역으로 나눌 수 있다. 커널 영역에서는 많은 프로세스가 CPU를 필요로 할 때 자원을 배분하는 PCB(Process Control Block, 프로세스 제어 블록)가 생성된다. 사용자 영역에는 프로그램이 동작하기 위한 각각 독립된 4가지의 메모리 영역을 가진다. (Code, Data, Stack, Heap..

2839번: 설탕 배달 [내부링크]

2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net 문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다. 상근이가 ..

1931번: 회의실 배정 [내부링크]

1931번: 회의실 배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 문제 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 입력 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보..

SOLID 와 소프트웨어 디자인 패턴 [내부링크]

SOLID (객체지향 설계 원칙) SOLID 원칙은 다음과 같은 다섯 가지 원칙의 앞글자를 따서 이름이 지어졌다. Single Responsibility Principle (SRP) - 단일 책임 원칙 Open-Closed Principle (OCP) - 개방-폐쇄 원칙 Liskov Substitution Principle (LSP) - 리스코프 치환 원칙 Interface Segregation Principle (ISP) - 인터페이스 분리 원칙 Dependency Inversion Principle (DIP) - 의존 역전 원칙 이 원칙들은 객체지향 설계를 할 때, 좀 더 유연하고 유지보수하기 쉬운 코드를 작성하기 위해 고안된 원칙들이다. 각각의 원칙은 아래와 같이 설명된다. 단일 책임 원칙(SRP)..

2789번: 블랙잭 [내부링크]

2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장 www.acmicpc.net 문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후..

2563번: 색종이 [내부링크]

2563번: 색종이 첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변 www.acmicpc.net 문제 가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오. 예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다. 입력 첫째 줄에 색종이의 ..

운영체제(1) - 시작하기 [내부링크]

운영체제는 응용 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램이다. 운영체제는 하드웨어와 응용 프로그램 사이에서 다른 응용 프로그램들이 유용한 작업을 할 수 있도록 환경을 제공한다. 다르게 표현하자면, 하드웨어를 감추고 겉으로 다른 프로그램들을 지원해준다고 생각할 수 있다. 이는 프로그램을 사용하는 사람이 편하게 쓸 수 있게 각종 기반 작업을 지원한다는 것으로 이해할 수 있다. 운영체제를 공부해야 하는 이유 사실 이 질문에 대한 대답은 한번이라도 오류 메시지를 접해 보았다면 쉽게 답할 수 있다. 대다수의 오류 메시지들이 운영체제로부터 발생한다. 우리가 작성한 코드가 하드웨어에서 실행되지 못한다면 운영체제는 오류 메시지를 띄워주게 된다. 프로그래밍 문법만 배워서는 해결할 ..

컴퓨터 구조(3) - 메모리 [내부링크]

주기억장치의 종류에는 크게 RAM과 ROM으로 나뉜다. 하지만 우리가 메모리를 말할때는 RAM을 말하는 경우가 많다. RAM (Random Access Memory) RAM은 '임의 접근' 을 할 수 있는 메모리를 말하며 휘발성 저장 장치이다. 비휘발성 저장 장치로는 SSD, CD, USB가 있다. 우리가 컴퓨터를 구매할때 CPU와 GPU를 주로 고려하는데, 그에 몾지않게 RAM의 용량 또한 중요하다. CPU가 실행하고 싶은 프로그램을 RAM으로 가져오게 되는데 이때 RAM의 용량이 적다면 실행 시간이 길어지게 된다. 여러가지 프로그램을 동시에 가져올때도 마찬가지이다. RAM이 클수록 용량이 큰 프로그램을 버벅이지 않게 사용할 수 있다. RAM의 종류 1. DRAM (Dynamic RAM) - 동적 램으..

H-Index [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 이 문제는 filter을 사용해서 간단하게 해결하였다. class Solution { fun solution(citations: IntArray): Int { var answer = 0 for(i in 0..citations.size) { var filter = citations.filter { it >= i } if(filter.size ..

타겟 넘버 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 매우 간단한 dfs 문제이다. 숫자가 담긴 배열을 cnt가 numbers.size가 될때까지 '+' 와 '-'로 나눠서 dfs를 반복 해주면 된다. class Solution { var size = 0 fun solution(numbers: IntArray, target: Int): Int { return dfs(0, 0, numbers, ..

컴퓨터 구조(2) - CPU [내부링크]

CPU(Central Procesing Unit) CPU는 명령어의 해석과 자료의 연산, 비교등의 처리를 제어하는 컴퓨터 시스템의 핵심장치이다. 위의 그림이 우리가 배워야할 CPU의 구조이다. 그림만 봤을때는 이게 무엇을 말하는지 이해가 안되는것이 당연하다. 그렇지만 CPU의 구성 요소들을 하나하나씩 배워가면서 어떻게 진행되는지 이해를 하고 다시 봤을때는 매우 쉬운 그림이 될 것이다. CPU의 구성 요소 1. ALU(Arithmetic and Logical Unit) ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인다. 그렇게 받아들인 피연산자와 제어 신호로 산술연산, 논리 연산 등 다양한 연산을 수행한다. ALU가 연산을 수행한 결과는 바로 메모..

컴퓨터 구조(1) - 시작하기 [내부링크]

컴퓨터 구조를 알아야하는 이유 언뜻 보면 컴퓨터 구조는 프로그램 개발과는 큰 관련이 없어 보인다. 우리는 컴퓨터 구조를 모르더라도 지금까지 프로그램을 개발해왔기 때문이다. 하지만 좋은 개발자가 되기 위해서는 반드시 컴퓨터 구조를 깊게 이해하고 있어야 한다. 만약 우리가 개발한 프로그램에 사용자가 많아졌다고 생각을 해보자. 이때 우리는 사용자의 정보, 게시글 등을 저장할 저장 장치를 선택해야 한다. 우리는 이때 우리가 스스로 판단해서 장치를 선택해야 한다. 이건 프로그래밍 언어만 안다고 해서 해결할 수 있는 것이 아니다. 우리는 컴퓨터 구조를 이해해서 이런 성능, 용량, 비용 문제를 고려해 개발하여야 한다. 컴퓨터의 구성요소 컴퓨터의 구성 요소는 다음과 같다. 4가지 핵심 부품은 CPU, Memory, I..

콜라 문제 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 사실 이 문제는 엄청 간단한 수학 문제이다. 딱히 고려해야 할 부분도 없어서 간단한 재귀함수로 구현했다. class Solution { var count = 0 fun solution(a: Int, b: Int, n: Int): Int { return coke(a, b, n) } fun coke(a: Int, b: Int, n: Int): ..

List, Set, Map to Kotlin [내부링크]

우리는 자료구조를 분류할때 선형과 비선형을 기준으로 분류를 했었다. 그리고 분류한 자료구조들을 하나씩 공부해나갈 예정이다. 하지만 그 전에 Collection에있는 List, Set, Map을 학습하고자 한다. Kotlin에는 크게 List, Set, Map 3가지 Collection이 있다. 이 3가지 Collection은 중복을 허용하는지, 순서가 보장되는지에 따라 구분할 수 있다. 참고로, Kotlin Collection은 Mutable Collection과 Immutable Collection으로 구분해 사용한다. 둘의 차이는 변경이 가능한가, 불가능한가이다. List, Set, Map 모두 Mutable과 Immutable Collection을 지원한다. List List는 데이터가 저장될때 필..

자료구조의 분류 [내부링크]

자료구조란? 자료구조는 서비스나 어플리케이션에서 필요한 데이터를 메모리에 어떻게 구조적으로 잘 정리해서 담아두고 관리하고 최종적으로 가장 효율적인 방식으로 필요한 데이터에 빠르게 접근하고 필요한 수정, 삽입, 삭제를 할 수 있도록 도와준다. 서비스에서 Client에게 데이터를 제공하거나 어플리케이션에서 사용자에게 필요한 데이터를 보여주거나 효율적으로 일을 처리하기 위해서는 적합한 자료구조를 사용하는 것이 정말 중요하다. 좋은 개발자가 되기 위해서는 memort effciency에 포커스를 맞춰서 알고리즘과 자료구조를 잘 공부해야 할 것이다. 자료구조의 분류 기본적인 자료구조를 선형, 비선형 구조로 나눴을때 우리가 알아야 하는 것들이다. 자료구조를 공부할때 우리는 자료 구조 안에 있는 데이터들의 순서가 보..

DATABASE(6) - Database Server, Database Client [내부링크]

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 > 생활코딩 hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다. 어떻게 공부할 것인가를 생각해보기 전에 왜 프로그 opentutorials.org Internet과 DATABASE의 관계 만약 DATABASE로 일을 하려고 한다면 2가지가 필요할 것이다. Database Server Database Client DATABASE는 Client 와 Server 모델을 따르며 다수의 Client들은 하나의 서버에 연결될 수 없다. Database Server는 Backend에서 작동하는 소프트웨어이며 DATABASE가 만들어지고 저장되는 장소이다...

DATABASE(5) - 관계형 DB의 핵심 기능 JOIN [내부링크]

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 > 생활코딩 hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다. 어떻게 공부할 것인가를 생각해보기 전에 왜 프로그 opentutorials.org JOIN 위에는 author와 topic 테이블이 생성되어져 있다. 우리가 하고 싶은것은 이 2개의 테이블을 결합하는 것이다. 두 개의 테이블을 자세히 보면 id 값이 서로 연결되어 있다는 것을 알 수 있다. 그래서 우리는 이것을 이용해서 다음과 같이 두 개의 테이블을 JOIN 할 수 있다. SELECT * FROM topic LEFT JOIN author ON topic.author_id = au..

삼총사 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 정수가 몇가지 주어졌을때 그중에서 3개를 고르고 그 수들의 합이 0이 되면 삼총사가 되는 간단한 조합 문제이다. 순열 (Permutation) & 조합 (Combination) 순열이란? 수학에서 순열(Permutation) 또는 치환은 순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산이다. 즉, 순열은 정의역과 공역이 같은 일대일 대응..

괄호 변환 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 이 문제에는 친절하게도 다시 수행하라는 식으로 재귀함수를 사용해야 한다는 것을 알려주고 있다. 다만 문자열이 "올바른 괄호 문자열" 인지 판별하는 부분이 조금 헷갈렸는데 stack을 사용해서 '(' 일때 add 해주고 ')' 일때 pop을 해주는 방식을 통해 문자열이 올바른지 올바르지 않은지 판별했다. import java.util.* cl..

메뉴 리뉴얼 - Kotlin [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 - 1차 카카오 블라인드 테스트의 문제를 풀면서 느끼는 점은 문제를 읽는 독해력과 문제의 핵심을 빠르게 파악하는 것이 상당히 중요하다는 것이다. 이 문제를 보고 시간 초과가 날거같긴 하지만 일단 조합을 사용해서 알파벳 대문자의 종류를 만들어서 List에 넣어놓고 orders에 있는 문자들과 비교를 해보는 식으로 해보았다. class Solu..

알고리즘과 설계기법 [내부링크]

알고리즘이란? 수학과 컴퓨터과학, 언어학 또는 엮인 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차이다. 계산을 실행하기 위한 단계적 절차를 의미하기도 한다. 즉, 문제 풀이에 필요한 계산절차 또는 처리과정의 순서를 뜻한다. 프로그램명령어의 집합을 의미하기도 한다. 다음은 알고리즘 개발의 정형적인 단계이다. 문제 정의 → 모델 고안 → 명세 작성 → 설계 → 검증 → 분석 (복잡도 등) → 구현 → 테스트 → 문서화 알고리즘 설계기법 훌륭한 알고리즘 중에는 문제를 해결하는 방법과 고속화의 테크닉에 있어서 공통점을 가진 알고리즘이 많이 있다. 예를들면 퀵 정렬과 합병 정렬은 정렬 대상이 되는 데이터가 들어 있는 배열을 두 개로 나눠서 두 배열을 각각 정렬한 후, 그들 두 배열을 연결한다는 점에서 ..

귤 고르기 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 - 1차 tangerine에 있는 값을 숫자와 빈도수로 나눠서 map에 넣었다. 그리고 map을 value 값으로 정렬 후 k값이 0보다 작아질 때 까지 count하고 그 count 값을 출력해줬다. 테스트 케이스에서는 작동했지만 제출 후 채점에서 오류가 발생했다. class Solution { fun solution(k: Int, tang..

소수 찾기 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 이 문제는 순열을 이용해야 한다. 다만 numbers에 있는 정수는 한번만 쓰여져야 함으로 add한 뒤에는 substring으로 제거해줬다. 문자가 0으로 시작하는것을 방지하고 중복을 허용하지 않기 위해 Mutableset을 Int로 만들고 순열이 완료가 되면 만들어진 set에 있는 숫자가 소수인지 판별하고 그 숫자를 출력해 주었다. cla..

가장 큰 수 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 이 문제는 numbers의 정수들의 첫자리가 앞으로 오게만 하면 가장 큰 수를 만들 수 있음으로 Comparator를 이용해서 정렬을 하였다 val comparator = Comparator { a, b -> a.compareTo(b) } 첫자리가 0 이면 꼬일 수 있음으로 let으로 해결 해주었다. class Solution { fun s..

Queue & Stack [내부링크]

Queue 먼저 들어간 자료가 먼저 나오는 자료구조이다. FIFO(First In First Out, 선입선출) 또는 LILO(Last In Last Out, 후입후출) 라는 구조를 갖는다. Method Description add(E e) Queue에 객체를 추가한다. Queue의 남아 있는 space가 없을 경우 exception을 throw한다. element() Queue에 가장 먼저 들어간 객체를 return한다. offer(E e) Queue에 객체를 추가한다. 이때는 exception을 발생시키지 않고 성공 여부에 대해 return한다. peek() Queue에 가장 먼저 들어간 객체를 제거하지 않고 확인한다. poll() Queue에 가장 먼저 들어간 객체를 제거하고 해당 객체를 retur..

DATABASE(4) - Relational DATABASE [내부링크]

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 > 생활코딩 hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다. 어떻게 공부할 것인가를 생각해보기 전에 왜 프로그 opentutorials.org 관계형 데이터베이스의 필요 테이블에서 데이터들이 셀 수 없을만큼 늘어나고 용량이 늘어난다면 데이터들은 중복될 수 밖에 없다. 데이터가 많아지면 데이터들에 대한 수정이 어려워진다. 관계가 있으면 유지보수가 상당히 용이해진다. 그리고 좋은 관계형 데이터베이스를 만들려면 정보의 이상 현상(Anomaly)가 생기지 않도록 해야한다. 이상 현상(Anomaly) 갱신 이상(Modification Anomaly..

DATABASE (2) - MySQL [내부링크]

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 > 생활코딩 hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다. 어떻게 공부할 것인가를 생각해보기 전에 왜 프로그 opentutorials.org MySQL 이란? MySQL은 1995년에 발표된 오픈소스 RDBMS다. RDBMS의 종류로는 많은 데이터 베이스들이 있지만, 그 중 MySQL을 첫번째로 공부하는 이유는 MySQL이 가장 널리 사용되고 있는 RDBMS이며 무료이고 오픈 소스라는 점에서 많은 기업들이 MySQL을 사용하고 있기 때문이다. MySQL의 구조 MySQL의 구조는 크게 3가지로 나뉜다. 표(table): 데이터를 기록하는..

모음 사전 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 이 문제는 순열 완전탐색을 이용해서 깊이 우선탐색으로 구현하였다. 알파벳 모음을 만들면서 word에 해당하는 알파벳이 나오면 탐색을 그만하고 count 값을 출력해주는 식으로 구현하였다. class Solution { var count = 0 val alphabet = "AEIOU".toList() val answer = ArrayList(..

DATABASE (3) - 테이블과 CRUD [내부링크]

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 > 생활코딩 hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다. 어떻게 공부할 것인가를 생각해보기 전에 왜 프로그 opentutorials.org SQL SQL은 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 구조적 질의 언어이다. 테이블의 생성 이제 MySQL에 테이블을 한번 봐 보자 CREATE TABLE topic( id INT(11) NOT NULL AUTO_INCREMENT, title VARCHAR(100) NOT NULL, description TEXT NULL, created DATETIME NOT NULL, autho..

순열 (Permutation) & 조합 (Combination) [내부링크]

순열이란? 수학에서 순열(Permutation) 또는 치환은 순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산이다. 즉, 순열은 정의역과 공역이 같은 일대일 대응이다. n개의 원소의 순서를 뒤섞는 순열의 개수는 n의 계승 n!와 같다. 즉, n 이하의 양의 정수들을 곱한 값이다. 쉽게 말하자면 서로 다른 n개중에서 r개를 선택하는 경우의 수이다. 1. Swap 을 이용한 순열 첫번째는 swap 함수를 만들어서 배열들의 값을 직접 바꾸는 방법이다. 배열의 첫 값부터 순서대로 하나씩 바꾸며 모든 값을 한번씩 swap 한다. depth 를 기준 인덱스로 하여 depth 보다 인덱스가 작은 값들은 그대로 고정하고 depth 보다 인덱스가 큰 값들만 가지고 다시 swap 을 진행한다. 하지만 이 방식은 사전 ..

피로도 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 이 문제는 모든 던전을 방문해야 함으로 깊이 우선 탐색으로 구현하고자 하였다. 재귀함수를 이용해 코드를 구현하였다. class Solution { var answer: Int = 0 var count = 0 val visited = BooleanArray(8) fun dfs(k: Int, index:Int, dungeons: Array) {..

오픈 채팅방 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의풀이 출력을 할때 id와 그에 맞는 닉네임을 MutableMap에 Key 와 Value로 넣어주었고 Leave가 아니면 key와 Value값을 넣어주었다. action이 Enter이던 Change이던 상관없이 값을 넣어주면 되서 생각보다 간단하였다. import java.util.* class Solution { fun solution(record..

주차 요금 계산 [내부링크]

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 나의 풀이 자동차 넘버와 얼마나 머물렀는지 시간을 같이 배열에 넣기 위해 MutableMap을 사용하였다. import java.util.* class Solution { var basicTime = 0 var basicFee = 0 var unitTime = 0 var unitFee = 0 fun solution(fees: IntArray, reco..

DATABASE (1) [내부링크]

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 > 생활코딩 hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다. 어떻게 공부할 것인가를 생각해보기 전에 왜 프로그 opentutorials.org 데이터베이스의 본질 - CRUD 데이터를 관리하는 것에 필요한 작업은 데이터를 생성하고, 읽고, 수정하고, 삭제하는 4가지 작업이 전부라고 할 수 있다. 이름 기능 이름 기능 CREATE 생성 UPDATE 수정 READ 읽기 DELETE 삭제 어떤 데이터베이스를 공부해야 하는가? 데이터베이스에 대한 공부를 시작하려고 하니 데이터베이스의 종류가 너무 많아서 어떤 데이터베이스를 공부해야 하는지 고민이 ..

개발자의 기본 소양 쌓기 [내부링크]

학교를 다니면서 미래에 관한 고민을 하다가 안드로이드 스튜디오로 앱을 만드는 강의를 듣게 되었다. 내가 머릿속으로 생각했던 것들을 실제로 구현할 수 있다는 것에 많은 흥미를 느꼈고 앱을 만드는 개발자가 되어야겠다고 마음을 먹었다. 안드로이드 공부를 어떻게 시작해야 하는지 막막했을때 NAVER TECH CONCERT의 개발자 로드맵 강의를 접하게 되었다. TECH CONCERT: MOBILE 2019 - 안드로이드 개발자 로드맵 NAVER Engineering | 내용 네이버 안드로이드 개발자 3년차가 되는 과정에서 졸업생은 무엇을 준비하고, 어떤 걸 공부해야 하는지 키워드와 노하우를 공유합니다. tv.naver.com 강의에서는 안드로이드 개발자가 되기 위한 기본기를 쌓는것을 강요하고 있었다. 그래서 이..