문제:

상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 친구의 친구를 초대하기로 했다. 상근이의 동기는 모두 N명이고, 이 학생들의 학번은 모두 1부터 N까지이다. 상근이의 학번은 1이다.

 

상근이는 동기들의 친구 관계를 모두 조사한 리스트를 가지고 있다. 이 리스트를 바탕으로 결혼식에 초대할 사람의 수를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 상근이의 동기의 수 n(2<=n<=500)이 주어진다. 둘째 줄에는 리스트의 길이 m(1<=m<=10000)이 주어진다. 다음 줄부터 m개 줄에는 친구 관계 ai,bi가 주어진다. (1<=ai<bi<=n) ai와 bi가 친구라는 뜻이며, bi 와 ai도 친구관계이다.

출력:

첫째 줄에 상근이의 결혼식에 초대하는 동기의 수를 출력한다.

풀이방법:

우선 입력으로 받은 값들을 그래프 형식으로 정리를 하는 작업을 거친다. 이후 BFS 방식을 사용해서 level이 2까지 가는 친구들(친구의 친구)을 찾는다. 항상 시작은 1이므로 queue에 1을 넣고 BFS 탐색을 두번 한다. 그렇게 탐색을 마치고 1을 제거한 뒤에 배열의 길이를 출력하도록 한다.

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
n=int(input())
m=int(input())
friends=[[]for i in range(n+1)]
for i in range(m):
    a,b=map(int,input().split())
    friends[a].append(b)
    friends[b].append(a)
 
answers=[]
queue=[1]
count=1
while len(queue):
    temp=[]
    for i in queue[:]:
        for j in friends[i]:
            if j in answers or count > 2:
                continue
            else:
                answers.append(j)
                temp.append(j)
        queue.pop(0)
    queue=temp
    count+=1
answers.remove(1)
print(len(answers))
cs

 

문제링크:

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

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

[BOJ]7576. 토마토  (0) 2019.10.29
[BOJ]1049. 기타줄  (0) 2019.10.18
[BOJ]1159. 농구 경기  (1) 2019.10.16
[BOJ]1016. 제곱ㄴㄴ수  (0) 2019.10.15
[BOJ]2960. 에라토스테네스의 체  (0) 2019.10.14

문제:

상근이는 농구의 세계에서 점차 영향력을 넓혀가고 있다. 처음에 그는 농구 경기를 좋아하는 사람이었다. 농구에 대한 열정은 그를 막을 수 없었고, 결국 상근이는 농구장을 청소하는 일을 시작했다. 상근이도 농구장을 청소하면서 감독이 되기 위해 가져야할 능력을 공부해나갔다. 서당개 3년이면 풍월을 읊듯이 상근이는 점점 감독으로 한 걸음 다가가고 있었다. 어느 날 그에게 지방의 한 프로농구팀을 감독할 기회가 생기게 되었다. 그는 엄청난 지도력을 보여주며 프로 리그에서 우승을 했고, 이제 국가대표팀의 감독이 되었다.

 

내일은 일본과 국가대표 친선 경기가 있는 날이다. 상근이는 내일 경기에 나설 선발 명단을 작성해야 한다.

 

국가대표팀의 감독이 된 이후에 상근이는 매우 게을러졌다. 그는 선수의 이름을 기억하지 못하고, 각 선수의 능력도 알지 못한다. 따라서, 누가 선발인지 기억하기 쉽게 하기 위해 성의 첫 글자가 같은 선수 5명을 선발하려고 한다. 만약, 성의 첫 글자가 같은 선수가 5명보다 적다면, 상근이는 내일 있을 친성 경기를 기권하려고 한다.

 

상근이는 내일 경기를 위해 뽑을 수 있는 성의 첫 글자를 모두 구해보려고 한다.

입력:

첫째 줄에 선수의 수 N(1<=N<=150)이 주어진다. 다음 N개 줄에는 각 선수의 성이 주어진다. (성은 알파벳 소문자로만 이루어져 있고, 최대 30글자이다)

