알고리즘/백준(BOJ)

[백준/알고리즘]#2659: 십자카드 문제 [파이썬(python)/구현]

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

 

2659번: 십자카드 문제

입력은 한 줄로 이루어지며, 이 한 줄은 카드의 네 모서리에 씌여있는 1 이상 9 이하의 숫자 4개가 시계 방향으로 입력된다. 각 숫자 사이에는 빈칸이 하나 있다.

www.acmicpc.net

십자수를 구하는 로직 하나 짜고,

입력된 값의 십자수가 1111부터 몇번째 십자수인지 구하면 된다.

 

처음엔 문제를 잘못 이해해서

입력된 값의 십자수가 1111부터 몇번째 값인지만 구했는데 틀렸다.

 

 

틀린 파이썬 코드

#2659_십자카드 문제
import sys
input = sys.stdin.readline

clknum = int(''.join(input().split()))
clk=list(map(int,str(clknum)))

order = [0,1,2,3]*4
sorted_clk = []
for i in range(4):
    newclknum = int(clk[order[i+1]]*1000 + clk[order[i+2]]*100 + clk[order[i+3]]*10 + clk[order[i]])
    sorted_clk.append(newclknum)
    if clknum > newclknum:
        clknum = newclknum

cnt=0
for i in range(1111, clknum):
    check_zero=list(map(int,str(i)))
    if 0 not in check_zero:
        cnt += 1
print(cnt)

 

십자수로 계속 카운트를 하는 로직으로 바꿔야했기 때문에

재귀로 바꾸어주었다.

 

맞은 파이썬 코드

#2659_십자카드 문제
import sys
input = sys.stdin.readline


order = [0,1,2,3]*4

def clkk(clknum):
    clk=list(map(int,str(clknum)))
    for i in range(4):
        newclknum = int(clk[order[i+1]]*1000 + clk[order[i+2]]*100 + clk[order[i+3]]*10 + clk[order[i]])
        if clknum > newclknum:
            clknum = newclknum
    return clknum

clknum = clkk(int(''.join(input().split())))


cnt=0
for i in range(1111, clknum+1):
    check_zero=list(map(int,str(i)))
    if 0 not in check_zero:
        if clkk(i)==i:
            cnt += 1
print(cnt)