N * N 크기의 격자 정보가 주어집니다. 이때 해당 위치에 동전이 있다면 1, 없다면 0이 주어집니다. N * N 격자를 벗어나지 않도록 3 * 3 크기의 격자를 적절하게 잘 잡아서 해당 범위 안에 들어있는 동전의 개수를 최대로 하는 프로그램을 작성해보세요
입력 형식
첫 번째 줄에는 격자의 크기를 나타내는 N이 주어집니다.
두 번째 줄부터는 N개의 줄에 걸쳐 격자에 대한 정보가 주어집니다. 각 줄에는 각각의 행에 대한 정보가 주어지며, 이 정보는 0또는 1로 이루어진 N개의 숫자로 나타내어지며 공백을 사이에 두고 주어집니다.
3 ≤ N ≤ 20
출력 형식
N * N 격자를 벗어나지 않으면서, 3 * 3 크기 격자 내에 들어올 수 있는 최대 동전의 수를 출력해주세요.
입출력 예제
예제1
입력:
3 1 0 1 0 1 0 0 1 0
출력:
4
내가 짠 코드
import sys
n = int(input())
arr = [
list(map(int, input().split()))
for _ in range(n)
]
ans = -sys.maxsize
sum = 0
#시작점구하기
for i in range(n-2):
for j in range(n-2):
sum = 0
#3*3 의 1의 개수 구하기
for k in range(i, i+3):
for m in range(j,j+3):
sum += arr[k][m]
ans = max(sum,ans)
print(ans)
배열을 순회하는 완전 탐색문제이다. 3x3 행렬에 가장 많이 1이 들어갈 때 그 갯수를 구해야한다.
완전 탐색 시에는 기준을 정하는 것이 중요하다.
이 문제에서는 3x3 행렬로 nxn 행렬을 순회하기 위해 3x3 행렬의 시작점을 돌아가면서 고정 시켜두고, 합을 구하였다.
이때, 범위 설정이 중요한데 시작점은 (0,0) 에서 시작하고, 마지막 점은 n-3, n-3 번째 여야 인덱스에 넘어가지 않을 것이다.
자연수 n이 주어집니다. n에서 시작하여 n이 짝수면 2로 나누고, n이 홀수면 3을 곱하고 1을 더하는 것을 n이 1이 되기 전까지 계속 반복하려고 합니다. 총 몇 번을 반복해야 1이 되는지를 계산하는 프로그램을 작성해보세요. 단, 재귀함수를 이용하여 문제를 해결해주세요.
입력 형식
첫 번째 줄에 정수 n이 주어집니다.
1 ≤ n ≤ 100
출력 형식
첫 번째 줄에 1이 되기까지 몇 번을 반복해야하는지 출력합니다.
입출력 예제
예제1
입력:
3
출력:
7
내가 짠 코드
n = int(input())
def f(n):
if n==1:
return 0
if n%2==0:
#짝수
return f(n//2) + 1
else :
return f(n*3+1) + 1
print(f(n))
이 문제에서는 1이 될때까지 재귀함수가 호출된 횟수를 카운팅해야한다.
베이스케이스에 대해 만약 1일 경우는 0을 리턴한다. 횟수가 0이므로
그리고 만약 재귀함수가 호출될때는 리턴값에 f(n//2) + 1 을 하거나 f(n*3+1) + 1 을 한다면 다음 재귀 호출 + 1 을 리턴한다. 이 때 홀수일 때와 짝수일 때를 다르게 호출해야한다.
3자리로 이루어진 정수 3개가 주어지면 그 세 숫자들을 곱한 후, 그 결과값의 각 자리 숫자들의 합을 구하여 출력하는 프로그램을 재귀 함수를 이용하여 작성해보세요.
입력 형식
첫 번째 줄에 3개의 정수가 공백을 사이에 두고 주어집니다.
100 ≤ 3개의 정수 ≤ 999
출력 형식
첫 번째 줄에 각 자리 숫자들의 합을 출력합니다.
입출력 예제
예제1
입력:
123 456 789
출력:
27
내가 짠 코드
a, b, c = list(map(int, input().split()))
def f(n):
if n<10:
return n
return f(n//10)+n%10
print(f(a*b*c))
우선 각 자리수의 합을 구하기 위해 재귀함수를 사용해야한다. 이때 주의할 점은 베이스케이스를 정의하는 것이다.
베이스케이스란 일의 자리수만 있을 때이다. 즉 n 이 10보다 작을 때는 그냥 n 을 리턴하면된다.
그게 아니라면 재귀적인 처리를 해야한다. 만약 n 이라는 숫자를 10으로 나눈 나머지를 구한다면 가장 마지막 (오른쪽)에 있는 숫자 한자리를 뽑을 수 있다. 그렇게 뽑고나서 다음 함수로 10으로 나눈 몫을 인자로 함수를 호출할 수 있다. 예를 들어
765 라는 수에서 765 %10 은 5가 된다. 그렇게 5를 따로 빼고 765 //10 을 하면 몫인 76만 남는다. 그렇게 76에서 다시 10으로 나눈 나머지를 구하면 6이고 몫은 7 이고 이 7이 다시 들어가면 10 보다 작으므로, 베이스케이스에 도달하여 7을 리턴한다.
이번주는 563점이 나왔다. 8주간의 코드트리 챌린지가 마무리되었는데 처음 파이썬 헀을 때 391점이 나왔을 때보다는 많이 올랐지만, 여기서 더 오르기가 쉽지 않은 것 같다. 중간에 시험기간도 있어서 많이 더뎠던 것 같아서 아쉽다. 챌린지는 끝나도 더 꾸준히 해서 1000점을 달성할 수 있도록 해야겠다.