-
728x90
선택정렬을 써볼라했지만.. 코틀린에서 제공하는 sortWith메소드를 활용하면 됬다.
문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
출력
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
예제 입력 1
3 21 Junkyu 21 Dohyun 20 Sunyoung
예제 출력 1
20 Sunyoung 21 Junkyu 21 Dohyun
풀이
입력받을 사람들의 정보를 저장하기 위해서 데이터 클래스를 정의한다.
data class Member(val age: Int, val registrationOrder: Int, val info: String)
약간의 꼼수가있는데 입력값으로 부터 공백기준으로 나이를 추출해서 다시 데이터클래스의 age에 저장하고 입력순서와 공백을 포함한 입력값을 다시 info에 저장한다
info는 출력용 변수라고 보면된다.
여기서 입력 순서인 registrationOrder 가 있는 이유는 나이가 똑같을때는 입력순서대로 배열하기 위해서다.
데이터 클래스를 이용해서 정보를 저장하면, 정렬을 위한 알고리즘을 내가 구현할 필요없이
memberObjects.*sortWith*(*compareBy*(**{it**.age**}**,**{it**.registrationOrder**}**))
를 통해 나이와 입력순서를 기준으로 정렬이 가능해진다
for (i in 0 *until* count) { sb.append(memberObjects[i].info).append('\\n') } *println*(sb)
출력시에는 시간을 단축하기위해 StringBuilder()를 이용했다.
sb에 데이터 클래스에서 맴버의 정보를 가져와 뒤에 개행문자를 추가해 저장했다.
이렇게하면 배열에 반복적으로 접근해서 출력하는 것보다 빠르게 출력이 가능하다.
코드
import java.io.BufferedReader import java.io.InputStreamReader data class Member(val age: Int, val registrationOrder: Int, val info: String) fun main() { val reader = BufferedReader(InputStreamReader(System.`in`)) val sb = StringBuilder() val count = reader.readLine().toInt() val members = Array(count) { "" } val memberObjects = Array(count) { Member(0, 0, "") } for (i in 0 until count) { members[i] = reader.readLine() val tokens = members[i].split(" ") val age =tokens[0].toInt() memberObjects[i]=Member(age,i,members[i]) } reader.close() memberObjects.sortWith(compareBy({it.age},{it.registrationOrder})) for (i in 0 until count) { sb.append(memberObjects[i].info).append('\n') } println(sb) }
'백준' 카테고리의 다른 글
이상한 곱셈(공부필요) (0) 2023.07.31 최대공약수와 최소공배수<유클리드 호제법> (0) 2023.07.31 2751번 수 정렬하기 (0) 2023.07.31 소수 1312번 (좋은 문제..) (0) 2023.07.31 빠른 입출력 (0) 2023.07.31