출력:

상근이가 선수 다섯 명을 선발할 수 없는 경우에는 "PREDAJA" (따옴표 없이)를 출력한다. PREDAJA는 크로아티아어로 항복을 의미한다. 선발할 수 있는 경우에는 가능한 성의 첫 글자를 사전순으로 공백없이 모두 출력한다.

풀이방법:

딕셔너리 자료형을 사용해서 해시 방법으로 풀었다. 맨 앞글자를 키로 하고 그에 따른 value는 나타낸 횟수로 지정했다. 이렇게 모든 이름을 다 한번씩 탐색해 딕셔너리로 정리를 마친다. 이를 items으로 가져와서 정렬한 뒤에 5이상인 값만 answer에 붙이도록한다. 만약 5이상인 값이 없었다면 answer는 빈 문자열일것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n=int(input())
person=dict()
for i in range(n):
    inp=input()
    if inp[0in person:
        person[inp[0]]+=1
    else:
        person[inp[0]]=1
person=sorted(list(person.items()))
answer=''
for i,j in person:
    if j>=5:
        answer+=i
if answer=='':
    print("PREDAJA")
else:
    print(answer)
cs

문제링크:

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

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

[BOJ]1049. 기타줄  (0) 2019.10.18
[BOJ]5567. 결혼식  (0) 2019.10.17
[BOJ]1016. 제곱ㄴㄴ수  (0) 2019.10.15
[BOJ]2960. 에라토스테네스의 체  (0) 2019.10.14
[BOJ]2851. 슈퍼 마리오  (0) 2019.10.13

문제:

에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾는 유명한 알고리즘이다.

 

이 알고리즘은 다음과 같다.

 1. 2부터 N까지 모든 정수를 적는다.

 2. 아직 지우지 않은 수 중 가장 작은 수를 찾는다. 이것을 P라고 하고, 이 수는 소수이다.

 3. P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다.

 4. 아직 모든 수를 지우지 않았다면, 다시 2번 단계로 간다.

입력:

첫째 줄에 N과 K가 주어진다. (1<=K<,max(2,K) < N <=1000)

출력:

첫째 줄에 K번째 지워진 수를 출력한다.

풀이방법:

우선 N까지 수가 있는 배열을 만들고 이를 에라토스테네스의 체 규칙에 따라서 하나씩 지워나간다. 이 때마다 하나씩 count를 늘려주면서 K번째가 되면 현재 지운 값을 출력하도록 한다.

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
28
29
def make(i):
    global answer
    idx=i
    count=1
    temp=0
    while idx*count <len(numbers):
        temp=numbers[idx*count]
        if numbers[idx*count]!=0:
            numbers[idx*count]=0
            answer+=1
            if answer==k:
                break
        count+=1
    return temp
 
 
n,k=map(int,input().split())
numbers=list(range(n+1))
numbers[1]=0
answer=0
conti=True
while conti:
    for i in range(len(numbers)):
        if numbers[i]!=0:
            temp=make(i)
            if answer==k:
                print(temp)
                conti=False
                break
cs

문제링크:

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

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

[BOJ]1159. 농구 경기  (1) 2019.10.16
[BOJ]1016. 제곱ㄴㄴ수  (0) 2019.10.15
[BOJ]2851. 슈퍼 마리오  (0) 2019.10.13
[BOJ]17144. 미세먼지 안녕!  (0) 2019.10.12
[BOJ]1834. 나머지와 몫이 같은 수  (0) 2019.10.11

문제:

슈퍼 마리오 앞에 10개의 버섯이 일렬로 놓여져 있다. 이 버섯을 먹으면 점수를 받는다.

슈퍼 마리오는 버섯을 처음부터 나온 순서대로 집으려고 한다. 하지만, 모든 버섯을 집을 필요는 없고 중간에 중단할 수 있다.

중간에 버섯을 먹는 것을 중단했다면, 그 이후에 나온 버섯은 모두 먹을 수 없다. 따라서 첫 버섯을 먹지 않았다면, 그 이후 버섯도 모두 먹을 수 없다.

마리오는 받은 점수의 합을 최대한 100에 가깝게 만들려고 한다.

버섯의 점수가 주어졌을 때, 마리오가 받는 점수를 출력하는 프로그램을 작성하시오.

입력:

총 10개의 줄에 각각의 버섯의 점수가 주어진다. 이 값은 100보다 작거나 같은 양의 정수이다. 버섯이 나온 순서대로 점수가 주어진다.

출력:

첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.

풀이방법:

반복문을 사용해서 0개 버섯을 먹은 경우부터 10개의 버섯을 먹은 모든 경우를 모두 한 배열에 담아 넣는다. 그 다음에는 python의 sort의 key 기능을 사용해서 100과 가까운 수가 제일 앞에 오도록 정렬을 했다. (abs(x-100)을 이용해서) 그 다음에는 98과 102와 같이 간격이 같은 경우가 있을 수 있으므로 이 경우에는 1번째 인덱스를, 아닌 경우에는 0번째 인덱스를 출력하도록 했다.

1
2
3
4
5
6
7
8
9
10
11
12
answers=[]
summation=0
for i in range(10):
    score=int(input())
    answers.append(summation)
    summation+=score
answers.append(summation)
answers.sort(key=lambda x: abs(x-100))
if abs(100-answers[0])==abs(100-answers[1]):
    print(answers[1])
else:
    print(answers[0])
cs

문제링크:

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

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

[BOJ]1016. 제곱ㄴㄴ수  (0) 2019.10.15
[BOJ]2960. 에라토스테네스의 체  (0) 2019.10.14
[BOJ]17144. 미세먼지 안녕!  (0) 2019.10.12
[BOJ]1834. 나머지와 몫이 같은 수  (0) 2019.10.11
[BOJ]1357. 뒤집힌 덧셈  (0) 2019.10.08

문제:

풀이방법:

이진수로 바꾸는 것이 가장 중요한 문제이다. 이진수로 바꾸는 것은 python의 bin을 사용하면 바꿀수 있다. 이 때 bin을 사용하면 앞에 이진수임을 나타내는 값이 붙어 있으므로 이를 떼어서 저장하는 것이 필요하다. 그리고 이를 한 변의 크기와 동일하게 만드는 것이 중요하다. 위 문제의 예시처럼 1은 1이지만 한변의 길이가 5이므로 00001로 맞춰준 것을 알 수 있다. 길이가 동일해야 해독할 수 있으므로 이 작업이 가장 중요하다. 길이를 같게 만들었다면 이제는 단순히 반복문을 사용해서 값을 비교하고 상황에 따라 "#"과 공백을 더해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        arr1[i]=bin(arr1[i])[2:]
        arr2[i]=bin(arr2[i])[2:]
    for i in range(n):
        code=""
        a=max(len(arr1[i]),len(arr2[i]))
        if n!=len(arr1[i]):
            arr1[i]="0"*(n-len(arr1[i]))+arr1[i]
        if n!=len(arr2[i]):
            arr2[i]="0"*(n-len(arr2[i]))+arr2[i]        
        for j in range(n):
            if arr1[i][j]==arr2[i][j]:
                if arr1[i][j]=='0':
                    code+=" "
                else:
                    code+="#"
            else:
                code+="#"
        answer.append(code)
    return answer
cs

 

 

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/17681

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

[Programmers]2018 Kakao.실패율  (0) 2019.09.30
[Programmers]2018 Kakao. 오픈채팅방  (0) 2019.09.29
[Programmers]2017 Kakao.캐시  (0) 2019.09.27
[Programmers]2017 Kakao. 뉴스 클러스터링  (0) 2019.09.26
[BOJ]1987. 알파벳  (0) 2019.09.25

문제:

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 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


'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

+ Recent posts