코딩,해볼까

05.19. 팀원들과 알고리즘 풀이 / 백준 / 별 찍기 강아지 세금 소수 찾기 본문

Back/TIL

05.19. 팀원들과 알고리즘 풀이 / 백준 / 별 찍기 강아지 세금 소수 찾기

떠굥 2023. 5. 19. 13:35

1.  오늘 배운 것

0-1. 문제집 

0-2. 오늘의 문제

 


1. 별찍기

N = int(input())
for i in range(1, N+1):

#1     
   #print((' ' * (N-i)) + (i * '*'))

#2
    i = i*'*'
    print(i.rjust(N))

 

2. 강아지

print('|\\_/|\n|q p|   /}\n( 0 )\"\"\"\\\n|\"^\"`    |\n||_/=\\\\__|')

print('''
|\\_/|
|q p|   /}
( 0 )\"\"\"\\
|\"^\"`    |
||_/=\\\\__|
''')

print("|\\_/|")
print("|q p|   /}")
print("( 0 )\"\"\"\\")
print("|\"^\"`    |")
print("||_/=\\\\__|")

 

3. 세금

n = int(input())
A = n * 0.78
B = n * 0.8 + n * 0.2 * 0.78
print(int(A), int(B))

 

4. 소수 찾기. thanks to sdoram👍

num1 = input()
num_list = list(map(int, input().split()))
answer = []
for i in num_list:
    count = 0    
    for n in range(1, i+1):
        if i % n == 0:
           count += 1 
     
    if count == 2:
       answer.append(i)  
            
print(len(answer))
  • 이 식을 만들면서 헤맨 부분
    • for문 안에 for문 사용에 대한 확신이 없었지만, 알고있었던 부분이 맞았다.
    • 내가 만든 식은 1부터 i까지 range를 통해 나열된 수들로 i를 나누었을 때, 몇 번 나뉘는지 확인하는 것이다. count가 2가 된다면 1과 나 자신, 총 2번 밖에 나누지 못하므로 소수가 된다. count = 2인 수만을 고르면 된다는 생각까지 하지 못했다.

 

  • 팀원들의 코드 및 자료 공유
    • 내가 풀어보고 싶었던 방향
N = int(input())

number_list = map(int, input().split())

count = 0

for i in number_list:
    check = 0
    if i == 1:
        check = 1    
    for j in range(2, i):
        if i % j == 0:
            check = 1

    if check == 0:
        count += 1

print(count)

 

 

  • 성우님 풀이
import math #sqrt함수를 사용하기 위해서, math함수를 호출합니다

# n=18 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] 
# n=18 [False, False, True, True, False, True, False, True, False, True, False, True, False, True, False, False, False, True, False] 
def solution(n):
    array = [True for i in range(n + 1)] # 0부터 n까지 정수들에 대해, 모두 True로 저장합니다
    array[0] = False 
    array[1] = False #0번째, 1번째 index인 True는 False로 바꾸어줍니다. 이미 소수가 아니니까 
    
    # array = [False, False, True, True, True, True, True, True]
    for i in range(2, int(math.sqrt(n)) + 1): 
        # 루트 n 2의 제곱 = 4, 루트4 =2, 루트9 = 3, 루트 16 = 4, 루트 13 = 3.xxx, 루트18 = 4.xxx 
		# 만약 n이 18이라고하면, 우리는 2부터 5까지 반복문을 시작합니다.
        if array[i] == True: 
        # 2부터 5까지는 아마 True값을 저장하고 있겠죠? 
        # 2의 배수인 4,6,8,10...16,18까지는 False가 됩니다
        # 3의 배수인 6,9,12,15,18은 False가 되겠습니다.
        # 그런데, 7의 배수는 어떡하냐구요 ? 8의 배수도요 ?
		# 이미 7의 배수 14는 False입니다. 8의 배수 16도 마찬가지구요!
            j = 2
            while i * j <= n:
                array[i * j] = False
                j += 1
                # 2의 배수를 False로 저장하기 위해서, 2를 곱한 4, 6, 8, ...를 False로 저장하고
                # 3을 곱한 6을 False로 저장하기 위해서 j+=1을 해서 i * j를 해줍니다. 
                # 3을 곱한 6을 False로 저장하고
                # 4을 곱한 8을 False로 저장해줍니다. 
    return array.count(True)
    # array = [False, False, True, True, False, True, False, True, False, True, False, True, False, True, False, False, False, True, False]
    	#count함수는 True인 원소들의 개수를 세어줍니다. 그걸 return하면 소수의 개수가 나오게됩니다

 

 

  • 좋아요를 가장 많이 받은 풀이방법. set 함수(집합) 사용으로 훨씬 간편해졌다.
def solution(n):
	num=set(range(2,n+1))
	for i in range(2,n+1):
        if i in num:
        num-=set(range(2*i,n+1,i))
    return len(num)
Comments