기록을 남기자

전체 글 186

카테고리 설명
개발,CS,PS 기록을 남기려 합니다.
  • 문제 https://www.acmicpc.net/problem/2083 2083번: 럭비 클럽 입력 받은 각 회원에 대해 이름과 분류를 출력한다. 성인부 회원이면 'Senior', 청소년부 회원이면 'Junior'를 출력한다. www.acmicpc.net 올 골드 럭비 클럽의 회원들은 성인부 또는 청소년부로 분류된다. 나이가 17세보다 많거나, 몸무게가 80kg 이상이면 성인부이다. 그 밖에는 모두 청소년부이다. 클럽 회원들을 올바르게 분류하라. 입력 각 줄은 이름과 두 자연수로 이루어진다. 두 자연수는 순서대로 나이와 몸무게를 나타낸다. 입력의 마지막 줄은 # 0 0 이다. 이 입력은 처리하지 않는다. 이름은 알파벳 대/소문자로만 이루어져 있고, 길이는 10을 넘지 않는다. 출력 입력 받은 각 회원에 ..

  • 문제 https://www.acmicpc.net/problem/2023 2023번: 신기한 소수 수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수 www.acmicpc.net 수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수이고, 7도 소수이다. 즉, 왼쪽부터 1자리, 2자리, 3자리, 4자리 수 모두 소수이다! 수빈이는 이런 숫자를 신기한 소수라고 이름 붙였다. 수빈이는 N자리의 숫자 중에서 어떤 수..

  • 문제 https://www.acmicpc.net/problem/2011 2011번: 암호코드 나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다. www.acmicpc.net 상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다. 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야. 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어. 상근: 그렇네. 25114를 다시 영어로 ..

  • 문제 https://www.acmicpc.net/problem/2004 2004번: 조합 0의 개수 첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다. www.acmicpc.net 코드 #팩토리얼로 푸면 메모리제한 #10의 배수를 잘 활용 (2개수, 5개수중 적은것이 10의 개수) import sys def countnum(N, num): count=0 div=num while(N>=div): count += (N//div) div*=num return count n,m=map(int, sys.stdin.readline().split()) print(min(countnum(n,5)-countnum(m,5)-countnum(n-m..

  • 문제 https://www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1]..

카테고리
작성일
2023. 4. 15. 20:47
작성자
ssun_bear
반응형

문제

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

 

2083번: 럭비 클럽

입력 받은 각 회원에 대해 이름과 분류를 출력한다. 성인부 회원이면 'Senior', 청소년부 회원이면 'Junior'를 출력한다.

www.acmicpc.net

올 골드 럭비 클럽의 회원들은 성인부 또는 청소년부로 분류된다.

나이가 17세보다 많거나, 몸무게가 80kg 이상이면 성인부이다. 그 밖에는 모두 청소년부이다. 클럽 회원들을 올바르게 분류하라.

입력

각 줄은 이름과 두 자연수로 이루어진다. 두 자연수는 순서대로 나이와 몸무게를 나타낸다. 입력의 마지막 줄은 # 0 0 이다. 이 입력은 처리하지 않는다.

이름은 알파벳 대/소문자로만 이루어져 있고, 길이는 10을 넘지 않는다.

출력

입력 받은 각 회원에 대해 이름과 분류를 출력한다. 성인부 회원이면 'Senior', 청소년부 회원이면 'Junior'를 출력한다.

코드

while True:
    name, age, weight = input().strip().split()
    if name=="#" and age=="0" and weight=="0":
        break
    print(name, "Junior" if int(age)<=17 and int(weight)<80 else "Senior")

문제 해결

기본적인 조건문 판단, 출력문제이다

반응형
카테고리
작성일
2023. 4. 15. 20:44
작성자
ssun_bear
반응형

문제

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

 

2023번: 신기한 소수

수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수

www.acmicpc.net

수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다.

7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수이고, 7도 소수이다. 즉, 왼쪽부터 1자리, 2자리, 3자리, 4자리 수 모두 소수이다! 수빈이는 이런 숫자를 신기한 소수라고 이름 붙였다.

수빈이는 N자리의 숫자 중에서 어떤 수들이 신기한 소수인지 궁금해졌다. N이 주어졌을 때, 수빈이를 위해 N자리 신기한 소수를 모두 찾아보자.

