반응형

https://www.acmicpc.net/problem/10872

 

10872번: 팩토리얼

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(0 ≤ N ≤ 12)이 주어진다.

출력

첫째 줄에 N!을 출력한다.


def factorial(num):
    ans = num
    if num == 0:
        return 1
    elif num <= 1:
        return ans
    else:
        ans = ans * factorial(num-1)
        return ans

N = int(input())
print(factorial(N))

2021.07.26 - [study/python] - python) 재귀함수 연습해보기_팩토리얼 계산 만들기

 

python) 재귀함수 연습해보기_팩토리얼 계산 만들기

재귀함수 함수 안에서 자기 자신을 호출하는 함수 오늘의 연습 재귀함수로 팩토리얼 계산하는 함수 만들기 +for문을 활용한 팩토리얼 계산 최종코드 # 재귀함수 연습 01 팩토리얼 계산해보기 # 재

w-world.tistory.com

예전에 업로드 했던 코드를 바탕으로 풀었다

나는 어릴 때 수학을 잘 못했고 그래서 의문이 생겼는데

0! 왜 1인걸까

전에 짠 코드 그대로 사용하면 0! = 0이 나오기 때문에 일단 if num == 0일 경우를 넣어서 1이 출력되게 했지만

왜 1인지는 모르겠다

https://ko.eferrit.com/%EC%A0%9C%EB%A1%9C-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC%EC%9D%B4-%EC%99%9C-%EB%98%91%EA%B0%99%EC%8A%B5%EB%8B%88%EA%B9%8C/

 

왜 0 Factorial Equal One (0! = 1)입니까?

0 팩토리얼은 값이없는 데이터 세트를 정렬하는 방법의 수에 대한 수학적 표현식으로 하나는 1과 같습니다. 일반적으로, 수의 계승 (factorial) 은 곱셈 식을 작성하는 짧은 방법이며, 여기서 수는

ko.eferrit.com

블로그 글을 찾아보고 있지만... 사실 봐도 잘 모르겠다

일단 1이야! 느낌이다ㅠㅠ

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5P0-h6Ak4DFAUq&categoryId=AV5P0-h6Ak4DFAUq&categoryType=CODE&problemTitle=%ED%8C%8C%EC%8A%A4%EC%B9%BC&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


T = int(input())

for tc in range(1, T+1):
    num = int(input())

    arr = [[0]*num for _ in range(num)]
    # print(arr)
    ans = ''

    for i in range(num):
        for j in range(i+1):
            if j == 0:
                arr[i][j] = 1
            if j == i:
                arr[i][j] = 1
            else:
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
                
    print('#{}'.format(tc))
    for i in range(num):
        for j in range(num):
            if arr[i][j] != 0:
                print(arr[i][j],end=' ')
        print()

행의 양 끝에 미리 1을 다 넣어두고 계산을 했다.

반응형
반응형

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.


N = int(input())
cnt = 0

while N > 0:
    if N % 5 == 0:
        N -= 5
        cnt += 1
        N
    elif N % 3 == 0:
        N -= 3
        cnt += 1
    elif N > 5:
        N -= 5
        cnt += 1
    elif N == 3:
        cnt += 1
        break
    else:
        cnt = -1
        break
print(cnt)

처음에는 '만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.' 이 조건을 못보고 문제가 짱구 게임 난의도라고 생각했는데 저 조건때문에 좀 생각을 많이 해야했다.

 

18
남은 설탕 수 : 15 봉지 수 :1
남은 설탕 수 : 10 봉지 수 :2
남은 설탕 수 : 5 봉지 수 :3
남은 설탕 수 : 0 봉지 수 :4
4

첫번째 예제를 실행하면 다음과 같은 결과가 나온다.

다른 분들이 푸신걸 보니 다이나믹 프로그래밍이니... 그리디 탐색이니... 하지만 나는 아직 그런걸 봐도 모르겠고...

