천문동아리에서 백준 소모임이 생겼다... 정말 관측 빼고 다하는 동아리 같다.
백준 플레 친구가 집어주는 문제를 매주 풀기로 정했는데, 풀이와 그 당시의 생각을 기록해두고 싶어 이렇게 매주 문제를 풀고 블로그 글도 작성하고자 한다.
사용 언어는 Python이고, 가끔 nodejs 기반의 javascript도 사용할 예정이다.
11942. [B5] 고려대는 사랑입니다
console.log("고려대학교");
정말 간단한 출력 문제. 그냥 언어에 맞게 출력하면 된다. 파이썬으로는 옛날에 풀었어서 이 문제만 js로 풀어봤다. 프로젝트 하면서 js 숙련도가 아직 많이 낮은 거 같아 백준을 js로 풀려고 계획 중인데, 아직 본격적으로 시도해보진 않았다ㅎㅎ..
11718. [B5] 그대로 출력하기
# 11718
import sys
print("".join(sys.stdin.readlines()))
입력 받고, 출력을 하면 되는 문제다. input()을 써도 됐지만 sys.stdin을 자주 써보고 싶어 여러 줄 입력을 받아 리스트로 저장하는 readlines() 메서드를 사용하였다.이때 readlines()를 사용하면 ["Hello\n", "Baekjoon\n", "Online Judge\n"] 와 같이 개행 문자(\n)와 함께 저장된다. 해당 값을 문제에서 추가로 활용한다면 .strip() 메서드를 이용해 개행문자를 없애줘야 하지만, 이 문제는 그대로 출력하면 되므로 리스트 안의 세 값을 공백 없이 연결해서 출력하면 된다.
3046. [B4] R2
# 3046
import sys
r1, s = sys.stdin.readline().strip().split(' ')
# s == (r1 + r2) / 2
# r2 = 2s - r1
print(int(s)*2 - int(r1))
문제를 이해하고, 식을 세운 후 그걸 그대로 구현하면 되는 문제다. 별 어려움 없이 풀었다.
15552. [B4] 빠른 A+B
# 15552
import sys
T = int(input())
for i in range(T):
a, b = map(int, sys.stdin.readline().split(" "))
print(a+b)
빠른 입출력을 위한 방법을 소개하는 문제이다. 파이썬 같은 경우에는 sys.stdin의 여러 read... 메서드를 사용한다. 이 문제에서는 입력받은 값을 두 변수에 할당해야 하므로, map() 함수를 사용하였다. map 함수는 원리만 이해하면 온갖 곳에 다 쓸 수 있으니 기억해두면 좋을 거 같다.
아무튼 readline()으로 입력을 받고, 공백 기준으로 쪼개준 다음(split) int() 함수를 각각 사용해주면 a, b가 int로 할당된다. 해당 값을 더해서 출력해주면 된다. 새로운 메서드 사용법만 알면 간단한 문제이다.
2588. [B3] 곱셈
# 2588
import sys
a = sys.stdin.readline().strip()
b = sys.stdin.readline().strip()
print(int(a) * int(b[2]))
print(int(a) * int(b[1]))
print(int(a) * int(b[0]))
print(int(a) * int(b))
(3), (4), (5), (6)에 오는 값이 각각 어떻게 곱해져서 나온 건지 찾고 그걸 그대로 적으면 되는 문제다.
(3): (1) x (2)의 일의 자리
(4): (1) x (2)의 십의 자리
(5): (1) x (2)의 백의 자리
(6): (1) x (2)
2581. [B2] 소수
# 2581
import math
def isPrime(x):
# 2에서 x의 제곱근까지 모든 수 확인
for i in range(2, int(math.sqrt(x)) + 1):
if x % i == 0: return False # 소수가 아님
return True #소수임
M = int(input())
N = int(input())
primes = []
for i in range(M, N+1):
if i == 1: continue
else:
if isPrime(i):
primes.append(i)
if primes:
print(sum(primes))
print(min(primes))
else: print(-1)
소수 판별 알고리즘인 에라토스테네스의 체의 개선된 방식으로 구현하였다.
isPrime(x) 함수는 어떤 값을 입력받으면 2부터 해당 값의 제곱근값(정수)까지 모든 수로 해당 값을 나누어 나머지가 0이 되는지 확인한다. 나머지가 0이 되는 수라면 소수가 아니고, 마지막까지 나머지가 0이 아닌 수라면 소수이다.
다만 이때 주의해야 할 부분이 있는데, M, N에는 1이 들어올 수도 있지만 1은 소수가 아니므로 따로 처리해줘야 한다는 것이다. 나는 함수 내부에서 분기를 나누진 않았고, 메인 for문에서 M 이상 N 이하의 값 중에 1이 있을 경우 isPrime(x)에 넣지 않고 continue로 for문 loop를 진행하였다.
소수 판별 문제는 다음과 같은 사항을 명심해야겠다.
1. 에라토스테네스의 체 활용 -> 2부터 해당 값의 제곱근값(정수)까지 확인하기
2. 1은 소수가 아니므로 필요할 경우 따로 처리하기
🥲 11653. [B1] 소인수분해
#11653
N = int(input())
def factorize(N):
d = 2 #첫 소수
while d <= N: #d가 N보다 커지면 나눌 수 없으므로
if N % d == 0: # 약수일 경우
print(d)
N = N / d
else: # 약수가 아닐 경우
d += 1
factorize(N)
처음 읽었을 때는 어떻게 풀어야 하는 건지 감이 안 왔던 문제...였는데 사실 그냥 머릿속에 있는 전개 과정을 그대로 코드로 옮기면 되는 문제였다.
d=2부터 시작하여 N을 d로 나눈 나머지가 0이 되면 d를 출력하고, N은 그대로 d로 나누어준다. 반면 나머지가 0이 아닐 경우 해당 d 값은 N의 약수가 아니므로 d에 1을 증가시킨다. 이 일련의 과정을 d가 N보다 커지기 전까지 반복한다.
1037. [B1] 약수
#1087
count = int(input())
divisors = list(map(int, input().split()))
if count == 1:
print(divisors[0] ** 2)
else:
divisors.sort()
print(divisors[0] * divisors[-1])
이번 주 마지막 문제길래 어려울까봐 쫄았는데(?) 생각보다 매우매우 간단한 문제였다... N의 약수들이 구해지면 그 값을 통해 N을 구하면 된다. 그냥 곱해주면 되는 문제다... 약수가 1개일 경우는 2x2=4와 같은 경우이므로 제곱해주면 된다.
소감
첫 주차라서 그런가 생각보다 간단한 문제들이 대부분이었다! 첫 주 몸풀기로는 되게 좋은 것 같다:) 다음 주에는 실버 쪽에서 약간 난도 있는 알고리즘이 들어가는 문제를 풀어보고 싶다.
'코딩테스트 > 백준' 카테고리의 다른 글
[COSE403] 3주차 연습 풀이와 설명 모음 (0) | 2023.07.17 |
---|---|
[COSE403] 2주차 연습 풀이와 설명 모음 (0) | 2023.07.10 |
[백준 10250] ACM 호텔 (2) | 2023.06.04 |
[백준 2164] 카드2 (0) | 2023.05.28 |
[백준 2108] 통계학 (0) | 2023.05.21 |