입력

첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.

출력

N자리 수 중에서 신기한 소수를 오름차순으로 정렬해서 한 줄에 하나씩 출력한다.

코드

import sys,math

n=int(input())

def isPrime(x):
    for i in range(2, int(math.sqrt(x))+1):
        if int(x)%i==0:
            return False
    return True

def dfs(num):
    if len(str(num))==n:
        print(num)
    else:
        for i in range(1,10,2):
            temp = num*10 +i
            if isPrime(temp):
                dfs(temp)

dfs(2)
dfs(3)
dfs(5)
dfs(7)

문제 해결

DFS를 활용하여 코드를 풀이하였다. 신기한 소수의 조건이 왼쪽부터 N자리 수까지 모두 소수여야하므로 홀수의 숫자만 이용하여 탐색하면 시간복잡도가 반으로 줄어들 수 있음을 활용하면 코드를 맞출 수 있다

반응형
카테고리
작성일
2023. 4. 15. 20:39
작성자
ssun_bear
반응형

문제

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

 

2011번: 암호코드

나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.

www.acmicpc.net

상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다.

  • 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야.
  • 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어.
  • 상근: 그렇네. 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN" 총 6가지가 나오는데, BEAN이 맞는 단어라는건 쉽게 알수 있잖아?
  • 선영: 예가 적절하지 않았네 ㅠㅠ 만약 내가 500자리 글자를 암호화 했다고 해봐. 그 때는 나올 수 있는 해석이 정말 많은데, 그걸 언제 다해봐?
  • 상근: 얼마나 많은데?
  • 선영: 구해보자!

어떤 암호가 주어졌을 때, 그 암호의 해석이 몇 가지가 나올 수 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 5000자리 이하의 암호가 주어진다. 암호는 숫자로 이루어져 있다.

출력

나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다.

암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.

코드

import sys
input=sys.stdin.readline

amho=[0]+list(input().strip())
if amho[1]=='0':
    print(0) 
    exit()

dp=[1,1]+[0] * (len(amho)-2)

for i in range(2, len(amho)):
    num1=int(amho[i])
    num2=int(amho[i-1])*10+int(amho[i])
    if num1>0: dp[i]+=dp[i-1]
    if num2>=10 and num2<=26: dp[i]+=dp[i-2]

print(dp[len(amho)-1]%1000000)

문제 해결

DP 문제로 1-26의 숫자를 알파벳으로 치환하여 일일히 해석할 수 있는 가짓수를 파악해서 코드를 작성하였다.

이때 10-26사이의 숫자를 파악하는 것이 어려웠으나 코드에 풀이 된대로 작성하여 꼼꼼히 문제를 맞출수 있었다.

반응형
카테고리
작성일
2023. 4. 14. 23:59
작성자
ssun_bear
반응형

문제

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

 

2004번: 조합 0의 개수

첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다.

www.acmicpc.net

코드

#팩토리얼로 푸면 메모리제한
#10의 배수를 잘 활용 (2개수, 5개수중 적은것이 10의 개수)
import sys
def countnum(N, num):
    count=0
    div=num
    while(N>=div):
        count += (N//div)
        div*=num
    return count

n,m=map(int, sys.stdin.readline().split())
print(min(countnum(n,5)-countnum(m,5)-countnum(n-m,5),countnum(n,2)-countnum(m,2)-countnum(n-m,2)))

문제 해결

팩토리얼로 조합을 일일히 구하면 메모리 제한이 걸려서

10의 배수가 2와 5의 배수임을 이용해서 2와 5의 개수중 적은 것이 10의 개수라고 이용하여 코드를 작성했다.

반응형
카테고리
작성일
2023. 4. 14. 23:56
작성자
ssun_bear
반응형

문제

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

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

출력

첫째 줄에 경우의 수를 출력한다.

코드

import sys
input=sys.stdin.readline

N,M=map(int, input().split())
A=list(map(int, input().split()))
s,e,cnt=0,1,0

while True:
    if s>e or e>N: break

    total=sum(A[s:e])
    if total<M: e+=1
    elif total>M: s+=1
    else:
        cnt+=1
        e+=1

print(cnt)

문제 해결

투 포인터를 활용하여 문제를 풀이, s, e를 하나씩 늘려가서 일일히 비교해주는 구조이다.

반응형