백준 2659번 - 십자카드 문제

Posted by qwlake on March 22, 2020

https://www.acmicpc.net/problem/2659

먼저 입력받은 숫자를 시계수로 만들고, 이보다 작은 시계수의 개수를 구하는 방법으로 풀었다.

지금 보니 이게 최선의 알고리즘인가 싶다.

무엇보다

1
t = str(i)+str(j)+str(k)+str(l)

이 문장이 마음에 안 드는데, 이는 f스트링을 사용해서 메모리를 더 적게 사용할 수 있다.

1
t = f"{i}{j}{k}{l}"

성능도 좋고 가독성도 좋으니 애용하도록 하자.

다음은 전체 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
n = input().split(" ")

def find(num):
    a = [num]
    for i in range(1,4):
        num = num[1:]+num[0:1]
        a.append(num)
    return min(a)

n = find(n)
a = []
for i in range(int(n[0]), 0, -1):
    for j in range(int(n[1]), 0, -1):
        for k in range(int(n[2]), 0, -1):
            for l in range(int(n[3]), 0, -1):
                t = str(i)+str(j)+str(k)+str(l)
                if t == find(t):
                    a.append(t)
            n[3] = "9"
        n[2] = "9"
    n[1] = "9"
print(len(a))

https://github.com/qwlake/study-algorithm/blob/master/Python/baekjoon/KOI1997/n2659/n2659.py