diff --git a/code_study/programmers/스킬 체크 테스트 Level 1/problem.txt b/code_study/programmers/스킬 체크 테스트 Level 1/problem.txt new file mode 100644 index 0000000..96b25ef --- /dev/null +++ b/code_study/programmers/스킬 체크 테스트 Level 1/problem.txt @@ -0,0 +1,43 @@ +문제 1 +단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. +단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. + +재한사항 +s는 길이가 1 이상, 100이하인 스트링입니다. + +입출력 예 +s return +"abcde" "c" +"qwer" "we" + +문제 2 +네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. +그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. +다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다. +지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다. +전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. +각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. +지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다. +"지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다. +암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다. + +입력 형식 +입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다. +1 ≦ n ≦ 16 +arr1, arr2는 길이 n인 정수 배열로 주어진다. +정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다. +출력 형식 +원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라. + +입출력 예제 +매개변수 값 +n 5 +arr1 [9, 20, 28, 18, 11] +arr2 [30, 1, 21, 17, 28] +출력 ["#####","# # #", "### #", "# ##", "#####"] + +매개변수 값 +n 6 +arr1 [46, 33, 33 ,22, 31, 50] +arr2 [27 ,56, 19, 14, 14, 10] +출력 ["######", "### #", "## ##", " #### ", " #####", "### # "] \ No newline at end of file diff --git a/code_study/programmers/스킬 체크 테스트 Level 1/solution1.py b/code_study/programmers/스킬 체크 테스트 Level 1/solution1.py new file mode 100644 index 0000000..137c370 --- /dev/null +++ b/code_study/programmers/스킬 체크 테스트 Level 1/solution1.py @@ -0,0 +1,6 @@ +def solution(s): + return s[(l - 1) // 2] if (l := len(s)) % 2 == 1 else s[l//2 - 1 : l//2 + 1] + +print(solution("hello")) +print(solution("abcde")) +print(solution("qwer")) \ No newline at end of file diff --git a/code_study/programmers/스킬 체크 테스트 Level 1/solution2.py b/code_study/programmers/스킬 체크 테스트 Level 1/solution2.py new file mode 100644 index 0000000..c05a8ca --- /dev/null +++ b/code_study/programmers/스킬 체크 테스트 Level 1/solution2.py @@ -0,0 +1,21 @@ +def solution(n, arr1, arr2): + ans = [] + + for a, b in zip(arr1, arr2) : + row = "" + num = a | b + + while num != 0: + val = num % 2 + row += "#" if val else " " + num //= 2 + + while len(row) < n : + row += " " + + ans.append(row[::-1]) + + return ans + +print(solution(6, [46, 33, 33 ,22, 31, 50], [27 ,56, 19, 14, 14, 10])) +["######", "### #", "## ##", " #### ", " #####", "### # "] \ No newline at end of file diff --git a/code_study/programmers/스킬 체크 테스트 Level 2/problem.txt b/code_study/programmers/스킬 체크 테스트 Level 2/problem.txt new file mode 100644 index 0000000..811fd28 --- /dev/null +++ b/code_study/programmers/스킬 체크 테스트 Level 2/problem.txt @@ -0,0 +1,47 @@ +문제 1 +사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. +사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다. +단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요. + +제한사항 +word의 길이는 1 이상 5 이하입니다. +word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다. + +입출력 예 +word result +"AAAAE" 6 +"AAAE" 10 +"I" 1563 +"EIO" 1189 + +문제 2 +문제를 받은 루는 다음과 같은 순서대로 과제를 하려고 계획을 세웠습니다. +과제는 시작하기로 한 시각이 되면 시작합니다. +새로운 과제를 시작할 시각이 되었을 때, 기존에 진행 중이던 과제가 있다면 진행 중이던 과제를 멈추고 새로운 과제를 시작합니다. +진행중이던 과제를 끝냈을 때, 잠시 멈춘 과제가 있다면, 멈춰둔 과제를 이어서 진행합니다. +만약, 과제를 끝낸 시각에 새로 시작해야 되는 과제와 잠시 멈춰둔 과제가 모두 있다면, 새로 시작해야 하는 과제부터 진행합니다. +멈춰둔 과제가 여러 개일 경우, 가장 최근에 멈춘 과제부터 시작합니다. +과제 계획을 담은 이차원 문자열 배열 plans가 매개변수로 주어질 때, 과제를 끝낸 순서대로 이름을 배열에 담아 return 하는 solution 함수를 완성해주세요. + +제한사항 +3 ≤ plans의 길이 ≤ 1,000 +plans의 원소는 [name, start, playtime]의 구조로 이루어져 있습니다. +name : 과제의 이름을 의미합니다. +2 ≤ name의 길이 ≤ 10 +name은 알파벳 소문자로만 이루어져 있습니다. +name이 중복되는 원소는 없습니다. +start : 과제의 시작 시각을 나타냅니다. +"hh:mm"의 형태로 "00:00" ~ "23:59" 사이의 시간값만 들어가 있습니다. +모든 과제의 시작 시각은 달라서 겹칠 일이 없습니다. +과제는 "00:00" ... "23:59" 순으로 시작하면 됩니다. 즉, 시와 분의 값이 작을수록 더 빨리 시작한 과제입니다. +playtime : 과제를 마치는데 걸리는 시간을 의미하며, 단위는 분입니다. +1 ≤ playtime ≤ 100 +playtime은 0으로 시작하지 않습니다. +배열은 시간순으로 정렬되어 있지 않을 수 있습니다. +진행중이던 과제가 끝나는 시각과 새로운 과제를 시작해야하는 시각이 같은 경우 진행중이던 과제는 끝난 것으로 판단합니다. + +입출력 예 +plans result +[["korean", "11:40", "30"], ["english", "12:10", "20"], ["math", "12:30", "40"]] ["korean", "english", "math"] +[["science", "12:40", "50"], ["music", "12:20", "40"], ["history", "14:00", "30"], ["computer", "12:30", "100"]] ["science", "history", "computer", "music"] +[["aaa", "12:00", "20"], ["bbb", "12:10", "30"], ["ccc", "12:40", "10"]] ["bbb", "ccc", "aaa"] \ No newline at end of file diff --git a/code_study/programmers/스킬 체크 테스트 Level 2/solution1.swift b/code_study/programmers/스킬 체크 테스트 Level 2/solution1.swift new file mode 100644 index 0000000..0be13b3 --- /dev/null +++ b/code_study/programmers/스킬 체크 테스트 Level 2/solution1.swift @@ -0,0 +1,20 @@ +import Foundation + +func solution(_ word:String) -> Int { + let dict: [Character: Int] = ["A": 0, "E": 1, "I": 2, "O": 3, "U": 4] + var idx: Int = 5 + var ans: Int = 0 + + for c in word { + let w: Int = (Int(pow(Double(5), Double(idx))) - 1) / 4 + ans += w * dict[c, default: 0] + 1 + idx -= 1 + } + + return ans +} + + +let word: String = "AAAE" + +print(solution(word)) diff --git a/code_study/programmers/스킬 체크 테스트 Level 2/solution2.swift b/code_study/programmers/스킬 체크 테스트 Level 2/solution2.swift new file mode 100644 index 0000000..7e1f877 --- /dev/null +++ b/code_study/programmers/스킬 체크 테스트 Level 2/solution2.swift @@ -0,0 +1,53 @@ +import Foundation + +func solution(_ plans: [[String]]) -> [String] { + var tasks: [(name: String, start: Int, playTime: Int)] = [] + + func timeToMinutes(_ timeStr: String) -> Int { + let components = timeStr.split(separator: ":").map { Int($0)! } + return components[0] * 60 + components[1] + } + + for plan in plans { + let name = plan[0] + let start = timeToMinutes(plan[1]) + let playTime = Int(plan[2])! + tasks.append((name, start, playTime)) + } + + tasks.sort { $0.start < $1.start } + + var answer: [String] = [] + var stack: [(name: String, remainingTime: Int)] = [] + + for i in 0..<(tasks.count - 1) { + let currentTask = tasks[i] + let nextTask = tasks[i + 1] + + var availableTime = nextTask.start - currentTask.start + stack.append((currentTask.name, currentTask.playTime)) + + while availableTime > 0 && !stack.isEmpty { + let lastIndex = stack.count - 1 + var pausedTask = stack[lastIndex] + + if pausedTask.remainingTime <= availableTime { + answer.append(pausedTask.name) + availableTime -= pausedTask.remainingTime + stack.removeLast() + } else { + pausedTask.remainingTime -= availableTime + stack[lastIndex] = pausedTask + availableTime = 0 + } + } + } + + answer.append(tasks.last!.name) + + while !stack.isEmpty { + answer.append(stack.removeLast().name) + } + + return answer +}