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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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))