728x90
반응형

문제:

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력:

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력:

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

풀이 방법:

우선 갯수를 세는 것을 편리하기 위해 전부 소문자로 변경한 후 set을 통해 unique한 값들을 구한다. 이를 반복문으로 탐색하며 갯수를 센 리스트를 만든다. 이후 여기서 max값이 두개 이상이면 ?를 출력하고 한개면 인덱스 값을 통해 값을 구하고 upper함수로 대문자로 만들어 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
def number(s):
    s=s.lower()
    un=[]
    string= list(set(s))
    for i in string:
        a=s.count(i)
        un.append(a)
    if un.count(max(un)) !=1:
        return '?'
    else:
        return string[un.index(max(un))].upper()
s=input()
print(number(s))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2292. 벌집  (0) 2019.04.07
[BOJ]2941. 크로아티아 알파벳  (0) 2019.04.06
[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
728x90
반응형

문제:

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.


입력:

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

출력:

첫째 줄에 단어의 개수를 출력한다.

풀이 방법:

다른 언어로 하면 어려운 것일지 잘 모르겠지만 적어도 파이썬으로는 쉽게 풀 수 있다. 파이썬은 input으로 띄어쓰기를 포함한 한 줄을 전체로 string으로 받으며 이를 split()을 사용하면 공백을 기준으로 나누어 리스토로 반환을 해준다. split()안에 변수 값을 넣어주면 그 값으로 분할을 해주지만 default값으로는 공백으로 설정되어 있다. 따라서 input().split()으로 받은 것의 길이를 세어주면 답이다.

1
2
3
n=input()
EmptyList=n.split()
print(len(EmptyList))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2941. 크로아티아 알파벳  (0) 2019.04.06
[BOJ]1157. 단어 공부  (0) 2019.04.05
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
728x90
반응형

문제:

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한 수의 개수를 출력하는 프로그램을 작성하시오.

입력:

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력:

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

풀이방법:

100미만의 수는 항상 등차수열을 이루게 된다. 자릿수가 하나인 경우에는 그 수가 수열이 되는 경우이고 자릿수가 두자리인 경우에는 두 자릿수의 차이ㅣ만큼 등차수열을 이룬다고 생각할 수 있다. 따라서 이문제는 자릿수가 3자리인 경우에만 따져주면 된다. 3자리에서 한수가 되는 경우는 다음과 같다.

n-a , n, n+a 와 같이 a만큼의 등차를 가지는 수열이 3자리에서의 한수이다. 따라서 각 자릿수의 합이 가운데 수의 3배한 값과 같을 때 한수가 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def solution(n):
    if n <100:
        answer=n
        return answer
    else:
        answer=99
        for i in range(100,n+1):
            a=list(str(i))
            a=list(map(int,a))
            if sum(a)/3==a[1]:
                answer+=1
        return answer
n=int(input())
answer=solution(n)
print(answer)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1157. 단어 공부  (0) 2019.04.05
[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31
728x90
반응형

문제:

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6=8이다. 새로운 수는 68이다. 6+8=14이다. 새로운 수는 84이다. 8+4=12이다. 새로운 수는 42이다. 4+2=6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N이 사이클의 길이를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고,99보다 작서나 같은 정수이다.

출력:

첫째 줄에 N의 사이클 길이를 출력한다.

풀이 방법:

첫번째 진행단계만 진행시켜준 뒤로 while문에 넣어서 다시 돌아올 때까지 계속 반복시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def cycle(n):
    answer=1
    n1 = n
    if n < 10:
        n = 10*n+n
    else:
        new_number1=n%10
        new_number2=n//10+n%10
        n=10*new_number1+new_number2%10
    while n1 != n:
        answer += 1
        if n < 10:
            n = 10*n+n
        else:
            new_number1=n%10
            new_number2=n//10+n%10
            n=10*new_number1+new_number2%10
    return answer
n=input()
n=int(n)
print(cycle(n))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
728x90
반응형

문제:

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력:

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1<=N<=1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.


출력:

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

풀이 방법:

입력값들을 받는 함수 student와 그 입력 값을 받아서 비율을 계산해주는 blue라는 함수 두 개로 구성되어 있다. 입력이 학생의 수 이후에 점수들이 나타나는 형식으로 이루어져 있으므로 input().split()을 통해 리스트로 받아준 후 정수값과 리스트값으로 나누었다.
이를 blue에 넣어서 평균을 구하고 평균을 넘는 학생들의 수를 구하였다. 출력을 소수점 셋째 자리까지 출력해야 하는데 이는 round함수를 구하면 얻을 수 있다. round( value, number)로 구성되어 있는데 value를 소수점 number째 자리까지 반올림하여 출력해주는 함수이다. 따라서 round(value,3)과 같이 구하면 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def blue(n,a):
    sumscore=0
    person=0
    for i in range(n):
        sumscore += int(a[i])
        average=sumscore/n
    for i in range(n):
        if int(a[i]) > average:
            person +=1
        else:
            pass
    print("%.3f%%" % round(person/n*100,3))
def student(c):
    for i in range(c):
        m=input().split()
        n=int(m[0])
        a=m[1:]
        blue(n,a)
c=input()
c=int(c)
student(c)
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]2839.설탕 배달  (1) 2019.03.31
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
728x90
반응형

문제:

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

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

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

주의 사항:

정확하게 만들 수 없다면 -1을 출력한다.

풀이 방법:

while문을 사용해서 무게가 3인 봉지를 하나씩 늘리면서 필요한 무게가 5인 봉지의 수를 구하고, 다시 한 번 무게가 5인 봉지를 하나씩 늘리면서, 필요한 무게가 3인 봉지의 개수를 찾는다. 정확히 N킬로그램이 되는 경우만 배열에 넣는다. while문이 끝나고 배열의 길이가 1보다 크다면 그 중 가장 작은 값을 반환하고, 그렇지 않으면 -1을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def sugar(n):
    x=1
    count=[]
    while n//(3*x) > 0:
        if (n-3*x)%5 == 0:
            y= (n-3*x)//5
            count.append(x+y)
        x+=1
    y=1
    while n//(5*y) > 0:
        if (n-5*y)%3 == 0:
            x= (n-5*y)//3
            count.append(x+y)
        y+=1    
    if len(count)==0:
        return -1
    else:
        return min(count)
n=int(input())
print(sugar(n))
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28
728x90
반응형

문제:

입력받은 대로 출력하는 프로그램을 작성하시오.

 

입력:

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다.

각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

 

풀이 방법:

문제만 보면 받은 그대로 print를 하면 될 것 같지만 정답 비율이 25% 정도인 것을 보면 풀기 쉽지 않다는 것을 알 수 있다. 대다수의 사람들이 통과를 하지 못하는 점은 주어지는 예제가 언제 끝나는지 모른다는 점이다. 따라서 이 점을 예외처리를 사용해서 해결한다면 문제를 통과 할 수 있다.

 

while True:
    try:
        line=input()
        print(line)
    except:
        break

 

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28
[Programmers]Lv 2. 점프와 순간이동  (0) 2019.03.27
728x90
반응형

문제:

라면 공장에서는 하루에 밀가루를 1톤씩 사용합니다. 원래 밀가루를 공급받던 공장의 고장으로 앞으로 k일 이후에야 밀가루를 공급받을 수 있기 때문에 해외 공장에서 밀가루를 수입해야 합니다.

해외 공장에서는 향후 밀가루를 공급할 수 있는 날짜와 수량을 알려주었고, 라면 공장에서는 운송비를 줄이기 위해 최소한의 횟수로 밀가루를 공급받고 싶습니다.

현재 공장에 남아있는 밀가루 수량 stock, 밀가루 공급 일정(dates)과 해당 시점에 공급 가능한 밀가루 수량(supplies), 원래 공장으로부터 공급받을 수 있는 시점 k가 주어질 때, 밀가루가 떨어지지 않고 공장을 운영하기 위해서 최소한 몇 번 해외공장으로부터 밀가루를 공급받아야 하는지를 return 하도록 solution 함수를 완성하세요.

dates[i]에는 i번째 공급 가능일이 들어있으며, supplies[i]에는 dates[i] 날짜에 공급 가능한 밀가루 수량이 들어 있습니다.

풀이 방법:

stock의 합이 k를 넘어가면 더이상 공급을 받지 않아도 된다. 그러므로 while의 조건을 stock<k 으로 잡았다. 기본적으론 남아있는 stock에 따라서 공급을 받을 수 있는 양이 다르게 된다. 예시에서와 같이 초기 stock이 4이므로 dates의 4일째인 20을 받을 수밖에 없다. 만약 기간 내에 여러 개의 날에서 공급을 받을 수 있다면 가장 많은 양을 받아오는 것이 적게 공급을 받도록 할 수 있다. 따라서 이 과정에서 우선순위 큐, 즉 힙을 사용하게 된다. stock에 따라서 받을 수 있는 공급들을 리스트에 담고 인덱스를 저장한다. 그리고 이 리스트 중에서 가장 많은 공급의 양을 빼서 stock에 더한다.
python에서 heapq라는 모듈을 제공해서 힙구조를 만들 수 있도록 한다. 하지만 이 힙은 최소힙을 제공하므로 힙구조에서 pop을 했을 때 최솟값이 나오게 된다. 하지만 이 문제에서는 최댓값을 빼야 하므로 최대 힙을 만들도록 한다. 따라서 힙에 넣을 당시에 heapq.heappush(h,(-supplies[i],supplies[i])) 와 같이 넣어서 최대힙을 구성하도록 하고 stock+=heapq.heappop(h)[1] 로 값을 빼도록 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import heapq
def solution(stock, dates, supplies, k):
    answer = 0
    idx=0
    h=[]
    while(stock<k):
        for i in range(idx,len(dates)):
            if dates[i]<=stock:
                heapq.heappush(h,(-supplies[i],supplies[i]))
                idx=i+1
            else:
                break
        stock+=heapq.heappop(h)[1]
        answer+=1
    return answer
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2839.설탕 배달  (1) 2019.03.31
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28
[Programmers]Lv 2. 점프와 순간이동  (0) 2019.03.27
[Programmers]Lv 2.소수 만들기  (0) 2019.03.26
728x90
반응형

문제:

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다..
2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
4. 이전에 등장했던 단어는 사용할 수 없습니다.
5. 한 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.

tank ->kick ->know->wheel ->land->dream->mother->robot->tank

위 끝말잇기는 다음과 같이 진행됩니다.

* 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
* 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
* 3번 사람이 자신의 첫 번째 차례에 know을 말합니다.
* 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
* (계속 진행)

끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.

사람의 수 n과 사람들이 순서대로 말한 단어 words가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.

풀이 방법:

끝말잇기에서 탈락하는 조건은 이전에 말했던 단어를 말하는 것과 잘못된 단어를 말하는 것이다. 이전에 말했던 단어임을 체크하기 위해서 past라는 배열을 만들어서 말한 단어들을 담았다. 다음 사람이 말한 단어가 past에 있으면 problem을 True로 바꿔주고 반복문을 종료하고 없다면 past에 넣고 마지막 두개의 값을 비교해 옳게 이어서 말했는지 확인한다. 이후 몇번째에 틀린것인지 확인하기 위해 divmod로 확인한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def solution(n, words):
    answer = [0,0]
    past=[]
    past.append(words[0])
    words.remove(words[0])
    count=0
    problem=False
    for word in words:
        count+=1
        if word in past:
            problem=True
            break
        else:
            past.append(word)
            if past[-2][-1]==past[-1][0]:
                pass
            else:
                problem=True
                break
 
    if not problem:
        return answer
    else:
        answer[1],answer[0]=divmod(count,n)
        answer[0]+=1
        answer[1]+=1
        return answer
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 점프와 순간이동  (0) 2019.03.27
[Programmers]Lv 2.소수 만들기  (0) 2019.03.26
[Programmers]Lv 3.단어 변환  (0) 2019.03.25
728x90
반응형

문제:

00 연구소는 한 번에 K 칸을 앞으로 점프하거나,(현재까지 온 거리) x 2에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간 이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 return하는 solution 함수를 만들어 주세요.

예를 들어 거리가 5만큼 떨어져 있는 장소로 가려고 합니다.
아이언 슈트를 입고 거리가 5만큼 떨어져 있는 장소로 갈 수 있는 경우의 수는 여러가지입니다.

* 처음 위치 0에서 5칸을 앞으로 점프하면 바로 도착하지만, 건전지 사용량이 5만큼 듭니다.
* 처음 위치 0에서 2칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리: 2) x 2에 해당하는 위치로 이동할 수 있으므로 위치 4로 이동합니다. 이때 1칸을 앞으로 점프하면 도착하므로 건전지 사용량이 3만큼 듭니다.
* 처음 위치 0에서 1칸을 앞으로 점프한 다음 순간이동 하면(현재까지 온 거리: 1) x 2에 해당하는 위치로 이동할 수 있으므로 위치 2로 이동합니다. 이때 다시 순간이동 하면 (현재까지 온 거리: 2) x 2만큼 이동할 수 있으므로 위치 4로 이동합니다. 이 때 1칸을 앞으로 점프하면 도착하므로 건전지 사용량이 2만큼 듭니다.

위의 3가지 경우 거리가 5만큼 떨어져 있는 장소로 가기 위해서 3번째 경우가 건전지 사용량이 가장 적으므로 답은 2가 됩니다.

풀이 방법:

건전지 사용량을 적게 사용하려면 순간 이동을 많이 사용할 수록 좋다. 따라서 거리가 1, 2 ,4 ,8 ,16,.......과 같은 경우 건전지 사용량이 1이 되게 된다. 처음에만 점프를 하고 그 뒤부턴 계속 순간 이동을 하면 되기 때문이다. 이 점에서 규칙을 찾을 수 있었다. 거리를 2진수의 숫자로 바꿨을 때 1의 갯수가 필요한 점프의 갯수이다. 점프의 갯수가 건전지의 사용량이 되기 때문에 답이 된다.

1
2
3
4
5
6
def solution(n):
    ans=0
    while (n!=0):
        n,b=divmod(n,2)
        ans+=b
    return ans
cs


728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28
[Programmers]Lv 2.소수 만들기  (0) 2019.03.26
[Programmers]Lv 3.단어 변환  (0) 2019.03.25
[Programmers]Lv 2. N개의 최소공배수  (0) 2019.03.24

+ Recent posts