array = []
for i in range(9):
array.append(int(input()))
array.sort()
sum_ = sum(array)
for i in range(len(array)):
for j in range(i + 1, len(array)):
if sum_ - array[i] - array[j] == 100:
for k in range(len(array)):
if k == i or k == j:
pass
else:
print(array[k])
exit()
문제는 9명 중에 7명을 뽑아서 그 합이 100이면 해당하는 7개의 값을 출력하는 문제입니다.
7개를 무작위로 뽑아서 하나씩 모두 더해 100이 나오면 해당 값을 출력하면 되지만,
좀 더 쉽게 9명 중 2명을 뽑아 해당 값을 전체 합에서 빼서 100이라면 훨씬 줄일 수 있습니다.
9개 중 7개의 합 ( x )
9개 총합에서 2개 뺄셈 ( o )
import sys
input = sys.stdin.readline
def check(arr):
n = len(arr)
answer = 1
for i in range(n):
# 열 순회하면서 연속되는 숫자 세기
cnt = 1
for j in range(1, n):
if arr[i][j] == arr[i][j - 1]:
# 이전 것과 같다면 cnt에 1 더하기
cnt += 1
else:
# 이전과 다르다면 다시 1로 초기화
cnt = 1
# 비교해서 현재 cnt가 더 크다면 answer 갱신하기
if cnt > answer:
answer = cnt
# 행 순회하면서 연속되는 숫자 세기
cnt = 1
for j in range(1, n):
if arr[j][i] == arr[j - 1][i]:
# 이전 것과 같다면 cnt에 1 더하기
cnt += 1
else:
# 이전과 다르다면 다시 1로 초기화
cnt = 1
# 비교해서 현재 cnt가 더 크다면 answer 갱신하기
if cnt > answer:
answer = cnt
return answer
n = int(input())
arr = [list(input()) for _ in range(n)]
answer = 0
for i in range(n):
for j in range(n):
# 열 바꾸기
if j + 1 < n:
# 인점한 것과 바꾸기
arr[i][j], arr[i][j + 1] = arr[i][j + 1], arr[i][j]
# check는 arr에서 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수이다
temp = check(arr)
if temp > answer:
answer = temp
# 바꿨던 것을 다시 원래대로 돌려놓기
arr[i][j], arr[i][j + 1] = arr[i][j + 1], arr[i][j]
# 행 바꾸기
if i + 1 < n:
# 인점한 것과 바꾸기
arr[i][j], arr[i + 1][j] = arr[i + 1][j], arr[i][j]
# check는 arrd에서 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수이다
temp = check(arr)
if temp > answer:
answer = temp
# 바꿨던 것을 다시 원래대로 돌려놓기
arr[i][j], arr[i + 1][j] = arr[i + 1][j], arr[i][j]
print(answer)
E, S, M, cnt = 1, 1, 1, 1
i_E, i_S, i_M = map(int, input().split())
while (True):
if i_E == E and i_S == S and i_M == M:
break
E += 1
S += 1
M += 1
cnt += 1
if E >= 16:
E -= 15
if S >= 29:
S -= 28
if M >= 20:
M -= 19
print(cnt)
import sys
input = sys.stdin.readline
channel = int(input())
n = int(input())
broken = list(map(int, input().split()))
min_count = abs(100 - channel)
for nums in range(1000001):
nums = str(nums)
for i in range(len(nums)):
if int(nums[i]) in broken:
break
elif i == len(nums) - 1:
min_count = min(min_count, abs(int(nums) - channel) + len(nums))
print(min_count)
min_count = abs(100 - channel)
현재 채널에서 + 혹은 - 만 사용해 이동하는 최대 경우의 수를 구합니다.
for nums in range(1000001): nums = str(nums)
1,000,000의 범위에 있는 모든 수를 문자열로 바꿔 이를 nums로 변수선언합니다.
for i in range(len(nums)): if int(nums[i]) in broken: break
문자열로 된 모든 숫자 중 고장난 숫자를 포함한 숫자가 있는지 확인 후, 고장 났으면 break로 if문을 중단합니다.
elif i == len(nums) - 1: min_count = min(min_count, abs(int(nums) - channel) + len(nums))
고장난 숫자가 없는 숫자는 min_count 와 비교 후 min_count 로 업데이트합니다.
우선, range를 N
의 최대 범위인 500,000이 아닌 그 두 배 1,000,000로 해준 것은, 수빈이가 이동하려는 채널의 범위는 500,000 이하이지만 채널 자체는 무한대라는 점 때문입니다.
따라서, channel
과 가장 가까운 숫자를 찾을 때, channel
보다 작은 값은 물론이고 channel
보다 큰 값도 찾아줘야 하고, 이 값은 500,000 이상도 가능합니다.
만약에 수빈이가 이동하려는 채널이 500,000이고, 리모컨의 숫자 중 1, 2, 3, 4, 5
가 고장났다고 가정해본다면,
range의 범위가 500,000으로 제한되면, 시작점인 100번에서 +
만 눌러서 500,000까지 도달하는 총 499,900번 버튼을 클릭하게 할 것입니다.
하지만 이 방법이 최적의 해가 아닙니다.
600,000에서 -
를 100,000번 눌러 channel에 도달하는 것이 최적의 해가 될 것입니다.
이러한 이유 때문에 range를 1,000,000까지로 설정해주어야 합니다.