갑자기 코테가 잡혀버려서 부랴부랴 코테를 준비중이다. 너무 오랜만이라 기억이 잘 안난다..ㅎ 

문제를 봐도 "아 이거 dfs, bfs" 인데 그것만 기억나고 어떻게 푸는지 잘 생각이 안났다. 시간이 얼마 안남았으니 최대한 효율적으로 공부해야겠다.

총 4문제를 풀었고 dfs, bfs 에서 못풀었다. 이번 기간동안은 해당 문제 연습을 해야겠다. 그래도 기분 좋은 건 백트래킹 문제를 풀었따 ㅎㅎ

728x90

 

https://www.codetree.ai/missions/2/problems/best-place-of-33?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

최고의 33위치


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-3, n-3) 일때 시작점으로 부터 n-3, n-2, n-1 행까지와 n-3, n-2, n-1 열까지의 3x3 행렬을 탐색하므로)

이때 range() 함수에서 끝점은 미포함이므로 n-2 로 설정해야한다. 

 

 

 

728x90

 

https://www.codetree.ai/missions/5/problems/sequence-of-remainder-divided-by-100?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

100으로 나눈 나머지의 수열


첫 번째는 2, 두 번째는 4, 세 번째부터는 앞의 두 수의 곱을 100으로 나눈 나머지로 이루어진 수열이 있습니다. 100 이하의 정수 N을 입력받아 재귀함수를 이용하여 N번째 값을 구하여 출력하는 프로그램을 작성해보세요.

 

입력 형식

첫 번째 줄에 정수 N이 주어집니다.

  • 1 ≤ N ≤ 20

출력 형식

첫 번째 줄에 수열의 N번째 값을 출력합니다.

 

입출력 예제

예제1

입력:

5

출력:

56

 

 

 

내가 짠 코드


n = int(input())

# 2, 4, (2*4)%100,


def f(n):
    if n==1:
        return 2
    if n==2:
        return 4
    
    return (f(n-1)*f(n-2))%100


print(f(n))

베이스 케이스 첫번째 두번째 원소에 대해 각각 2, 4 를 리턴한다 그게 아닐 경우에는 f(n-1) 과 f(n-2) 를 곱한후 100으로 나눈 나머지를 리턴한다. 

728x90

https://www.codetree.ai/missions/5/problems/3n+1-sequence-with-recursive-function?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

재귀함수를 이용한 3n + 1 수열


 

자연수 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 을 리턴한다. 이 때 홀수일 때와 짝수일 때를 다르게 호출해야한다.

728x90

https://www.codetree.ai/missions/5/problems/sum-of-large-numeric-digits?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

큰 숫자 자리수의 합


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을 리턴한다. 

728x90

8주차 실력진단


이번주 실력진단 결과이다. 

 

이번주는 563점이 나왔다. 8주간의 코드트리 챌린지가 마무리되었는데 처음 파이썬 헀을 때 391점이 나왔을 때보다는 많이 올랐지만, 여기서 더 오르기가 쉽지 않은 것 같다. 중간에 시험기간도 있어서 많이 더뎠던 것 같아서 아쉽다. 챌린지는 끝나도 더 꾸준히 해서 1000점을 달성할 수 있도록 해야겠다. 

 

 

 

 

 

푼 문제들 정리


 

1. 재귀함수를 이용한 피보나치 수 / 재귀함수

https://dodenkr.tistory.com/90

 

[코드트리] 재귀함수를 이용한 피보나치 수 /재귀함수

https://www.codetree.ai/missions/5/problems/fibonacci-using-recursive-function?&utm_source=clipboard&utm_medium=text 재귀함수를 이용한 피보나치 수 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코

dodenkr.tistory.com

 

 

2. Factorial / 재귀함수

https://dodenkr.tistory.com/91

 

[코드트리] Factorial /재귀함수

https://www.codetree.ai/missions/5/problems/factorial?&utm_source=clipboard&utm_medium=text Factorial 팩토리얼이란 차례로 곱한다는 뜻으로, 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 n!로 나타낸다. 재귀함

dodenkr.tistory.com

 

3. 홀수 짝수에 따른 출력값 / 재귀함수

https://dodenkr.tistory.com/92

 

[코드트리] 홀수 짝수에 따른 출력값 / 재귀함수

https://www.codetree.ai/missions/5/problems/output-value-based-on-odd-even-numbers?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초

dodenkr.tistory.com

 

4. 재귀함수를 이용한 최댓값 / 재귀함수

