3장. 완전 탐색

Updated:

주식 투자 기법

주식시장에는 손절과 익절이라는 단어가 있습니다.

손절은 자신이 매수하였던 가격보다 낮은 가격으로 손해를 보면서 주식을 판매한다는 뜻이고

익절은 자신이 매수하였던 가격보다 높은 가격으로 주식을 판매한다는 뜻입니다.

주식의 가격이 리스트로 주어질 때 언제 사고 언제 팔아야 익절을 할 수 있을까요?

  • 입력 예시 1
5 7 1 6 4
  • 출력 예시 1
5

최고의 이익을 낼 수 있는 익절 금액을 출력해야 합니다! 아래와 같은 예시가 주어졌을 때

5 7 1 6 4

3번째 인덱스에 있는 1이라는 가격에 사서 4번째 인덱스에 있는 6이라는 가격에 판매하면 최고의 이익을 낼 수 있습니다!

  • 입력
    • 자연수(NN)로 이루어진 리스트(LL)가 주어집니다.
    • 0 ≤ NN ≤ 100
    • 5 ≤ LL의 길이 ≤ 50
  • 출력
    • 낼 수 있는 최대의 이익을 계산하여 출력하세요.
arr = list(map(int, input().split()))

#print(arr)

Min = arr[0]
Max = 0

for i in range(1,len(arr)):
    if Min > arr[i]:
        Min = arr[i]
    else:
        if Max < arr[i] - Min:
            Max = arr[i] - Min
    
print(Max)

흰토끼의 회중시계

항상 아날로그 회중시계를 들고 다니던 흰토끼는 얼마전 큰 결심을 하고 최신 디지털 회중시계를 주문했습니다. 큰 기대감을 가지고 택배를 뜯어본 흰토끼는 시간이 표시되는 숫자 4가지가 뒤죽박죽 섞여 제대로 표시되지 않는 것을 보고 큰 실망감을 가졌습니다. 유감스럽게도 반품을하고 새 제품을 받을 시간이 없던 흰토끼는 자신이 직접 시계를 고치려고 합니다. 흰토끼는 과연 디지털 회중시계를 고칠 수 있을까요?

  • 입력 예시 1
0 1 2 4 
  • 출력 예시 1
21:40
  • 입력 예시 2
5 5 5 5
  • 출력 예시 2
-1
  • 입력
    • 회중시계에 표시되는 숫자들은 정렬되지 않은 4가지의 0부터 9까지의 정수입니다.
  • 출력
    • 4가지의 숫자로 만들 수 있는 가장 큰 시간을 출력하세요.
    • 시계에 표시 되는 시간은 24시간 기준입니다.
    • 시간을 출력할 수 없는 경우라면 -1을 출력하세요.
Max = -1

def ham(arr, c, che, re):
    if c == len(re):
        if int(re[0]) > 2:
            return 
        if int(re[0]) == 2 and int(re[1]) > 3:
            return
        if int(re[2]) > 5:
            return
        #print(re)
        global Max
        Max = max(Max,int(''.join(re)))
        return 
        
    for i in range(len(arr)):
        if che[i]:
            continue
        re[c] = arr[i]
        che[i] = True
        ham(arr, c+1, che, re)
        che[i] = False
        
    
arr = list(input().split())

che = [False for i in range(4)]

re = [0 for i in range(4)]

ham(arr,0,che,re)

if Max == -1 :
    print(-1)
else:
    print(str(Max)[:2]+":"+str(Max)[2:])

숫자놀이

모두가 나른해지는 오후 4시. 공작부인의 티타임에 초대된 엘리스는 티타임 장소에 도착했어요.

“깔깔깔 체셔, 역시 이 게임은 너무 재밌어.” “저도 그렇게 생각합니다. 주인님 마침 엘리스가 도착했군요.” “엘리스 너도 이 게임을 해보지 않을래?”라고 체셔가 물어보자 엘리스가 답했어요.

“응, 나도 해보고 싶어. 그런데 무슨 게임이야??”

