우당탕탕 개발일지

[SWEA] 6190. 정곤이의 단조 증가하는 수(Java, D3) 본문

코테/SW Expert Academy

[SWEA] 6190. 정곤이의 단조 증가하는 수(Java, D3)

ujin302 2024. 5. 18. 18:40
반응형

문제

주어진 숫자에서 2개를 골라 곱한다

곱한 값 중 단조인 것 중에 가장 큰 값을 구하여라. 

 

입출력 예

 

풀이

( 처음에는 문제를 잘못 읽어서 주어진 문자 중에 단조를 찾는줄 알았다... ㅋㅋㅋ )

 

[ 과정 ]

우선순위 큐 : 내림차순 정렬 

 

1. 두 수의 곱

2. 해당 곱이 단조인지 판별

  1. 단조의 경우 우선순위 큐에 저장
  2. 그렇지 않을 경우 작업하지 않음

3. 결과 값 출력

  1. 우선순위 큐 중 최댓값 출력
  2. 우선순위 큐가 비어있을 경우, -1 반환 

 

while문에서는 과정 1,2번에 해당한다. 

과정 1

2 4 7 10이 주어졌다고 가정하겠다. 

checkNum에는 2 * 4, 2* 7, 2* 10 순서로 담기게 된다. 

 

이렇게 모든 경우의 곱을 확인한다. 

 

과정 2

과정 1에서 곱한 값 cheackNum이 단조인지 판별한다. 

앞의 숫자가 클 경우 단조가 아닌 것으로 판단한다. 

boole형태의 isDanjo 변수를 사용하여 단조인지 판별한다. 

* 단조일 경우 isDanjo = true

 

단조일 경우 우선순위 큐에 저장


과정 3

우선순위 큐가 비어있지 않을 경우, 단조가 존재한다고 판단한다.

따라서 첫번째 요소를 가져와 출력한다.

 

우선순위 큐가 비어있을 경우, -1을 출력한다. 

 

 

코드

		Scanner sc = new Scanner(System.in);
		int t=sc.nextInt();
		
		for(int tc =1; tc<1+t; tc++) {
			PriorityQueue<Integer> pqNum = new PriorityQueue<>((o1, o2) -> o2-o1);

			int result = 0;
			int n = sc.nextInt(); // 테스트 케이스 번호 
			int[] arr = new int[n];
			
			// 입력값 저장 
			for(int i=0; i<n; i++) {
				arr[i] = sc.nextInt();
			}
			
			int i = 0;
			while(i < n) {
				int nowNum = arr[i];
				i++;
				
				for(int a=i; a<n; a++) {
					boolean isDanjo = true;
					int checkNum = nowNum * arr[a];
					char[] charNum = (checkNum+"").toCharArray();
					for(int j=0; j<charNum.length-1; j++) {
						if(charNum[j] > charNum[j+1]) {
							// 단조 아님 
							isDanjo = false;
							break;
						}
					}
					// 단조 맞을때만 곱 저장 
					if(isDanjo) pqNum.add(checkNum); 
				}
			}
			
			if(!pqNum.isEmpty())result = pqNum.peek();
			else result = -1;
			
			System.out.println("#"+tc+ " " + result );
		}

 

 

SWEA 문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWcPjEuKAFgDFAU4

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

반응형