https://dodenkr.tistory.com/93

 

[코드트리] 재귀함수를 이용한 최댓값 / 재귀함수

https://www.codetree.ai/missions/5/problems/maximum-value-with-recursive-function?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초

dodenkr.tistory.com

 

5. 큰 숫자 자리수의 합 / 재귀함수

https://dodenkr.tistory.com/96

 

[코드트리] 큰 숫자 자리수의 합 / 재귀함수

https://www.codetree.ai/missions/5/problems/sum-of-large-numeric-digits?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터

dodenkr.tistory.com

 

6. 재귀함수를 이용한 3n+1 수열

https://dodenkr.tistory.com/97

 

[코드트리] 재귀함수를 이용한 3n + 1 수열 / 재귀함수

https://www.codetree.ai/missions/5/problems/3n+1-sequence-with-recursive-function?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초

dodenkr.tistory.com

 

7. 100으로 나눈 나머지의 수열 / 재귀 함수

https://dodenkr.tistory.com/98

 

[코드트리] 100으로 나눈 나머지의 수열 / 재귀함수

https://www.codetree.ai/missions/5/problems/sequence-of-remainder-divided-by-100?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보

dodenkr.tistory.com

 

 

8. 최고의 33위치 / 완전 탐색

https://dodenkr.tistory.com/99

 

[코드트리] 최고의 33위치 / 완전탐색

https://www.codetree.ai/missions/2/problems/best-place-of-33?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장

dodenkr.tistory.com

 

728x90

 

 

7주차 실력진단


이번주 실력진단 결과이다. 

 

 

최근에 학과 시험 공부하느라 정신이 없다보니 연습을 소홀히 해서 실력이 많이 줄었다.. ㅠㅠ

 

이제 곧 시험이 끝나니 다음주부터는 다시 달려야겠다.

 

이번주에는 원래 백트래킹을 연습하려고 했지만 하다보니 어렵게 느껴져서 재귀함수를 다시 공부하고 있다.

 

 

 

 

 

푼 문제들 정리


 

1. 1부터 특정 수까지의 합 2

https://dodenkr.tistory.com/87

 

[코드트리] 1부터 특정 수까지의 합 2 / 재귀함수

https://www.codetree.ai/missions/5/problems/sum-from-1-to-a-certain-number-2?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부

dodenkr.tistory.com

2. 각 자리 숫자의 제곱

https://dodenkr.tistory.com/88

 

[코드트리] 각 자리 숫자의 제곱 / 재귀함수

https://www.codetree.ai/missions/5/problems/square-of-each-digit/description 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지,

dodenkr.tistory.com

 

728x90

 

 

https://www.codetree.ai/missions/5/problems/maximum-value-with-recursive-function?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

 재귀함수를 이용한 최댓값


n개의 원소 중 최댓값을 구하는 프로그램을 작성해보세요. 단, 재귀함수를 이용하여 문제를 해결해주세요.

 

입력 형식

첫 번째 줄에 정수 n이 주어집니다. 두 번째 줄에 n개의 정수가 주어집니다.

  • 1 ≤ 원소의 범위 ≤ 100
  • 1 ≤ n ≤ 100

출력 형식

첫 번째 줄에 주어진 원소 중 최대값을 출력합니다.

입출력 예제

예제1

입력:

6
1 5 7 9 2 6

 

출력:

9

 

 

내가 짠 코드


import sys

n = int(input())
arr = list(map(int, input().split()))
x = -99999
def f(n):
    if n==0:
        return max(arr[0], x)
    
    return max(f(n-1), arr[n])

print(f(n-1))

이번 문제는 배열에서 가장 최대값을 출력해야하는데 재귀적으로 풀어야한다. 

재귀함수이므로 베이스케이스를 생각해보자.

 

베이스케이스는 n==0 일때로 -1번째 원소로는 접근하면 안되므로 이에 대해 따로 처리가 필요하다. 0일때는 0을 값을 출력하도록 해준다. 

 

그 후 재귀적 처리를 위해 n번째 원소와 n-1번째까지 누적돼서 결정된 max 와 비교한다.

1일때는 arr[0] 와 arr[1] 을 비교할 것이고, 2일 때는 arr[2] 와 지금까지 max 를 비교할 것이고 이런식으로 n 까지 갈것이다.

 

주의할 점은 프린트할 때 f(n-1) 을 넣어야한다. 배열의 인덱스는 n번째가 n-1 이기 때문이다.

728x90

+ Recent posts