Algorithm

[코드트리] 반복문을 반복하며 중첩 반복문 약점 극복하기

HS0601 2026. 5. 17. 21:15

오늘은 중첩반복문에 대해 한문제 풀 예정이다

약수가 세 개인 수

[문제]
두 정수 start와 end가 주어집니다.
정수의 약수란, 그 수를 나누었을 때 나머지가 없이 떨어지는 양의 정수를 뜻합니다. 예를 들어, 6의 약수는 1, 2, 3, 6으로 총 네 개입니다.
start 이상 end 이하인 정수 중에서, 약수가 정확하게 세 개인 수의 개수를 구하는 프로그램을 작성해보세요.
[입력]
첫 줄에 두 정수 start와 end가 공백으로 구분되어 주어집니다
제한조건 : 1 <= start <= end <= 1000
[출력]
첫 줄에 조건을 만족하는 정수의 개수를 출력합니다 
[예제 설명]
예제 1에서, 조건을 만족하는 수는 4가 유일합니다 
3의 약수 : {1, 3}
4의 약수 : {1, 2, 4}
5의 약수 : {1, 5}
6의 약수 : {1, 2, 3, 6}
7의 약수 : {1, 7}

예제 3에서, 조건을 만족하는 수는 4, 9, 25, 49로 총 4개가 있습니다
[입력 예제 1]
입력 : 3 7
출력 : 1
[입력 예제 2]
입력 : 9 16
출력 : 1
[입력 예제 3]
입력 : 1 50
출력 : 4

 

[내가 한 풀이]

소수제곱 카운트하면되는 문제라는 거까지는 알아냈는데 아직은 간단한 for과 if문 정도만 할 줄 알아서 반복문으로 풀었다

*소수제곱 즉, 2의 제곱, 3의 제곱, 5의 제곱 이런 식인 셈.

 

  1. num을 start ~ end까지 하나씩 검사하기
  2. 각 num마다 약수 개수를 저장할 divisorCount를 0으로 초기화하기
  3. i를 1~num까지 나눠보기
  4. num % i == 0이면 i는 num의 약수
  5. 약수가 3개면 answer 증가 
  6. 마지막에 answer 출력

반복문 두 번 필요

1. 바깥 반복문 : start~end까지 숫자를 하나씩 꺼내기 위한 반복문

2. 안쪽 반복문 : 현재 숫자 num의 약수가 몇 개인지 세기 위한 반복문

import java.util.Scanner;

public class Main{
	public static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
        int start = sc.nextInt();
        int end = sc.nextInt();
        int answer = 0;
        
        for(int num = start; num <= end; num++){
        	int divisorCount = 0;
            for(int i = 1; i <= num; i++){
            	if(num % i == 0){
                	divisorCount++;
                }
            }
            if(divisorCount == 3){
            	answer++;
            }
        }
    	System.out.println(answer);
    }
}

 

풀이하면서 헷갈렸던 점

약수의 개수를 어디서 초기화해야 하는지 

전체 범위에서 약수 개수를 계속 세는 것처럼 생각했는데 실제로는 숫자마다 약수 개수를 따로 세어야 했다

예를 들어 3의 약수 개수와 4의 약수 개수는 서로 다른 값이다 그래서 divisorCount는 바깥 반복문 안에서 매번 0으로 초기화해야 했다 

 

학습하면서 느낀 점

중첩 반복문 문제는 for문을 두 번 쓰는 문법이 아니라 반복해야 하는 일이 두 단계로 나뉘어 있을 때 사용하는 구조라는 것을 알게되었다 

1. start~end까지 숫자를 하나씩 확인하는 것

2. 각 숫자마다 1부터 자기자신까지 나누어보며 약수 개수를 세는 것

 

이 두 작업이 겹쳐있기 때문에 중첩 반복문이 필요했다

 

코드트리의 커리큘럼은 기본 개념을 먼저 보고, 그 다음 비슷한 유형의 문제를 풀면서 직접 적용해 보는 구조라서 내가 어디서 막히는지 확인하기 좋았다 

 

이번 문제를 통해 반복문 문제를 풀 때 바로 코드를 쓰기 보다 무엇을 반복해야 하는가를 나누어 생각해야 한다는 점을 배웠다 

 

앞으로 반복문 문제를 풀 때 다음 순서로 할 것

1. 입값이 무엇인지 확인한다 

2. 반복해야 하는 범위가 어디인지 찾는다 

3. 반복문 안에서 매번 초기화해야 하는 값이 있는지 확인한다 

4. 조건을 만족하면 어떤 값을 증가시킬지 정한다 

5. 출력 위치가 반복문 안인지 밖인지 확인한다