목록코딩테스트 (20)
슈프림 블로그
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다. 위의 문장이 문제 내용의 전부다. h보다 큰 값이 h개 이상인 경우를 찾으면 된다. 어떻게 접근해야할까?? 최대값을 찾아야 하므로 일단 citations를 내림차순으로 정렬하는 것이 편리할 것이다. 내림차순 정렬된 배열은 x보다 작은 인덱스에 위치한 값은 x번째 값보다 크다는 것을 이용하여, h-1 인덱스의 값이 h 이상인지 판별하면 답을 얻어낼 수 있다. (= 적어도 0 ~ h-1 인덱스까지의 값들은 h 값 이상이라는 뜻) 실패 케이스 h를 점차 하나씩 줄여가면서 판단하면 되겠다는 생각으로, h의 초기값은 citations 값 중 최댓값으로 ..
문제에서 요구하는 그대로 풀어내면 되는 간단한 문제다. 먼저 2차원 배열 commands에는 [i,j,k]가 여러개 담겨있는 구조다. i와 j로는 부분 배열을 만들면 되고, k로는 정렬된 부분배열에서 값을 꺼내오면 된다. 반복문을 돌면서 i,j,k 값의 묶음을 꺼내자. for command in commands 사용하기 편리하도록 변수 i,j,k에 값을 저장해주자. 여기서 -1을 다 뺀 이유는?? 문제에서는 i번째, j번째, k번째라는 표현을 했는데, 배열 인덱스는 0부터 시작하므로 배열에 접근하기 위해서는 -1을 해줘야 한다. let i = command[0]-1 let j = command[1]-1 let k = command[2]-1 부분배열을 만들고, 정렬해주자. let sorted = array..
# 실패 케이스 1 가장 먼저 생각했던 방식은 1. 모든 Int형 배열로 들어온 입력값을 String형 배열로 변환한다. 2. 맨 앞자리를 비교하여 큰 수가 앞으로 가도록 정렬한다. 3. 정렬된 배열을 하나의 문자열로 변환한다. (joined 함수) func solution(_ numbers:[Int]) -> String { var strings = numbers.map{String($0)} strings.sort{ guard let first0 = $0.first, let first1 = $1.first else { return false } return first0 > first1 } return strings.joined() } 이 방식은 두번째 테스트 케이스를 통과하지 못했다. 3과 30과 34를..
먼저 조건을 살펴보았다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 이 조건들을 살펴 보니, 각 장르별로 노래가 재생된 횟수를 모두 더한 값을 가지고 있는 딕셔너리가 하나 필요 할 것 같고 그 횟수에 따라 가장 많이 재생된 장르부터 정렬된 배열이 필요할 것 같다. 그리고 장르별로 속한 노래가 무엇인지 저장하는 딕셔너리도 필요할 것 같다. 딕셔너리의 value값은 id(Int)들을 저장하는 배열일 것이다. playsByGenre: [String:Int] [장르이름 : 해당 장르가 총 재생된 횟수] - genres와 plays의 크기는 같다고 했으므로, 그 크기만큼..