-
-
Save soursop/732248dc6b30c40a66b3 to your computer and use it in GitHub Desktop.
TheNextNumber.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package thenextnumber | |
object Main { | |
def solve(num: String): BigInt = { | |
def solve(remain: Seq[Int], passed: Seq[Int]): BigInt = { | |
if (remain.isEmpty) { | |
solve(Seq(0), passed) | |
} else { | |
if (passed.head <= remain.last) solve(remain.init, remain.last +: passed) | |
else { | |
val divided = passed.reverse.groupBy(_ > remain.last) | |
val (bigger, smaller) = (divided.get(true).getOrElse(Seq()), divided.get(false).getOrElse(Seq())) | |
// println(f" remain:$remain passed:$passed divided:$divided") | |
val replaced = (smaller ++ bigger.tail :+ remain.last) | |
val sorted = replaced.sorted | |
val result = (remain.init :+ bigger.head) ++ sorted | |
BigInt(result.mkString) | |
} | |
} | |
} | |
val numbers = num.map(_.asDigit) | |
solve(numbers.init, numbers.last +: Nil) | |
} | |
def main(args: Array[String]) { | |
run() | |
} | |
def test() { | |
println(solve("115") == 151) | |
println(solve("1051") == 1105) | |
println(solve("6233") == 6323) | |
println(solve("8000") == 80000) | |
println(solve("88") == 808) | |
} | |
def run() { | |
val writer = new java.io.PrintWriter("b-large.out") | |
try { | |
process(io.Source.fromFile("B-large-practice.in").getLines)(writer.println) | |
} finally { | |
writer.flush() | |
writer.close() | |
} | |
} | |
def process(lineIn: Iterator[String])(lineOut: String => Unit) = { | |
for (i <- 1 to lineIn.next().toInt) { | |
val x = lineIn.next() | |
val answer = solve(x) | |
lineOut(s"Case #$i: $answer") | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
val divided = passed.reverse.groupBy(_ > remain.last)
val (bigger, smaller) = (divided.get(true).getOrElse(Seq()), divided.get(false).getOrElse(Seq()))
이 부분은 아마도
val (bigger, smaller) = passed.reverse.partition(_ > remain.last)
으로 줄일 수 있을 것 같네요 ㅎㅎ