Merged
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))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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
Merged
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))
, '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
Merged
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))
, '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 \u003e 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
Merged
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))
, '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
Merged
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))
, '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
Merged
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))
, '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
Merged
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))
, '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
Merged
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))