“이 게임에 규칙은 간단해. 내가 두 가지 숫자를 말하면 넌 주어진 조건에 해당하는 모든 숫자를 답하면 되는 거야” 체셔는 엘리스를 바라보며 환하게 웃으며 답했어요.

“규칙은 이거야, 내가 첫 번째로 말하는 숫자는 답해야 하는 숫자의 자릿수가 되고 두 번째 숫자는 자릿수 간에 차이가 되지. 예를 들어 내가 첫 번째 숫자로 2, 두 번째 숫자로 5를 말하면 네가 답해야 하는 숫자는 16, 27, 38, 49, 50, 61, 72, 83, 94가 되는 거야”

“그리고 대답해야 할 모든 숫자는 0으로 시작할 수 없어. 즉, 07처럼 대답하는 건 안돼.”

“어때? 정말 쉽지???”

하지만 문과인 엘리스는 이게 무슨 소린지 전혀 이해하지 못하고 있었어요. 여러분이 엘리스를 도와 즐거운 티타임에 어울릴 수 있도록 정답을 알려주세요!

  • 입력 예시 1
2
5
  • 출력 예시 1
16 27 38 49 50 61 72 83 94
  • 입력 예시 2
4
6
  • 출력 예시 2
1717 2828 3939 6060 7171 8282 9393
  • 입력
    • 첫 번째 줄에 자릿수(DigitDigit)가 주어집니다. (2 ≤ DigitDigit ≤ 9)
    • 두 번째 줄에 자릿수 간에 차이(DifferenceDifference)가 주어집니다. (0 ≤ DifferenceDifference ≤ 9)
  • 출력
    • 주어진 입력 값인 자릿수(DigitDigit)와 자릿수 간에 차이(DifferenceDifference)에 해당하는 숫자들을 공백을 기준으로 출력하세요.
    • 출력하는 숫자의 순서는 오름차순으로 정렬되어 있어야 합니다.
N = int(input())
di = int(input())

arr = []

def ham(Str, num, cnt, N):
    if cnt == N-1:
        print(Str,end=' ')
        return
    if num - di >= 0:
        ham(Str+str(num - di), num - di,cnt+1, N)
    if di!=0 and num + di < 10:
        ham(Str+str(num + di), num + di,cnt+1, N)

for i in range(1,10):
    tmp = i
    Str = str(tmp)
    ham(Str, tmp,0, N)

스도쿠 마스터

퍼즐 게임을 좋아하는 체셔는 요즘 스도쿠에 푹 빠져있습니다. 스도쿠는 숫자퍼즐게임으로 다음과 같은 규칙을 가지고 있습니다.

스도쿠의 규칙

  1. 각각의 가로줄과 세로줄에 숫자 1~9가 중복 없이 하나씩 들어간다.
  2. 3X3 모양의 네모난 박스 안에는 1~9가 중복 없이 하나씩 들어간다.
  3. 체셔는 재밌는 스도쿠를 여러 친구들과 같이 즐기고 싶어서 문제와 답지를 같이 건네주려고 합니다. 하지만 체셔는 답지를 가지고 있지 않아 모든 문제의 답을 찾는 시간이 너무 아깝게 느껴졌습니다. 이런 체셔를 위해 여러분이 스도쿠의 답을 출력해주는 프로그램을 만들어주세요.
  • 입력 예시
0 6 8 0 0 0 9 3 0
0 4 2 0 0 0 6 0 0
1 9 0 0 8 0 0 4 0
0 8 5 2 0 1 0 0 7
7 0 0 8 9 0 0 0 0
2 0 9 0 0 7 5 0 3
0 2 0 1 0 0 0 5 0
8 5 0 0 4 0 7 6 0
4 7 3 0 5 2 0 0 9
  • 출력 예시