공부가 더 필요하다는걸 느낀다.

 

지금보니 마지막에 남은 숫자가 3이면 3을 빼준다는 조건이 필요없는 조건이었다.

3이면 그냥 위에 3의 배수에서 이미 처리가 되니깐....

반응형
반응형

https://www.acmicpc.net/problem/2775

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

www.acmicpc.net

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라


# 2775 부녀회장이 될테야

T = int(input())

for tc in range(T):
    k = int(input())
    n = int(input())
    people = [[0]*(n) for _ in range(k+1)]
    i = 1
    for height in range(k+1):
        for room in range(n):

            if height == 0:
                people[height][room] = i
                i += 1
            if room == 0:
                people[height][room] = 1
            elif height !=0 and room != 0:
                people[height][room] = people[height-1][room] + people[height][room-1]

    print(people[k][n-1])

이상한 규칙을 가지고 있는 아파트

1414호에는 무려 37442160명의 사람이 살고있다

 

처음 아파트의 높이값과 호 값을 받아온 후 2차원 배열을 만들어준다.

이 아파트는 0층(반지하) 부터 시작하기 때문에 k+1을 해준다!

반지하층에는 사람이 호수와 비례하게 i 만큼 살고있기 때문에 i=1변수를 만들어줬다

그리고 사람들이 한명씩 거주하도록 하였다

숫자 합의 누적값은 바로 옆칸과 바로 아래칸 값의 합과 같기 때문에

people[height][room] = people[height-1][room] + people[height][room-1]

로 더해주고 마지막 값을 출력한다

반응형
반응형

https://www.acmicpc.net/problem/10250

 

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

문제

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

그림 1. H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W).

출력

프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.


# 10250. ACM 호텔

T = int(input())
for tc in range(T):
    H, W, N = map(int, input().split())

    hotel = [[0]*W for _ in range(H)]
    ans = 0

    for j in range(W):
        for i in range(H-1, -1, -1):
            if N == 1:
                if j < 9:
                    print('{}0'.format(H-i), end='')
                else:
                    print('{}'.format(H-i), end='')
                print(j+1)
            if N > 0:
                hotel[i][j] = N
                N -= 1


    # print(hotel)

백준 단계별로 풀어보기 기본 수학 1, 2에 있는 문제들은 수학 능력을 묻는 문제들로, 수학적 계산을 통해 짧은 코드로 답이 나오는 경우가 많은 것 같다.

하지만 나는 수학 똥멍청이라 수학적 규칙을 찾아내는건 힘들다.

내 코드에서는 호텔을 짓고 손님 한분한분 받아서 안내하는 호텔 매니저의 서사가 보이는 것 같다.

 

일단 호텔을 지어줬다. H, W 값을 2차원 배열로 입력받아 가로가 W 세로가 H인 호텔 배열을 만든다

그리고 호텔 손님들 N명을 차례대로 한명씩 넣어주었다. 카운트를 1부터 N까지 할 수도 있겠지만 나는 거꾸로 N부터 한명씩 빼주었다. 딱히 이유는 없고 새로운 변수 만들기 싫어서..

 

hotel[i][j] 인덱스를 탐색하기 위해서 사용한 이중for문은 j 부터 시작되는데 이건 배열을 세로로 탐색하기 위해서!

그리고 높이 같은 경우에는 1층에서 부터 넣어줘야 하기 때문에 거꾸로 돌려줬다

 

만약 호수가 10호대 이하이면(101호 라던가,,,102호 ) 11호 , 12호 로 출력되면 안되니깐 j<9일때 높이 뒤에 0을 넣어주었고

H-i인 이유도 위에서와 마찬가지로 1층부터 출력해야하기 때문!

j+1을 해준거는 인덱스가 0부터 시작하기 때문이다. 요고는 다른 사람들 코드 참조해서 수학적으로 푸는 방법도 나중에 추가로 포스팅 할 예정.. 총총

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PzOCKAigDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


