Q6. 자릿수의 합 : N개의 자연수에 대해서 digit_sum()으로 각 자릿수 합을 구하고 그 합이 최대인 자연수 출력, 같을 경우 입력이 먼저 된 값을 출력
입력 :
N(3<=N<=100)
N개의 자연수
출력 : 합이 최대인 자연수
[내가 쓴 코드]
def digit_sum(x) :
sum = 0
for i in range(len(str(x))) : #x의 자릿수만큼 반복
x, y = divmod(x, 10) #몫, 나머지 = divmod(x 나누기 10)
sum += y #나머지를 더하면서 각 자릿수에 대해 합
return sum
#def digit_sum(x) : #처음 고려한 방법
# sum = 0
# for i in range(len(str(x))) :
# y += x % 10
# x = x // 10
# return y
n = int(input())
a = list(map(int, input().split()))
max = 0 #가장 큰 합을 저장할 변수
for i in range(n) : #n이 주어졌기 때문에 각 원소의 값 대신 인덱스를 활용함
k = digit_sum(a[i]) #합을 k에 저장
if max < digit_sum(a[i]) : #현재 가장 큰 값이면 max 갱신, index를 저장
max = k
index = i
print(a[index]) #해당 값 출력
[풀이 코드]
n = int(input())
a = list(map(int, input().split()))
def digit_sum(x) :
sum = 0
while x > 0 : #x가 0이 아닐때까지
sum += x % 10 #나머지를 활용해 자릿수에 대한 합 저장
x = x // 10 #더한 자릿수를 하나씩 줄여감
return sum
# def digit_sum(x) :
# for i in str(x) : #자연수에 대해서 string으로 지정 후
# sum += int(i) #int로 변환하여 합 저장
# return sum
max = -2147000000 #가장 작은 값
for x in a : #원소에 직접 접근
tot = digit_sum(x) #합 저장
if tot > max : #가장 큰 수면 max 갱신, res에 해당 값 저장
max = tot
res = x
print(res)
n을 제시해서 활용해야한다고 생각함, 때문에 for i in range(n) 사용했음
파이썬 내장 함수 divmod()를 활용함 이러면 안되나...?
Q7. 소수(에라토스테네스 체) : 1~N까지의 소수의 개수 출력, 제한시간 1초
입력 : N(2<=N<=200,000)
출력 : 소수의 개수
에라토스테네스 체
1. 1은 제거한다(해당 문제에서 N의 조건이 2이상이기 때문에 상관x)
2. 지워지지 않은 수 중 제일 작은 2를 소수로 채택하고 나머지 2의 배수를 모두 지운다
3. 지워지지 않은 수 중 제일 작은 3을 소수로 채택하고 나머지 3의 배수를 모두 지운다
4. 지워지지 않은 수 중 제일 작은 5을 소수로 채택하고 나머지 3의 배수를 모두 지운다
5. 반복
[내가 쓴 코드]
n = int(input())
a = [0, 0] + [1] * (n - 1) #제거하는 방식이니까 2~n까지 모두 1로 초기화
count = 0
for i in range(2, n + 1) : #2~n 반복
if a[i] == 1 : #현재 가장 작은 수
count += 1 #소수의 개수 + 1
for j in range(i * 2, n + 1, i) : #(현재 가장 작은 수 * 2) ~ n, step = i
a[j] = 0 #소수에서 제외
print(count) #소수의 개수 출력
[풀이 코드]
n = int(input())
ch = [0] * (n + 1) #n의 길이를 갖는 리스트, 0으로 초기화
cnt = 0
for i n range(2, n + 1) : #2~n까지
if ch[i] == 0 : #값이 0이면
cnt += 1 #소수의 개수 증가
for j in range(i, n + 1, i) : #i~n, i의 폭으로 증가
ch[j] = 1 #소수의 배수는 소수가 아닌 값으로 변경, 근데 이러면 결국엔 모든 원소가 1이 되는 거 아님?
print(cnt)
나는 에라토스테네스 체에 근거해서 0, 1을 제외한 모든 값을 1로 초기과하여 아닌 값들을 0으로 변경하였음
문제랑은 상관없지만 마지막에 존재하는 리스트에는 소수인 값만 1로 남음
풀이는 모든 값을 0으로 초기화하였고 소수의 개수에 집중하여 cnt + 1을 하였음
결국 마지막에 존재하는 리스트는 모든 값이 1이 됨
Q8. 뒤집은 소수 : N개의 자연수 입력, reverse()함수로 각 자연수를 뒤집고 isPrime()함수로 소수 여부 확인 후 출력
입력 :
N(3<=N<=100)
N개의 자연수
출력 : 소수
[내가 쓴 코드]
def reverse(x) : #수를 뒤집는 함수
num = int(str(x)[::-1]) #[start : end : step]을 활용하여 뒤집음
return num
def isPrime(x) : #소수 판별 함수
if x < 2 : #2 이하이면 return False 후 종료
return False
if x == 2 : #2이면 return True 후 종료
return True
for i in range(2, x) : #2 ~ x-1
if x % i == 0 : #어떤 수의 배수이면 return False 후 종료
return False
return True #위의 모든 상황에 해당되지 않으면 return True
n = int(input())
a = list(map(int, input().split()))
for i in range(n) : #n이 주어져서 활용함
a[i] = reverse(a[i]) #각 원소를 뒤집은 수로 변경, 여기서 변수 또 만들뻔 했다
if isPrime(a[i]) : #소수 판별
print(a[i], end = " ") #소수이면 출력
print()
[풀이 코드]
n = int(input())
a = list(map(int, input().split()))
def reverse(x) :
res = 0 #뒤집은 수 저장 변수
while x > 0 : #x가 0이 아닐때까지
t = x % 10 #x의 나머지, 일의 자리
res = res * 10 + t #현재 값 * 10 + 일의자리, 반복할때마다 자리수를 증가시켜줌
x = x // 10 #x는 자리수를 하나 없앰
return res
def isPrime(x) : #소수 판별
if x == 1 : #1이면 return False 후 종료
return False
for i in range(2, x // 2 + 1) : #2 ~ x의 반절까지
if x % i == 0 : #배수이면 return Fasle 후 종료
return False
else : #for-else, return 없이 for문 종료 시 return True 후 종료
return True
for x in a : #각 원소에 직접 접근
tmp = reverse(x) #뒤집기
if isPrime(tmp) : #소수면 출력
print(tmp, end = " ")
reverse() 함수를 만들었을 때 나는 슬라이싱을 활용하였는데 풀이에서는 직접 작업함, 근데 상관없대요
isPrime() 함수에서 for문을 x 값의 반절까지만 돌았음, for-else문은 여기서 소용이 없지 않은가 싶음...
Q9. 주사위 게임 : 주사위 3개를 던져 규칙에 따른 상금을 받고 가장 큰 상금을 출력
입력 :
N(2<=N<=1,000)
N * 3의 2차원 배열
출력 : 가장 큰 상금
[내가 쓴 코드]
n = int(input())
a = list() #n번 3개씩 입력받을 2차원 list
money = list()
for i in range(n) : #2차원 list 완성
a.append(list(map(int, input().split())))
for x, y, z in a : #각 원소를 x, y, z로 지정
if x == y == z : #조건1) 모두 같으면 money에 아래 값 저장
money.append(10000 + x * 1000)
elif x == y | x == z : #조건2) x기준
money.append(1000 + x * 100)
elif y == z : #조건2) y기준
money.append(1000 + y * 100)
else : #조건3) 모두 다른 값이면
m = max(x, y, z) #가장 큰 수를 기준으로 money에 아래 값 저장
money.append(m * 100)
print(max(money)) #money list에서 가장 큰 수 출력
[풀이 코드]
n = int(input())
res = 0 #가장 큰 상금 저장 변수
for i in range(n) :
tmp = input().split() #tmp에 값이 3개씩 저장됨
tmp.sort() #조건3을 위하여 오름차순 sort
a, b, c = map(int, tmp) #a, b, c에 각 값을 저장
if a == b and b == c : #조건1)
money = 10000 + a * 1000
elif a == b or a == c : #조건2)
money = 1000 + a * 100
elif b == c : #조건2)
money = 1000 + b * 100
else : #조건3) 앞서 정렬을 했기 때문에 가장 큰 값을 찾지 않아도 됨
money = c * 100
if money > res : #가장 큰 값이면 res에 저장
res = money
print(res)
가장 큰 값을 찾아서 상금을 측정할 때와 상금 자체에서 가장 큰 값을 찾을 때 max를 썼는데 그러면 안되는 것일까,,,?
a list 대신 풀이 처럼 변수를 사용하고 map(int, tmp)로 하는 게 for문을 하나로 만들 수 있음
Q10. 점수계산 : OX 문제에 대한 정답여부를 보고 점수를 계산, 연속 정답시 가산점 고려
입력 :
N(1<=N<=100)
N개의 정답 여부 숫자(0 : 오답, 1 : 정답)
출력 : 총 점수
[내가 쓴 코드]
n = int(input())
a = list(map(int, input().split()))
score = 0 #총점 저장 변수
count = 1 #가중치 변수
for i in range(n) : #n만큼 반복
if a[i] == 1 :
if i == 0 : #정답임과 동시에 첫번째 원소이면
score += 1 #score에 +1
count += 1 #가중치 + 1
else : #정답임과 동시에 첫번째 원소가 아니면
score += count #score에 가중치 만큼 합산
count += 1 #가중치 + 1
else : #정답이 아니면 가중치를 1로 리셋
count = 1
print(score)
[풀이 코드]
n = int(input())
a = list(map(int, input().split()))
sum = 0
cnt = 0
for x in a : #각 원소에 직접 접근
if x == 1 : #정답이면
cnt += 1 #가중치 + 1
sum += cnt #점수에 가중치를 합산
else : #정답이 아니면 가중치 0으로 리셋
cnt = 0
print(sum)
문제를 풀 당시에 왜 첫번째 값을 특별하게 여겼는지 모르겠다... 덕분에 삼중 구조가 됨....
전체적으로 이번 과제의 의문은 n이 주어졌어도 활용을 안해도 되는가,,, max나 divmod등 내장 함수는 사용하면 안되는가,,,,
*강의 : 파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
'Coding Test' 카테고리의 다른 글
[Section03] Python 알고리즘 문제풀이 09~11 (2) | 2024.04.01 |
---|---|
[Section03] Python 알고리즘 문제풀이 05~08 (0) | 2024.03.26 |
[Section03] Python 알고리즘 문제풀이 01~04 (4) | 2024.03.12 |
[Section02] Python 알고리즘 문제풀이 01~05 (0) | 2024.03.02 |
[Python] 잊어버린 기억을 찾아서... (2) | 2024.02.29 |