컴퓨터 공부/👨‍💻 모각코

모각코 1회차 - 준비운동

letzgorats 2022. 10. 5. 20:10

9월 28일 회의

모각코 첫번째 회의 후 PART1. 튼튼한 기본기를 풀며 준비운동을 했습니다!
쉬운 문제를 풀며 자신감도 올리고 기본적인 문법을 복기하기 좋았습니다. ㅎㅎ

✏️ 준비운동 PART1. 튼튼한 기본기

 

1. 약수 구하기

import sys
input = sys.stdin.readline

N, K = map(int,input().split())

answer_list = []
for num in range(1,N+1):	# 1부터 N까지 순회하면서
    if N % num == 0:	# num이 N의 약수이면
        answer_list.append(num)	# answer_list에 추가

if len(answer_list) < K:	# K번째 약수가 존재하지 않을 경우
    print(0)	
else:	# K번째 약수
    print(answer_list[K-1])	# 출력

2. 이진수

import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    number = int(input())
    one_position  = []	# 1의 위치를 저장하는 리스트
    
    # bin(number)는 '0b'로 시작하므로 2번째부터 시작하는 이진수  거꾸로 순회
    for idx,s in enumerate(str(bin(number))[2:][::-1]): 
        if s == '1':	# 1이면
            one_position.append(idx)	# 위치 저장
            
    print(*one_position)	# 1 위치 한 줄로 출력

3. 최소, 최대

import sys
input = sys.stdin.readline

n = int(input())
number_list = []
number_list = list(map(int, input().split()))
print(min(number_list), max(number_list))

4. 지능형 기차2

import sys
input = sys.stdin.readline

max_val = 0 
current = 0	# 현재 사람 수 
for idx in range(10):
    out_train, in_train = map(int,input().split())	# 내리는 사람, 타는 사람
    current = current-out_train+in_train	# 현재 사람 계산

    max_val = max(current,max_val)	# 기차에 사람이 가장 많을 때의 수 갱신

print(max_val)

5. 피보나치 수5

def fib(num):
    if num < 2:
        return num
    else:
        return fib(num-1)+fib(num-2)	# 피보나치 재귀

num=int(input())
print(fib(num))

6. 일곱 난쟁이

import sys
input = sys.stdin.readline
 
height = []
for _ in range(9):
    height.append(int(input()))
 
diff = sum(height)-100  # 9명의 난쟁이 키의 합과 100의 차이를 구한다
find_two_false = False  # find_two_false라는 초기변수를 False로 설정한다.
 
for i in height:
    for j in height[1:]:
        if i + j == diff: # height를 돌면서 두 난쟁이의 합이 diff와 같으면
            height.remove(i)  # 그 난쟁이들은 가짜 난쟁이이므로 제거
            height.remove(j)  
            find_two_false = True # 두 가짜 난쟁이를 찾았으니 find_two_false라는 초기변수를 True로 설정한다.
            break
    if find_two_false == True:  # 두 가짜 난쟁이를 찾았으면
        height.sort()           # 정렬하고
        print(*height,sep="\n") # 한 줄에 하나씩 출력, *를 사용할 때는 sep 사용
        break

7. 최대공약수와 최소공배수

def lcm(a,b):   # 최소공배수
    x = gcd(a,b)
    y = a // x
    z = b // x
    return x * y * z

def gcd(a,b):   # 최대공약수
    if b == 0 :
        return a
    else:
        return gcd(b,a % b)



a,b = map(int,input().split())
if a < b :
    a, b = b, a     # 큰 숫자를 a로 설정

print(gcd(a,b))
print(lcm(a,b))

8. N번째 큰 수

import sys
input = sys.stdin.readline

testcase = int(input())

for t in range(testcase):
    numbers = sorted(list(map(int,input().split())),reverse=True)   # 내림차순 numbers리스트
    print(numbers[2])   # 3번째로 큰 수 출력

9. 소수 찾기

import sys
import math
input = sys.stdin.readline

def sosu(n):    # 소수 찾기
    for x in range(2,round(math.sqrt(n))+1):
        if n % x == 0:  # 나눠지는 수가 있다면,
            return False # 소수가 아니다
    return True # 다 돌 때까지 if문으로 안빠졌으면 소수 


N = int(input())
numbers = sorted(list(map(int,input().split())))
cnt = 0 # 소수 개수 

for n in numbers:
    if n == 2 or n == 3:
        cnt += 1 
    elif n != 1 :
        if sosu(n): # 소수로 판별났다면,
            cnt += 1
        
print(cnt)

10. 쉽게 푸는 문제

import sys
input = sys.stdin.readline

A,B = map(int,input().split())
numbers_list = []

for i in range(1,B+1):
    for _ in range(i):  # i번 반복
        numbers_list.append(i)  # 숫자 i 추가

sum = 0
for j in numbers_list[A-1:B]:   # A부터 B까지이므로 인덱스값으로는 A-1부터 B까지
    sum += j
print(sum)

 

* 조금 더 효율적인 코드 * 

number_list = []
for i in range(1, 46):
    number_list += [i] * i
    
A, B = map(int, input().split())
print(sum(number_list[A-1:B]))

# 왜 45까지?
# --> 1부터 45까지 다 더하면 1035입니다.
# --> 예를 들어 최대값이 9 이라면
# --> 1+2+3+4=10 이므로 4까지만 하면 충분합니다

11. 소수

import sys
import math
input = sys.stdin.readline

M = int(input())
N = int(input())
sum, min_val = 0, 10001 # 소수의 합, 소수 중에 최솟값

for i in range(M,N+1):
    discover = True # 소수 발견 초기값
    if i == 2:
        min_val = 2
        sum += 2  
    else:
        if i > 2:
            for x in range(2,round(math.sqrt(i))+1):
                if i % x == 0:	# 나눠지면 소수가 아니다
                    discover = False	# 소수발견 False로 갱신
                    break
            if discover:	# for문을 다 돌고도 discover가 여전히 True라면 소수 
                sum += i	# sum에 i 추가
                min_val = min(i,min_val) # 사실 처음 발견된 i가 최솟값

if min_val == 10001:    # min_val이 변하지 않았다면 소수발견 안된 것
    print(-1)
else:
    print(sum)
    print(min_val)

 

반응형