T = int(input())

for tc in range(1, T+1):
    N, M = map(int, input().split())

    fly = [list(map(int,input().split())) for _ in range(N)]
    attack = [[0]*M for __ in range(M)]
    max_num = 0

    for i in range(N-M+1):
        for j in range(N-M+1):
            add_num = 0
            for fly_i in range(M):
                for fly_j in range(M):
                    add_num += fly[i+fly_i][j+fly_j]
                    if add_num > max_num:
                        # print(add_num)
                        max_num = add_num

    print('#{} {}'.format(tc, max_num))

2차원 배열을 입력받고 접근 할 수 있어야 풀 수 있는 문제!

모기가 있는 2차원 배열을 만들고

파리채 2차원 배열을 만들어 파리채의 (0, 0)지점부터 파리채 크기만큼의 구역에 모기가 몇마리 있는지 계산 후

max_num에 넣고 출력한다

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PyTLqAf4DFAUq&categoryId=AV5PyTLqAf4DFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


def palindrome(word):
    if word == word[::-1]:
        return 1

    else:
        return 0
        
test_case = int(input())

for i in range(test_case):
    word = input()
    
    print(f'#{i+1}', end = ' ')
    
    print(palindrome(word))

슬라이싱을 이용해 문자를 뒤집고 뒤집어진 문자와 원래 문자가 같으면 1을 출력하도록 구현했다

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PmkDKAOMDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

간단한 압축풀기


T = int(input())

for tc in range(1, T+1):
    N = int(input())
    text = ''
    for n in range(N):
        alpa, num = input().split()
        text += alpa*int(num)
    print('#{}'.format(tc))
    for i in range(1,len(text)+1,10):
        print(text[i-1:i+10-1])

압축을 푸는건 어렵지 않지만 압축을 풀어서 나열해둔 text를 10개씩 나열하는거에서 생각을 조금 해야했다

for 문에서 숫자가 10씩 증가하고 슬라이싱으로 i에서 i+10까지 출력하게 해서 코드를 완성해봤다!

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PnnU6AOsDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

날짜 계산기


# 1948. 날짜 계산기
month = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}

T = int(input())

for tc in range(1, T+1):
    ans = 0
    fm, fd, sm, sd = map(int, input().split())
    if fm == sm:
        ans = sd - fd
    else:
        for i in range(fm, sm+1):
            if i == fm:
                ans += (month[i] - fd)
            elif i == sm:
                ans += sd
            else:
                ans += month[i]
    print('#{} {}'.format(tc, ans+1))

처음에는 month를 모두 if else로 처리해야하나 막막했는데

딕셔너리를 이용해서 쉽게 풀 수 있었다

월이 같은 경우에는 날짜만 빼주면 되니깐

fm==sm인 경우는 미리 계산해주고,

월이 다른 경우를 else에서 계산해주었다.

 

month(key)로 딕셔너리 values값에 접근하고 그 수를 더해주면 된다!

 

날짜는 세는 당일도 쳐야하기 때문에 마지막에 ans에서 +1

반응형
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LrsUaDxcDFAXc 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


# 백만 장자 프로젝트

T = int(input())

for tc in range(1, T+1):
    N = int(input())
    price = list(map(int,input().split()))

    max_num = 0
    ans_price = 0

    for i in range(N-1,-1,-1):
        if price[i] > max_num:
            max_num = price[i]
        else:
            ans_price += max_num - price[i]

    print('#{} {}'.format(tc, ans_price))

뒤에서부터 탐색하며 max_num에 최대값을 넣어주고 최대값보다 작은 값이 나오면 최대값 - 현재값을 ans_price에 넣어줬다

뒤에서 부터 탐색하면 어렵지 않은 문제!

 

예제 입력값으로 주어지는 값이 메모장 버전과 사이트 버전이 달라서 조금 당황스러웠지만 예외 없이 잘 작동되어서 다행이다.

반응형

+ Recent posts