Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 129 additions & 0 deletions CJ_Kim/season3/10/03-02/1107-리모컨.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import sys
from itertools import product
input = sys.stdin.readline

targetChannel = int(input())
brokenButtonNum = int(input())
pressBasic = len(str(targetChannel))
# 아래의 채널의 경우 100에서 +- 누르는 것보다 번호누르고 바로 이동하는 게 더 빨라요
exceptionChannel = [99, 100, 101, 102]

# 숫자 N을 NNN으로 만들고 싶을 때 makeRepeatNum(3, N)
def makeRepeatNum(num, repeat):
return int(str(num)*repeat)

# 가능한 채널들 중 누르는 횟수에 따라 가장 낮은 수 반환
def getLowestNum(possibleChannel, pressNum):
# ex.
# 99999
# 8
# 2 3 4 5 6 7 8 9
# possibleChannel = [0, 1]
# pressNum = 6
# return : 100000
if len(possibleChannel)==1:
return makeRepeatNum(possibleChannel[0], pressNum)
minFirst = possibleChannel[0] if possibleChannel[0] != 0 else possibleChannel[1]
lowestNum = str(minFirst) + str(possibleChannel[0])*(pressNum-1)
return int(lowestNum)

# 만약 모든 버튼 작동가능할 때
if brokenButtonNum==0:
# 예외 채널 인 경우는 별도 처리
if targetChannel in exceptionChannel:
print(abs(targetChannel-100))
exit()
print(pressBasic)
exit()
else:
brokenButtonList = list(map(int, input().strip().split()))

# 정상작동하는 버튼 리스트
normalButton = [i for i in range(10) if i not in brokenButtonList]

# 정상작동하는 버튼 리스트로 누를 수 있는 채널 리스트
possibleChannelList = []

# 중복순열
for channelTupple in product(normalButton, repeat=pressBasic):
# ex. normalButton = [5, 6, 7, 8, 9]일 경우
# (5, 5, 5), (5, 5, 6), (5, 5, 7) , ..., (9, 9, 8), (9, 9, 9)
possibleChannel = ''
for num in channelTupple:
# (5, 5, 5) -> '555'
possibleChannel+=str(num)
possibleChannelList.append(int(possibleChannel))

# target을 기준으로 더 수가 낮은 채널과 높은 채널 분리
lowerChannelList = []
higherChannelList = []

for channel in possibleChannelList:
if channel < targetChannel:
lowerChannelList.append(channel)
# 만약 누를 수 있는 리스트 안에 가고 싶은 채널이 바로 있는 경우
elif channel == targetChannel:
if channel in exceptionChannel:
print(abs(targetChannel-100))
exit()
print(pressBasic)
exit()
else:
higherChannelList.append(channel)

compareList = []


if lowerChannelList==[]:
# 모든 버튼이 고장나서 누를 수 있는 버튼이 없는 경우
if higherChannelList==[]:
print(abs(targetChannel-100))
exit()
# 가고 싶은 채널이 일의 자리 수가 아닌 경우
# ex.
# 433
# 8
# 1 2 3 4 5 6 7 8
# 99를 넣기 999-433 = 566 / 433-99 = 434
if pressBasic!=1:
compareList.append(makeRepeatNum(possibleChannel[-1], (pressBasic-1)))
# 가고 싶은 채널에 가장 가까운 채널 넣기
compareList.append(higherChannelList[0])
else:
compareList.append(lowerChannelList[-1])
# 가고 싶은 채널보다 작은 것들만 있을 때
if higherChannelList==[]:
compareList.append(getLowestNum(normalButton, pressBasic+1))
else:
compareList.append(higherChannelList[0])

# 버튼을 누르는 채널
pressChannel = 0
# 최소 차이
minDiff = float("inf")
for channel in compareList:
# abs(targetChannel-channel)은 곧 +, -를 누르는 횟수를 의미
if abs(targetChannel-channel) < minDiff:
minDiff = abs(targetChannel-channel)
pressChannel = channel

