Algorithms/프로그래머스

[프로그래머스] '순서쌍의 개수' - Java

LEFT 2023. 4. 27. 14:13

<문제 제시>

<문제설명>
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 
(a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 
두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

<예시 입출력>


<문제 해결 과정>

특정 숫자가 정해질때 두 숫자의 곱이 그 특정숫자가 되도록 하는 숫자 순서쌍을 찾는 문제이다.

Try 1) 시간 초과 및 모든 테스트 통과 실패

/*
>> 두번째 반복문에서 조건식을 생략했던 점이 시간초과의 원인인 것 같았다.
>> 실제 곱셈 로직을 생각하기보다 어떻게하면 answer값이 증가될 수 있을지 생각해야할 것 같았다.
*/

// 첫번째 매개변수 (이중 반복문 처리)
for(int i = 1; i <= n; i++){
	// 두번째 매개변수 인덱스 (주어진 자연수로 지정한다.)
    for(int k = n ; ; k--){
    	// k가 0에 도달하면 종료
    	if(k == 0) break;

    	// 첫번째 매개변수와 두번째 매개변수의 곱이 n과 일치하면 증가
        if(k * i == n) {
        	answer += 1;
        }
    }
}

마냥 특정 숫자를 탐색해가며 이중 반복문을 통해 두 매개변수의 곱이 n과 일치할때 answer값을 증가시키고자 하였다.

Solution 1)

약수를 찾는 문제라고 할 수 있다.

20의 약수라고 하면, 1, 2, 4, 5, 10, 20이므로

양 끝값을 곱하는 순서쌍을 찾으면 된다.

ex. (1, 20), (2, 10), (4, 5) 

= 3개이다.

if(n % i == 0) {
    answer++;
}

약수를 찾는 로직은 %를 통해 나머지를 구하는 로직이므로 간단하였다.


<전체코드>

public class ordered_pair {

	public static int solution(int n) {
        int answer = 0;
        
        for(int i = 1; i <= n; i++) {
        	// 20의 약수이면 answer 증가
        	if(n % i == 0) {
        		answer++;
        	}
        }
       
        return answer;
    }
	
	public static void main(String[] args) {
		int n = 20;
		
		System.out.println(solution(n));
	}

}

간단한 약수 구하기 문제였지만 문제를 읽고 바로 떠오르지 않았다.

초반 이중 반복문을 통해 구하고자 하였으나 순서쌍을 찾는 문제이다 보니 여러 조건문을 작성해야했다.

약수를 구하는 방법으로 알고리즘을 풀어낼 수 있었다.


문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120836

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr