https://www.acmicpc.net/problem/2659
문제
위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 1 이상 9 이하의 숫자가 하나씩 씌여 있다. 이 네 개의 숫자 중에는 같은 숫자도 있을 수 있다.
모든 가능한 십자 카드가 주어질 때, 각각의 카드는 다음과 같은 '시계수'라는 번호를 가진다. 시계수는 카드의 숫자들을 시계 방향으로 읽어서 만들어지는 네 자리 수들 중에서 가장 작은 수이다. 위 그림의 카드는 시계방향으로 3227, 2273, 2732, 7322로 읽을 수 있으므로, 이 카드의 시계수는 가장 작은 수인 2273이다.
입력으로 주어진 카드의 시계수를 계산하여, 그 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 알아내는 프로그램을 작성하시오.
예를 들어서, 다음과 같은 십자 카드의 시계수는 1122이며, 이 시계수보다 작은 시계수들은 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119 뿐이므로 1122는 10번째로 작은 시계수다. (여기서 십자카드는 0 이 나타날 수 없으므로 1120은 시계수가 될 수 없다. 또한 1121 이 적혀있는 카드의 시계수는 1112이므로, 1121은 시계수가 될 수 없다.
입력
입력은 한 줄로 이루어지며, 이 한 줄은 카드의 네 모서리에 씌여있는 1 이상 9 이하의 숫자 4개가 시계 방향으로 입력된다. 각 숫자 사이에는 빈칸이 하나 있다.
출력
입력된 카드의 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 출력한다.
해설
시계수는 시계 방향으로 읽어 만들어지는 네 자리 수들 중 가장 작은 수이다.
2 1 1 2를 입력받았다면 시계수는 1122가 된다.
시계수를 구하는 방법은 다음과 같다.
repeat(3) {
repeat(3) {
x = x % 1000 * 10 + x / 1000
if(temp > x) temp = x
}
3번만 반복하는 이유는 입력받은 수는 빼기 때문이다.
이제 1111부터 시작하여 우리가 구한 시계숙까지 몇개의 시계수가 있는지를 구하면 된다.
소스 코드
import java.util.*
fun main() = with(System.`in`.bufferedReader()) {
val arr = IntArray(4)
val st = StringTokenizer(readLine())
repeat(4) { i -> arr[i] = st.nextToken().toInt() }
val res = min(arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3])
var cnt = 0
for(i in 1111 .. res) {
if(min(i) == i) cnt++
}
println(cnt)
}
fun min(n: Int): Int {
var x = n
var temp = n
repeat(3) {
x = x % 1000 * 10 + x / 1000
if(temp > x) temp = x
}
return temp
}
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 2792번: 보석 상자 (0) | 2022.02.21 |
---|---|
[백준/BOJ] 16165번: 걸그룹 마스터 준석이 (0) | 2022.02.21 |
[백준/BOJ] 13414번: 수강신청 (0) | 2022.02.20 |
[백준/BOJ] 2910번: 빈도 정렬 (0) | 2022.02.20 |
[백준/BOJ] 651번: 이항 쇼다운 (0) | 2022.02.19 |
댓글