answer = min(len(str(pressChannel)) + abs(targetChannel-pressChannel), abs(targetChannel-100))
print(answer)

'''
애먹었던 반례 리스트
1555
3
0 1 9
670
671

99999
8
2 3 4 5 6 7 8 9
7

0
1
0
'''
26 changes: 26 additions & 0 deletions CJ_Kim/season3/10/03-02/9375-패션왕 신해빈.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import sys
input = sys.stdin.readline

testCase = int(input())

# 옷장의 든 종류별 옷 개수에다가 안 입는 경우를 합친 경우의 수
# 종류별로 위의 경우의 수를 곱한 뒤
# 마지막에 모두 안 입는 경우를 빼면 된다
def countCase(closet):
if closet == {}:
return 0
case = 1
for names in closet.values():
case *= len(names)+1
return case -1

for _ in range(testCase):
closet = {}
wearNum = int(input())
for _ in range(wearNum):
name, type = input().strip().split()
if type in closet.keys():
closet[type].append(name)
else:
closet[type]=[name]
print(countCase(closet))
85 changes: 85 additions & 0 deletions CJ_Kim/season3/10/03-02/9935_문자열 폭발.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
'''
#시간초과

import sys
input = sys.stdin.readline

sanggeun_str = input().strip()
bomb_str = input().strip()

char_stack = ''
for char in sanggeun_str:
char_stack += char
if char == bomb_str[-1]:

if len(char_stack)>=len(bomb_str) and char_stack[-1-(len(bomb_str))+1:] == bomb_str:
bomb_index = 0
new_stack = char_stack[:-(len(bomb_str))]
char_stack = new_stack

if char_stack == '':
print('FRULA')
else:
print(char_stack)
'''

'''
# 42020KB, 748ms
import sys
input = sys.stdin.readline

sanggeun_str = input().strip()
bomb_str = input().strip()

char_stack = []
for char in sanggeun_str:
char_stack.append(char)
if char == bomb_str[-1]:
if len(char_stack)>=len(bomb_str) and char_stack[-1-(len(bomb_str))+1:] == list(bomb_str):
bomb_index = 0
while bomb_index < len(bomb_str):
bomb_index += 1
char_stack.pop()

if char_stack == []:
print('FRULA')
else:
print(''.join(char_stack))
'''

'''
mirkovC4 nizCC44
👆
항상 여기 끝에서 검사합니다.
C4
'''

# 42024KB 568ms

# 위의 것과 다른 점은
# 위는 검사 후 앞의 stack에서 삭제 할 때 폭발 문자열 수만큼 pop을 한 것이고,
# 아래는 slice한 것에 대해 del을 쓴 것입니다.
import sys
input = sys.stdin.readline

sanggeun_str = input().strip()
bomb_str = input().strip()

# 주어진 문자열을 돌면서 왼쪽부터 떼내어 하나씩 넣는 곳
char_stack = []

for char in sanggeun_str:
char_stack.append(char)
# 방금 넣었던 것과 폭발 문자열의 오른쪽 끝과 비교하여 먼저 걸러주기
# 폭발 문자열과 슬라이스한 것과 비교를 먼저 안 하는 이유는
# 슬라이스한 것도 시간이 많이 들고, 더불어 왼쪽 스택에서 폭발 문자열 수만큼 안 들어올 경우도 있기에,
# 시간 절약을 위해 간단한 연산으로 먼저 빠르게 걸러주었습니다.
if char == bomb_str[-1]:
# 왼쪽에 쌓인 스택이 폭발 문자열 수보다 같거나 크고, 슬라이싱한 것과 동일할 때 제거해주기
if len(char_stack)>=len(bomb_str) and char_stack[-(len(bomb_str)):] == list(bomb_str):
del char_stack[-(len(bomb_str)):]

if char_stack == []:
print('FRULA')
else:
print(''.join(char_stack))