새소식

PS/백준

[백준/2659] 십자카드 문제 (Python)

  • -

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

 

2659번: 십자카드 문제

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

www.acmicpc.net

 

Difficulty : Silver 3

 

Status : Solved

 

Time : 00:15:19

 


 

문제 설명

 

더보기

위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 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

 

출력 예시

10

 

 


 

풀이

 

브루트포스로 접근해보자. 한 시계수가 나타낼 수 있는 수는 최대 4종류가 존재하므로 해시 등을 이용하면 편하다(나는 딕셔너리를 사용했다).

 

초기에 주어지는 값을 시계수 딕셔너리에 등록시키고 그 시계수값을 구한다. 이후 1111부터 9999까지 순회하며 시계수 딕셔너리에 저장되지 않았다면 1을 카운트하고, 저장되었으며 그 값이 초기값의 시계수값을 가리킨다면 카운트한 총 값을 반환하면 된다.

 

 

 

풀이 코드

clock_num_dict = dict()
_range = range(1, 10)

def rotate(s) :
  return s[1:] + s[0]

def clock_num_search(s) :
  clock_num = s
  num_list = list()
  num_list.append(s)
  
  for _ in range(3) :
    _s = rotate(s)
    if s > _s :
      clock_num = _s
    s = _s
    num_list.append(s)
  for num in num_list :
    clock_num_dict[num] = clock_num

  return clock_num

def init() :
  clock_num = ''.join(input().split())
  clock_num = clock_num_search(clock_num)
  return clock_num

def full_search(clock_num) :
  cnt = 1
  for i in _range :
    for j in _range :
      for k in _range :
        for l in _range :
          s = ''.join(map(str, [i, j, k, l]))
          if s in clock_num_dict :
            if clock_num_dict[s] == clock_num :
              return cnt
            continue
          clock_num_search(s)
          cnt += 1

  return -1

def solve() :
  clock_num = init()
  result = full_search(clock_num)
  print(result)

solve()

풀이 완료~

'PS > 백준' 카테고리의 다른 글

[백준/10165] 버스 노선 (Python)  (0) 2023.03.16
[백준/2573] 빙산 (Python)  (0) 2023.03.15
[백준/2615] 오목 (Python)  (2) 2023.03.14
[백준/2539] 모자이크 (Python)  (2) 2023.03.14
[백준/6987] 월드컵 (Python)  (0) 2023.03.13
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.