diff --git a/hw/Hash/BestAlbum.js b/hw/Hash/BestAlbum.js new file mode 100644 index 0000000..1846877 --- /dev/null +++ b/hw/Hash/BestAlbum.js @@ -0,0 +1,41 @@ +const solution = (inputGenres, inputPlays) => { + let answer = []; + let map = {}; + for (let i = 0; i < inputGenres.length; i++) { + let genre = inputGenres[i]; + let play = inputPlays[i]; + let title = {index: i, plays: play}; + if (map[genre] === undefined) { + map[genre] = { + sum: play, + mostPlays: [title, {plays: 0}] + } + } else { + let genreObject = map[genre]; + genreObject.sum += play; + if (genreObject.mostPlays[0].plays < play) { + genreObject.mostPlays.unshift(title) + } else if (genreObject.mostPlays[1].plays < play) { + genreObject.mostPlays.splice(1, 0, title); + } + } + } + + let genres = Object.values(map); + genres.sort((a, b) => {return b.sum - a.sum}); + + for (let i = 0; i < genres.length; i++) { + let genre = genres[i]; + answer.push(genre.mostPlays[0].index); + let secondTitleIndex = genre.mostPlays[1].index; + if (secondTitleIndex !== undefined) answer.push(secondTitleIndex); + } + + return answer; +}; + +let genres = ['classic', 'pop', 'classic', 'classic', 'pop', 'kPop']; +let plays = [500, 600, 150, 800, 2500, 3200]; +let result = [5, 4, 1, 3, 0]; + +console.log(solution(genres, plays)); \ No newline at end of file diff --git a/hw/Sort/HIndex.js b/hw/Sort/HIndex.js new file mode 100644 index 0000000..f0aa923 --- /dev/null +++ b/hw/Sort/HIndex.js @@ -0,0 +1,21 @@ +const solution = (citations) => { + let hIndex = 0; + citations.sort((a, b) => a - b); + for (let i = 0; i < citations.length; i++) { + let citationCount = 0; + for (let j = 0; j < citations.length; j++) { + let citation = citations[j]; + if (citation > i) { + citationCount++; + } + if (citationCount >= i) { + hIndex = citationCount; + } + } + } + + return hIndex; +}; + +let citations = [3, 0, 6, 1, 5]; +console.log(solution(citations)); \ No newline at end of file diff --git a/hw/Sort/KthNumber.js b/hw/Sort/KthNumber.js new file mode 100644 index 0000000..60dbd9d --- /dev/null +++ b/hw/Sort/KthNumber.js @@ -0,0 +1,17 @@ +const solution = (array, commands) => { + let answer = []; + for (let i = 0; i < commands.length; i++) { + let command = commands[i]; + let slicedArray = array.slice(command[0] - 1, command[1]); + let sortedArray = slicedArray.sort((a, b) => a - b); + answer.push(sortedArray[command[2] - 1]); + } + + return answer; +}; + +let array = [1, 5, 2, 6, 3, 7, 4]; +let commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]; +let result = [5, 6, 3]; + +console.log(solution(array, commands)); \ No newline at end of file diff --git a/hw/Sort/MostNumber.js b/hw/Sort/MostNumber.js new file mode 100644 index 0000000..de65938 --- /dev/null +++ b/hw/Sort/MostNumber.js @@ -0,0 +1,13 @@ +const solution = (numbers) => { + numbers.sort((a, b) => { + return (b + '' + a) - (a + '' + b); + }); + + return numbers[0] === 0 ? '0' : numbers.join(''); +}; + +//let numbers = [6, 10, 2]; // 6210 +//let numbers = [3, 30, 34, 5, 9]; // 9534330 +let numbers = [0, 0]; // 0 + +console.log(solution(numbers)); \ No newline at end of file diff --git a/jhjo/BestAbumn.swift b/jhjo/BestAbumn.swift new file mode 100644 index 0000000..c9c5de1 --- /dev/null +++ b/jhjo/BestAbumn.swift @@ -0,0 +1,119 @@ + +import Foundation + +class BestAbumn : NSObject { + + public func printResult() -> String { + var printValue : [Int] + + // let arrangement1 = ["classic", "pop", "classic", "classic", "pop"] + // let arrangement2 = [500, 600, 150, 800, 2500] + //[4, 1, 3, 0] + + let arrangement1 = ["classic", "pop","classic","pop","classic","classic"] + let arrangement2 = [400,600,150,2500,500,500] + //[3, 1, 4, 5] + + printValue = solution(arrangement1, arrangement2) + return String(printValue.description) + } + + //1. for 문을 돌며 카운터가 가장 높은 장르를 검색하면서 장르, 플레이 횟수, 앨범 번호, 총플레이수 를 인덱싱(플레이 회수가 가장 높은 2개) 한다. + //2. 카운터가 가장 높은 장르 2개를 의 인덱싱 정보를 가져온다. + //3. 가장 많이 플레이된 2개의 장르 결과를 가저온다. + + func solution(_ genres:[String], _ plays:[Int]) -> [Int] { + var values : [(String, [Int], [Int], Int)] = [] //장르, 플레이 횟수, 앨범 번호, 총플레이수 + for (index, genre) in genres.enumerated() { + let playcount = plays[index] + + //해당 장르가 있는지 확인 + var ishave = false + + for (valuesindex, item) in values.enumerated() { + var item = item + if item.0 == genre { + //해당 아이템이 존재 + ishave = true + + //총카운트 증가 + item.3 = item.3 + playcount + + if (item.1.count == 1) { + if playcount > item.1[0] { + item.1.insert(playcount, at: 0) + item.2.insert(index, at: 0) + } else { + item.1.append(playcount) + item.2.append(index) + } + } else { + for (countIndex, count) in item.1.enumerated() { + if playcount > count { + item.1.insert(playcount, at: countIndex) + item.2.insert(index, at: countIndex) + break + } + } + } + values[valuesindex ?? 0] = (item.0,item.1,item.2,item.3) + break + } + + } + if !ishave { + values.append((genre, [playcount], [index], playcount)) + } + } + + //결과값 가져오기 + let result = values.sorted(by:{ $0.3 > $1.3 }) + var returnResult : [Int] = [] + for resultitem in result { + for (resultitem2Index, resultitem2) in resultitem.2.enumerated() { + //최대 2개 까지 + if resultitem2Index == 2 { + break; + } + returnResult.append(resultitem2) + } + + } + return returnResult + } + + +} + +//베스트앨범 +//문제 설명 +//스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. +// +//속한 노래가 많이 재생된 장르를 먼저 수록합니다. +//장르 내에서 많이 재생된 노래를 먼저 수록합니다. +//장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. +//노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요. +// +//제한사항 +//genres[i]는 고유번호가 i인 노래의 장르입니다. +//plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다. +//genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다. +//장르 종류는 100개 미만입니다. +//장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다. +//모든 장르는 재생된 횟수가 다릅니다. +//입출력 예 +//genres plays return +// [classic, pop, classic, classic, pop] [500, 600, 150, 800, 2500] [4, 1, 3, 0] +//입출력 예 설명 +//classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다. +// +//고유 번호 3: 800회 재생 +//고유 번호 0: 500회 재생 +//고유 번호 2: 150회 재생 +//pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다. +// +//고유 번호 4: 2,500회 재생 +//고유 번호 1: 600회 재생 +//따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다. +// +//※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다. diff --git a/jhjo/BigNumberSort.swift b/jhjo/BigNumberSort.swift new file mode 100644 index 0000000..6e2963e --- /dev/null +++ b/jhjo/BigNumberSort.swift @@ -0,0 +1,78 @@ + +import Foundation + +class BigNumberSort : NSObject { + public func printResult() -> String { + var printValue : String +// let numbers = [6, 10, 2] //6210 +// let numbers2 = [3, 30, 34, 5, 9] //9534330 +// let numbers3 = [40,403 ]//40403 +// let numbers4 = [40,405]//40540 +// let numbers5 = [40,404]//40440 +// let numbers6 = [12,121]//12121 +// let numbers7 = [2,22,223]//223222 +// let numbers8 = [21,212]//21221 +// let numbers9 = [41,415]//41541 +// let numbers10 = [2,22 ]//222 +// let numbers11 = [70,0,0,0]//70000 + let numbers = [0,0,0,0]//0000 +// let numbers13 = [0,0,0,1000]//1000000 +// let numbers14 = [12,1213]//121312 + + + printValue = solution(numbers) + return String(printValue) + } + + + //답이 0000000일 경우에는 0으로 출력해야합니다 + + func solution(_ numbers:[Int]) -> String { + var numbersCopy = numbers + numbersCopy.sort { + var sortbool = false + let firstNum : Int = Int(String($0) + String($1)) ?? 0 + let secondNum : Int = Int(String($1) + String($0)) ?? 0 + if firstNum < secondNum { + sortbool = false + } else { + sortbool = true + } + return sortbool + } + + let sortNum = numbersCopy.map{String($0)} + var value = sortNum.reduce(""){$0+$1} + if Int(value) == 0 { + value = "0" + } + return value + } + + +// func solution(_ numbers: [Int]) -> String { +// let sortedNumbers = numbers.sorted { +// Int("\($0)\($1)")! > Int("\($1)\($0)")! +// } +// let answer = sortedNumbers.map { String($0) }.reduce("") { $0 + $1 } +// return sortedNumbers.first == 0 ? "0" : answer +// } +} + + +//가장 큰 수 +//문제 설명 +//0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. +// +//예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. +// +//0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. +// +//제한 사항 +//numbers의 길이는 1 이상 100,000 이하입니다. +//numbers의 원소는 0 이상 1,000 이하입니다. +//정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. +//입출력 예 +//numbers return +// [6, 10, 2] 6210 +//[3, 30, 34, 5, 9] 9534330 diff --git a/jhjo/Closure.swift b/jhjo/Closure.swift index d0562de..bd246ae 100755 --- a/jhjo/Closure.swift +++ b/jhjo/Closure.swift @@ -1,6 +1,6 @@ import Foundation - +//클로져 샘플 class Closure : NSObject { public func printResult() -> String { diff --git a/jhjo/Clothes.swift b/jhjo/Clothes.swift new file mode 100644 index 0000000..07f27fd --- /dev/null +++ b/jhjo/Clothes.swift @@ -0,0 +1,80 @@ + +import Foundation +//위장옷 갯수 +class Clothes : NSObject { + + public func printResult() -> String { + var printValue : Int +// let arrangement = [["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] + let arrangement = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] + printValue = solution(arrangement) + + return String(printValue) + } + //1. 종류및 종류의 개수를 가져온다. + //2. 종류의 개수에 1을 더한다음 종류만큼 곱해준다. (옷을 안입은 경우 추가) + //3. 2번 값에서 -1 을 한다. (모든 옷을 안입은 경우 삭제) + func solution(_ clothes:[[String]]) -> Int { + let clothesDic = getKindArray(clothes) + var count = 1 + for (_,value) in clothesDic { + count = (value + 1) * count + } + count = count - 1 + return count + } + + func getKindArray(_ clothes:[[String]]) -> [String : Int] { + var valueDic : [String : Int] = Dictionary() + for item in clothes{ + let value = valueDic[item[1], default: 0] + if value == 0 { + valueDic[item[1]] = 1 + } else { + valueDic[item[1]] = value+1 + } + } + return valueDic + } + +} + +//위장 +//문제 설명 +//스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. +// +//예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다. +// +//종류 이름 +//얼굴 동그란 안경, 검정 선글라스 +//상의 파란색 티셔츠 +//하의 청바지 +//겉옷 긴 코트 +//스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. +// +//제한사항 +//clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. +//스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. +//같은 이름을 가진 의상은 존재하지 않습니다. +//clothes의 모든 원소는 문자열로 이루어져 있습니다. +//모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다. +//스파이는 하루에 최소 한 개의 의상은 입습니다. +//입출력 예 +//clothes return +// [[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5 +//[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3 +//입출력 예 설명 +//예제 #1 +//headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다. +// +//1. yellow_hat +//2. blue_sunglasses +//3. green_turban +//4. yellow_hat + blue_sunglasses +//5. green_turban + blue_sunglasses +//예제 #2 +//face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다. +// +//1. crow_mask +//2. blue_sunglasses +//3. smoky_makeup diff --git a/jhjo/Clothes_serch.swift b/jhjo/Clothes_serch.swift new file mode 100644 index 0000000..0b231d6 --- /dev/null +++ b/jhjo/Clothes_serch.swift @@ -0,0 +1,109 @@ + +import Foundation +//위장옷 갯수 완전탐색 +class Clothes : NSObject { + + public func printResult() -> String { + var printValue : Int +// let arrangement = [["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] + let arrangement = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] + printValue = solution(arrangement) + + return String(printValue) + } + //1. 종류의 개수를 가져온다. + //2. 종류의 개수로 반복문 실행 + //3. 종류의 개수로 올수있는 가지수를 카운트 한다. + //4. 모든 가지수를 더한다. + func solution(_ clothes:[[String]]) -> Int { + let clothedKindArray = getKindArray(clothes) + var count = 0 + for (index,_) in clothedKindArray.enumerated() { + count += getDayCount(clothes, Array(Array()) ,index) + } + return count + } + + + func getKindArray(_ clothes:[[String]]) -> Array { + var kindArray : Set = Set() + for item in clothes{ + kindArray.insert(item[1]) + } + return Array(kindArray) + } + + func getDayCount(_ clothes:[[String]], _ clothedToday:[[String]], _ count:Int) -> Int { + var clothedcount = 0 + if clothedToday.count == count+1 { + //print(clothedToday) + return 1 + } + var copyClothedToday = clothedToday + for item in clothes{ + if count == 0 { + copyClothedToday = clothedToday + } + if checkCanClothed(clothedToday, item) { + copyClothedToday.append(item) + clothedcount += getDayCount(clothes, copyClothedToday, count) + } + } + return clothedcount + } + + //이미 입고 있는 종류인지 확인 + func checkCanClothed(_ clothedToday:[[String]], _ checkitem:[String]) -> Bool { + var isClothed = true + for item in clothedToday { + if item[1] == checkitem[1] || item[0] == checkitem[0]{ + isClothed = false + break + } + } + return isClothed + } + + + +} + +//위장 +//문제 설명 +//스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. +// +//예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다. +// +//종류 이름 +//얼굴 동그란 안경, 검정 선글라스 +//상의 파란색 티셔츠 +//하의 청바지 +//겉옷 긴 코트 +//스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. +// +//제한사항 +//clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. +//스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. +//같은 이름을 가진 의상은 존재하지 않습니다. +//clothes의 모든 원소는 문자열로 이루어져 있습니다. +//모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다. +//스파이는 하루에 최소 한 개의 의상은 입습니다. +//입출력 예 +//clothes return +// [[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5 +//[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3 +//입출력 예 설명 +//예제 #1 +//headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다. +// +//1. yellow_hat +//2. blue_sunglasses +//3. green_turban +//4. yellow_hat + blue_sunglasses +//5. green_turban + blue_sunglasses +//예제 #2 +//face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다. +// +//1. crow_mask +//2. blue_sunglasses +//3. smoky_makeup diff --git a/jhjo/HIndex.swift b/jhjo/HIndex.swift new file mode 100644 index 0000000..20b3ed7 --- /dev/null +++ b/jhjo/HIndex.swift @@ -0,0 +1,72 @@ + +import Foundation + +class HIndex : NSObject { + + public func printResult() -> String { + var printValue : Int + + let citations = [3, 0, 6, 1, 5] //3 + let citations1 = [6, 6, 6, 6, 6, 6] //6 + let citations2 = [2, 2, 2] //2 + let citations3 = [51, 22, 20, 14, 10, 4, 3] //5 + + + printValue = solution(citations) + print(String(printValue)) + + printValue = solution(citations1) + print(String(printValue)) + printValue = solution(citations2) + print(String(printValue)) + printValue = solution(citations3) + print(String(printValue)) + + + + return String(String(printValue)) + } + + public func solution(_ citations:[Int]) -> Int { + var hindex = 0 + let sortdata = citations.sorted{$0 > $1} + for index in sortdata { + if index > hindex { + hindex = hindex + 1 + } else { + break + } + } + return hindex + } + +} + +//문제 설명 +//H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. +// +//어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h가 이 과학자의 H-Index입니다. +// +//어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요. +// +//제한사항 +//과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다. +//논문별 인용 횟수는 0회 이상 10,000회 이하입니다. +//입출력 예 +//citations return +// [3, 0, 6, 1, 5] 3 +//입출력 예 설명 +//이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다. +// +//※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다. + + +//http://libguides.snu.ac.kr/c.php?g=319123&p=2131850 +//H-INDEX 계산 +//연구자의 발표 논문을 피인용수가 많은 순으로 정렬한 순위. 순위와 피인용수가 같아지거나 혹은 순위가 피인용수보다 작은 최대값이 h-index입니다. +// +//[51, 22, 20, 14, 10, 4, 3] //5 +// +//위의 예시와 같이 순위보다 피인용수가 낮아지는 6순위의 바로 위의 5순위가 h-index 됨. +// +//즉, h-index가 5이며, 그 저자가 발표한 논문 중 5개의 논문이 적어도 각각 5번 인용되었다. diff --git a/jhjo/KNumberSort.swift b/jhjo/KNumberSort.swift new file mode 100644 index 0000000..d632193 --- /dev/null +++ b/jhjo/KNumberSort.swift @@ -0,0 +1,55 @@ + +import Foundation + +class KNumberSort : NSObject { + public func printResult() -> String { + var printValue : [Int] + let array = [1, 5, 2, 6, 3, 7, 4] + let commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]] + //[5, 6, 3] + printValue = solution(array, commands) + return String(printValue.description) + } + + func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] { + var values : [Int] = [] + for item in commands { + let value = findNumber(array, item) + values.append(value) + } + return values + } + + func findNumber(_ array:[Int], _ command:[Int]) -> Int { + let start = command[0] + let end = command[1] + let number = command[2] + let cutArray = array[start-1.. String { + publishSubject() + return "" + } + + public func sample() { + let stringSequence = Observable.just("this is string yo") + let oddSequence = Observable.from([1, 3, 5, 7, 9]) + let dictSequence = Observable.from([1:"Rx",2:"Swift"]) + + let subscription1 = stringSequence.subscribe { (event: Event) in + print(event) + } + let subscription2 = oddSequence.subscribe { (event: Event) in + print(event) + } + + // let subscription3 = dictSequence.subscribe { (event: Event>) in + // let aa = event + // print(event) + // //print(event) + // } + } + + public func create() { + func myJust(element: E) -> Observable { + return Observable.create { observer in + observer.on(.next(element)) + observer.on(.completed) + return Disposables.create() + } + } + myJust(element: "My Just Observable") + .subscribe { s in + print(s) + } + } + + public func disposing() { + /* + subscribe 메서드는 Disposable 인스턴스를 리턴합니다. + Observable의 사용이 끝나면 메모리를 해제해야 합니다. 그 때 사용할 수 있는것이 Dispose입니다. + RxSwift에서는 DisposeBag을 사용하는데 DisposeBag instance의 deinit() 이 실행 될 때 모든 메모리를 해제합니다. + 이 DisposeBag 에 subscribe 가 리턴하는 Disposable 인스턴스를 넣어주기만 하면 됩니다. + */ + var disposeBag = DisposeBag() + let stringSequence = Observable.just("RxSwift Observable") + let subscription = stringSequence.subscribe { (event) in + print(event) + } + // subscription 을 disposeBag에 넣어 메모리를 해제합니다. + subscription.disposed(by: disposeBag) + // 빠르게 비워주고 싶을때는 disposeBag을 새로 만들면 됩니다. + disposeBag = DisposeBag() + } + + public func publishSubject() { + let bag = DisposeBag() + var publishSubject = PublishSubject() + publishSubject.onNext("very first value") + publishSubject.subscribe { (event) in + print(event) + } + publishSubject.onNext("first value") + publishSubject.onNext("second value") + let error = NSError(domain:"error", code:401, userInfo:[ NSLocalizedDescriptionKey: "Invaild access token"]) + publishSubject.onError(error) + publishSubject.onNext("very last value") + publishSubject.onCompleted() + // --- 출력 --- + // next(first value) + // next(second value) + // error(test) + } + + public func sampleTest() { + let disposeBag = DisposeBag() + // ===== never ===== + let neverSequence = Observable.never() + let neverSequenceSubscription = neverSequence + .subscribe { _ in + print("This will never be printed") + } + neverSequenceSubscription.disposed(by: disposeBag) + // ===== empty ===== + Observable.empty() + .subscribe { event in + print(event) + } + .disposed(by: disposeBag) + // ===== of ===== + Observable.of("🐶", "🐱", "🐭", "🐹") + .subscribe(onNext: { element in + print(element) + }) + .disposed(by: disposeBag) + // ===== range ===== + Observable.range(start: 1, count: 10) + .subscribe { print($0) } + .disposed(by: disposeBag) + + // ===== repeatElement ===== + Observable.repeatElement("🔴") + .take(3) + .subscribe(onNext: { print($0) }) + .disposed(by: disposeBag) + // ===== generate ===== + Observable.generate( + initialState: 0, + condition: { $0 < 3 }, + iterate: { $0 + 1 } + ) + .subscribe(onNext: { print($0) }) + .disposed(by: disposeBag) + // ===== deferred ===== + var count = 1 + let deferredSequence = Observable.deferred { + print("Creating \(count)") + count += 1 + + return Observable.create { observer in + print("Emitting...") + observer.onNext("🐶") + observer.onNext("🐱") + observer.onNext("🐵") + return Disposables.create() + } + } + deferredSequence + .subscribe(onNext: { print($0) }) + .disposed(by: disposeBag) + deferredSequence + .subscribe(onNext: { print($0) }) + .disposed(by: disposeBag) + // ===== error ===== +// Observable.error(TestError.test) +// .subscribe { print($0) } +// .disposed(by: disposeBag) + // ===== doOn ===== + Observable.of("🍎", "🍐", "🍊", "🍋") + .do(onNext: { print("Intercepted:", $0) }, + onError: { print("Intercepted error:", $0) }, + onCompleted: { print("Completed") }) + .subscribe(onNext: { print($0) }) + .disposed(by: disposeBag) + } + + +} + diff --git a/jhjo/Picnic.swift b/jhjo/Picnic.swift index 534aa34..1569776 100755 --- a/jhjo/Picnic.swift +++ b/jhjo/Picnic.swift @@ -1,6 +1,6 @@ import Foundation - +//피크닉 class Picnic : NSObject { public func printResult() -> String { diff --git a/maythree/programmers/Hash/Camouflage.java b/maythree/programmers/Hash/Camouflage.java new file mode 100644 index 0000000..0b28885 --- /dev/null +++ b/maythree/programmers/Hash/Camouflage.java @@ -0,0 +1,67 @@ +package programmers.Hash; + +import java.util.HashMap; +import java.util.Map; + +/*** + * 문제 설명 + * 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. + * + * 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다. + * + * 종류 이름 + * 얼굴 동그란 안경, 검정 선글라스 + * 상의 파란색 티셔츠 + * 하의 청바지 + * 겉옷 긴 코트 + * 스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. + * + * 제한사항 + * clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. + * 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. + * 같은 이름을 가진 의상은 존재하지 않습니다. + * clothes의 모든 원소는 문자열로 이루어져 있습니다. + * 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다. + * 스파이는 하루에 최소 한 개의 의상은 입습니다. + * 입출력 예 + * clothes return + * [[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5 + * [[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3 + * 입출력 예 설명 + * 예제 #1 + * headgear에 해당하는 의상이 yellowhat, greenturban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다. + * + * 1. yellow_hat + * 2. blue_sunglasses + * 3. green_turban + * 4. yellow_hat + blue_sunglasses + * 5. green_turban + blue_sunglasses + * 예제 #2 + * face에 해당하는 의상이 crowmask, bluesunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다. + * + * 1. crow_mask + * 2. blue_sunglasses + * 3. smoky_makeup + */ +public class Camouflage { + public static void main(String[] args) { + + } + + public static int solution(String[][] clothes) { + int answer = 1; + Map clothesMap = new HashMap<>(); + for(String[] cloth : clothes) { + if(clothesMap.containsKey(cloth[1])) { + clothesMap.put(cloth[1], clothesMap.get(cloth[1]) + 1); + } else { + clothesMap.put(cloth[1], 1); + } + } + for(int value : clothesMap.values()) { + answer = answer * (value + 1); + } + + return answer - 1; + } +} diff --git a/maythree/programmers/Sort/BiggestNumber.java b/maythree/programmers/Sort/BiggestNumber.java new file mode 100644 index 0000000..1d50212 --- /dev/null +++ b/maythree/programmers/Sort/BiggestNumber.java @@ -0,0 +1,42 @@ +package programmers.Sort; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/*** + * 문제 설명 + * 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. + * + * 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. + * + * 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. + * + * 제한 사항 + * numbers의 길이는 1 이상 100,000 이하입니다. + * numbers의 원소는 0 이상 1,000 이하입니다. + * 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. + * 입출력 예 + * numbers return + * [6, 10, 2] 6210 + * [3, 30, 34, 5, 9] 9534330 + */ +public class BiggestNumber { + public static void main(String[] args) { + int[] numbers = {6, 10, 2}; + System.out.println(solution(numbers)); + } + + public static String solution(int[] numbers) { + List numberList = Arrays.stream(numbers) + .mapToObj(Integer::toString) + .collect(Collectors.toList()); + numberList.sort((o1, o2) -> (o2 + o1).compareTo(o1 + o2)); + + if(numberList.get(0).equals("0")){ + return "0"; + } + + return String.join("", numberList); + } +} diff --git a/maythree/programmers/Sort/KNumber.java b/maythree/programmers/Sort/KNumber.java new file mode 100644 index 0000000..d35b756 --- /dev/null +++ b/maythree/programmers/Sort/KNumber.java @@ -0,0 +1,49 @@ +package programmers.Sort; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; + +/*** + * 문제 설명 + * 배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다. + * + * 예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면 + * + * array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다. + * 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다. + * 2에서 나온 배열의 3번째 숫자는 5입니다. + * 배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요. + * + * 제한사항 + * array의 길이는 1 이상 100 이하입니다. + * array의 각 원소는 1 이상 100 이하입니다. + * commands의 길이는 1 이상 50 이하입니다. + * commands의 각 원소는 길이가 3입니다. + * 입출력 예 + * array commands return + * [1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3] + * 입출력 예 설명 + * [1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다. + * [1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다. + * [1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다. + */ + +public class KNumber { + public static void main(String[] args) { + int[] array = {1, 5, 2, 6, 3, 7, 4}; + int[][] commands = {{2, 5, 3}, {4, 4, 1}, {1, 7, 3}}; + solution(array, commands); + } + + public static int[] solution(int[] array, int[][] commands) { + int[] answer = Arrays.stream(commands).mapToInt(value -> { + int[] splitArray = Arrays.copyOfRange(array, value[0] -1, value[1]); + Arrays.sort(splitArray); + return splitArray[value[2] -1]; + }).toArray(); + + return answer; + } +}