언어/C++

[코딩테스트 준비] 백준 브론즈 5문제(2501 약수 구하기 / 3460 이진수 / 10818 최소,최대 / 2460 지능형 기차 2 / 2309 일곱 난쟁이)

rngPwns 2025. 12. 28. 15:08

2501 약수 구하기

문제

1부터 N까지 순서대로 보면서 나누어떨어지는 수(약수)를 발견할 때마다 카운트

K번째 약수가 나오면 바로 출력, 끝까지 못 찾으면 0 

 

풀이

 

  • i = 1 → N까지 증가하면서 N % i == 0이면 약수
  • 약수 나올 때마다 cnt++
  • cnt == K 되는 순간 그 i가 K번째로 작은 약수이다.
  • return 0; 을 각 조건 아래에 써서 if 조건을 충족하지 못하면 밑의 cout << 0 을 실행하도록 하기!

 

 

3460 이진수

문제

 

  • 양의 정수 n이 주어짐. n을 이진수로 표현
  • 값이 1인 비트들의 위치를 모두 출력
  • 최하위 비트(lsb)의 위치 = 0
  • 낮은 위치부터 출력

풀이

 

  • pos → 현재 비트 위치 (0부터)
  • n % 2 → 최하위 비트 확인
  • n /= 2 → 오른쪽으로 한 비트 이동

1의 위치 찾기가 되는 이유는?

코드 흐름을 보자

int pos = 0; 
while (n > 0) 
{ 
if (n & 1) { cout << pos << " "; } n >>= 1; pos++; 
}

이게 의미하는 것

코드 의미
n & 1 지금 보고 있는 비트가 1인가?
n >>= 1 다음 비트로 이동
pos++ 비트 위치 증가

&를 쓴다고 해서
n을 십진수 → 이진수로 변환해서 계산하는 게 아님

CPU는 애초에 모든 정수를 이진수로 저장하고 있어서 변환이라는 과정 자체가 존재하지 않는다.

 

 

10818 최소, 최대

문제

  • 정수 최대 1,000,000개
  • 한 번만 순회(O(N))

최소값은 처음에 1000000정도, 최댓값은 -1000000정도로 정의하고 시작.

 

  • 최솟값 구할 때
    S = 아주 큰 값
  • 최댓값 구할 때
    B = 아주 작은 값
  • 최솟값은 크게, 최댓값은 작게 시작하는 이유는 비교가 반드시 한 번은 성공하도록 만들기 위해서!
  • 가장 안전한 방식은 cin >> I;  S = B = I; 이렇게 정의하는 것

 

 

2460 지능형 기차 2

 

  • 현재 기차 안 인원 cur = 0
  • 최대 인원 mx = 0
  • 10번 반복하면서:
    • cur -= 내린 사람
    • cur += 탄 사람
    • mx = max(mx, cur)
  • mx 출력

 

 

2309 일곱 난쟁이

  • 난쟁이 9명
  • 키는 모두 다름
  • 7명의 키 합 = 100
  • 가능한 정답 여러 개면 아무거나 OK
  • 출력은 오름차순

즉, 전체 합 − (제외할 2명) = 100