5 6 8 7 2 4 9 3 1 
3 4 2 5 1 9 6 7 8 
1 9 7 3 8 6 2 4 5 
6 8 5 2 3 1 4 9 7 
7 3 4 8 9 5 1 2 6 
2 1 9 4 6 7 5 8 3 
9 2 6 1 7 8 3 5 4 
8 5 1 9 4 3 7 6 2 
4 7 3 6 5 2 8 1 9 
  • 입력
    • 9개의 숫자가 공백을 기준으로 나뉘어 9줄로 제공됩니다.
    • 현재 스도쿠의 비어있는 칸은 0으로 표시됩니다.
    • 정답을 찾을 수 없는 입력값은 주어지지 않습니다.
    • 정답이 여러 개일 수 있는 입력은 주어지지 않습니다.
  • 출력
    • 모든 빈 칸이 채워진 스도쿠의 정답을 입력값과 동일한 형태인 9개의 숫자를 공백을 기준으로 9줄로 출력하세요.

    
    
arr = []
for i in range(9):
    arr.append(list(map(int, input().split())))
    
done = False

def sudoku_check(r,c, value):
    for i in range(9):
        if arr[r][i] == value:
            return False
    for i in range(9):
        if arr[i][c] == value:
            return False
    x = (r//3)*3
    y = (c//3)*3
    for i in range(3):
        for j in range(3):
            if arr[x+i][y+j] == value:
                return False
    return True
    
def sudoku():
    global done
    for i in range(9):
        for j in range(9):
            if arr[i][j] != 0:
                continue
            for k in range(1,10):
                if sudoku_check(i,j,k):
                    arr[i][j] = k
                    sudoku()
                    if done:
                        return
                    arr[i][j] = 0
            return
    done = True
    return

sudoku()
for i in range(9):
    print(' '.join(map(str,arr[i])))

엘리스의 동물어 수업

코더랜드에는 말을 할 수 있는 동물들이 모여사는 aniski 나라가 있습니다. 이 나라의 동물들은 aniski어라는 조금 특별한 언어를 사용합니다. aniski어는 특이하게도 모든 말을 “ani”로 시작해서 “ski”로 끝이 납니다.

엘리스는 이 나라에 동물어 학습지를 판매 하고 있습니다. 홍보를 위해 짧은 시간 동안 동물 어린이들에게 글자를 가르쳐서 얼마나 효과가 좋은 지 증명하려고 합니다. 엘리스가 몇 개의 글자를 가르쳤을 때 동물 어린이들이 배울수 있는 단어는 몇 개나 될까요?

  • 입력 예시 1
7
3
anircski
anihelloski
anirzcski
  • 출력 예시 1
1
  • 입력 예시 2
8
3
anircski
anihelloski
anirzcski
  • 출력 예시 2
2
  • 입력
    • 첫 번째 줄에 엘리스가 가르친 글자의 숫자가 주어집니다. 이 글자의 수는 0이상 26이하의 알파벳 소문자입니다.
    • 두 번째 줄에는 aniski어의 단어의 수가 주어집니다. 이 수는 1이상 100 이하 입니다.
    • 세 번째 줄부터 aniski어의 단어가 주어집니다. 이 단어는 중복 되지 않음이 보장됩니다.
  • 출력
    • 학생들이 읽을 수 있는 단어의 개수의 최댓값을 출력하세요.
k = int(input())
n = int(input())
Strs = []

for i in range(n):
    Strs.append(input().replace('a','').replace('s','').replace('n','').replace('i','').replace('k',''))
k-=5
Max = 0

def can_read(Str):
    if len(Str) == k:
        global Max
        cnt = 0
        for my_str in Strs:
            check = False
            for s in my_str:
                if s not in Str:
                    check = True
                    break
            if not check:
                cnt += 1
        Max = max(Max, cnt)
        
    elif len(Str) == 0:
        for i in range(ord('a'),ord('z')+1):
            if chr(i) == 'a' or chr(i) == 's' or chr(i) == 'n' or chr(i) == 'i' or chr(i) == 'k':
                continue
            can_read(Str + chr(i))
    else:
        for i in range(ord(Str[-1])+1,ord('z')+1):
            if chr(i) == 'a' or chr(i) == 's' or chr(i) == 'n' or chr(i) == 'i' or chr(i) == 'k':
                continue
            can_read(Str + chr(i))
            
if k<0:
    print(0)
else:
    can_read('')
    print(Max)

Leave a comment