diff --git "a/CJ_Kim/season3/10/03-02/1107-\353\246\254\353\252\250\354\273\250.py" "b/CJ_Kim/season3/10/03-02/1107-\353\246\254\353\252\250\354\273\250.py" new file mode 100644 index 0000000..7ab86aa --- /dev/null +++ "b/CJ_Kim/season3/10/03-02/1107-\353\246\254\353\252\250\354\273\250.py" @@ -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 +''' \ No newline at end of file diff --git "a/CJ_Kim/season3/10/03-02/9375-\355\214\250\354\205\230\354\231\225 \354\213\240\355\225\264\353\271\210.py" "b/CJ_Kim/season3/10/03-02/9375-\355\214\250\354\205\230\354\231\225 \354\213\240\355\225\264\353\271\210.py" new file mode 100644 index 0000000..aefcea2 --- /dev/null +++ "b/CJ_Kim/season3/10/03-02/9375-\355\214\250\354\205\230\354\231\225 \354\213\240\355\225\264\353\271\210.py" @@ -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)) diff --git "a/CJ_Kim/season3/10/03-02/9935_\353\254\270\354\236\220\354\227\264 \355\217\255\353\260\234.py" "b/CJ_Kim/season3/10/03-02/9935_\353\254\270\354\236\220\354\227\264 \355\217\255\353\260\234.py" new file mode 100644 index 0000000..6f7fea5 --- /dev/null +++ "b/CJ_Kim/season3/10/03-02/9935_\353\254\270\354\236\220\354\227\264 \355\217\255\353\260\234.py" @@ -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))