728x90
반응형

문제

  • 배열 {5,3,10,2,9,8}을 오름차순으로 정렬하시오.
  • 단, 홀수를 먼저 정렬한 뒤에 짝수를 정렬하시오. →   {3, 5, 9, 2, 8, 10} 
  • 홀수, 짝수의 개수는 같다고 가정한다.
  • Arrays.sort() 사용이 가능하다.

 

 

1.  값이 저장된 배열 하나로 정렬

▶ 코드 순서

1) Arrays.sort()를 이용해 정렬 

		//오름차순 정렬
		Arrays.sort(arr);

		System.out.print("오름차순 정렬:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println("\n");//줄바꿈

 

2) 홀수 정렬

		//홀수 정렬. 정렬되어 있기 때문에 홀수 값을 oddNumber를 이용해 순서대로 앞으로 옮김
		for(int i=0;i<arr.length;i++){
			if(arr[i]%2!=0){
				temp=arr[i];
				arr[i]=arr[oddNumber];
				arr[oddNumber]=temp;
				oddNumber++;
			}//홀수일 때, 정렬한 값을 앞으로 바꾼다.
		}
  • 이미 배열은 오름차순으로 정렬이 되어있기 때문에 홀수 값을 순서대로 찾아 앞 쪽으로 옮기면 홀수 값이 정렬된다.

 

3) 짝수 정렬 (뒷 배열에 대해 버블 정렬)

		//짝수 정렬. 홀수 정렬을 하면서 짝수의 값은 섞여 있을 수 있기 때문에 버블 정렬 이용
		for(int i=arr.length-1;i>evenNumber;i--){
			for(int j=evenNumber;j<i;j++){
				if(arr[j]>arr[j+1]){	//앞에 있는 값이 크면 값 정렬
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
  • 무작위로 홀수 값과 자리를 변경했기 때문에 짝수 부분은 정렬이 된 상태가 아니다.
  • 짝수 부분의 정렬을 위해 버블 정렬을 이용했다.
  • 홀수와 짝수의 개수가 같다고 가정하여, 배열의 절반 부분을 담은 변수 evenNumber부터 정렬을 한다. (evenNumber는 마지막 OddNumber의 값과 같으나 가독성을 위해 변수를 만들었다.)

 

 

▶ 전체 코드

		System.out.println("문제 3. 오름차순 정렬. 단, 홀수인 값을 먼저 정렬하고 짝수인 값을 나중에 정렬하시오.\n");

		int[] arr= {5,3,10,2,9,8};
		int temp;
		int oddNumber=0;
		int evenNumber=arr.length/2;	//홀수와 짝수의 개수는 같다고 가정

		System.out.print("정렬 전:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println("\n");//줄바꿈
		
		
		//오름차순 정렬
		Arrays.sort(arr);

		System.out.print("오름차순 정렬:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println("\n");//줄바꿈

		
		//홀수 정렬. 정렬되어 있기 때문에 홀수 값을 oddNumber를 이용해 순서대로 앞으로 옮김
		for(int i=0;i<arr.length;i++){
			if(arr[i]%2!=0){
				temp=arr[i];
				arr[i]=arr[oddNumber];
				arr[oddNumber]=temp;
				oddNumber++;
			}//홀수일 때, 정렬한 값을 앞으로 바꾼다.
		}

		//짝수 정렬. 홀수 정렬을 하면서 짝수의 값은 섞여 있을 수 있기 때문에 버블 정렬 이용
		for(int i=arr.length-1;i>evenNumber;i--){
			for(int j=evenNumber;j<i;j++){
				if(arr[j]>arr[j+1]){	//앞에 있는 값이 크면 값 정렬
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}

		//출력
		System.out.print("홀수->짝수 순으로 정렬:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}

 

 

▶ 출력 결과

문제 3. 오름차순 정렬. 단, 홀수인 값을 먼저 정렬하고 짝수인 값을 나중에 정렬하시오.

정렬 전:5 3 10 2 9 8 

오름차순 정렬:2 3 5 8 9 10 

홀수->짝수 순으로 정렬:3 5 9 2 8 10

 

 

 

2.  빈 배열을 이용해 정렬

▶ 코드

		int arr[] = {5, 3, 10, 2, 9, 8};
		int arr2[] = new int[arr.length];
		int index = 0;
		
		//배열 정렬
		Arrays.sort(arr);
		System.out.println("배열 정렬:"+Arrays.toString(arr)); //배열 출력
		
		//홀수 입력
		for(int i=0; i<arr.length; i++){
			if(arr[i]%2 != 0){
				arr2[index++] = arr[i]; // {3,5,9,0,0,0}
			}
		}
		
		//짝수 입력
		for(int i=0; i<arr.length; i++){
			if(arr[i]%2 == 0){
				arr2[index++] = arr[i]; // {3,5,9,2,8,10}
			}
		}
		
		//출력
		System.out.println("홀수->짝수 순으로 정렬:"+Arrays.toString(arr2));

 

 

▶ 출력 결과

배열 정렬:[2, 3, 5, 8, 9, 10]
홀수->짝수 순으로 정렬:[3, 5, 9, 2, 8, 10]

 

 

728x90
반응형

'HRD_훈련 > 실습' 카테고리의 다른 글

[JAVA] 심화 문제 풀이 (13일차)  (0) 2023.05.31
[JAVA] 심화 문제 풀이 (12일차)  (0) 2023.05.31
[JAVA] 선택 정렬 보완  (0) 2023.05.28
[JAVA] 선택 정렬과 버블 정렬  (1) 2023.05.25
[JAVA] UP&DOWN 답 맞추기  (0) 2023.05.25
728x90
반응형

문제

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

x return
10 true
12 true
11 false
13 false

▶ 제한사항

  • x는 1 이상, 10000 이하인 정수입니다.

 

 

Solution 코드

class Solution {
    public boolean solution(int x) {
        int harshadNumber=0;
        int temp=x;
        
        //자릿수 합 구하기
        while(temp!=0){
            harshadNumber+=temp%10;
            temp/=10;
        }
        
        if(x%harshadNumber==0)
            return true;
        else
            return false;
    }
}
  • 자릿수의 합을 구하기 위해서는 x를 10으로 나눈 나머지 값을 harshadNumber 변수에 저장하고, x의 값을 10으로 나눈 값으로 나머지 값을 구하는 것을 반복한다. 만약 18이라면 18을 10으로 나눈 나머지인 8이 저장되고, 10으로 나눈 값인 1으로 연산을 반복한다. 1을 10으로 나눈 나머지인 1을 더하면 자릿수 합은 9이다.
  • x를 자릿수 합을 모두 더한 harshadNumber 값으 나누었을 때의 나머지가 0이라면 harshadNumber는 하샤드 수이다. 18을 9로 나누었을 때의 나머지 값은 0이기 때문에 하샤드 수임을 의미한다. 
728x90
반응형
728x90
반응형

문제

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

n return
121 144
3 -1

 

▶ 제한사항

  • n은 1이상, 50000000000000 이하인 양의 정수입니다.
  • 121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
  • 3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

 

 

Solution 코드

class Solution {
    public long solution(long n) {
        long answer=0;
        
        for(long i=1;i<=(n/2)+1;i++){
            if(n==(i*i)){
                answer=i+1;
                break;
            }
        }
        if(answer==0)
            return -1L;
        else
            return (answer*answer);
    }
}
  • n은 1이상, 50000000000000 이하인 양의 정수이기 때문에 long형을 이용한다.
  • 제곱근은 n의 절반만 비교하면 되기 때문에 n번 비교할 필요가 없다. 만약 n번 비교하도록 반복문을 설정한다면 n이 50000000000000일 때 50000000000000번 반복하게 되어 많은 시간이 소요된다.
  • 제곱근을 구하는 반복문은 (n/2)+1까지 반복한다. 만약 n이 1일 때 1은 1의 제곱근인데 n/2를 하게 되면 i<0으로 반복문의 조건이 성립하지 않아 제곱근을 구할 수 없기 때문에 +1까지 반복한다.
  • 만약 n값과 i*i의 값이 같다면 i는 n의 제곱근이다. i의 값을 구한다면 i+1의 제곱을 리턴하고 n의 제곱근을 찾지 못한다면 -1을 리턴한다.
728x90
반응형
728x90
반응형

아래 코드를 보완한 코드

 

[JAVA] 문자열을 정수로 바꾸기 보완

보완 전 코드 [JAVA] 문자열을 정수로 바꾸기 문제 문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요. 예를 들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩

deliciouscode.tistory.com

 

 

 

문제

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

예를 들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다. str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

 

▶ 제한사항

  • s의 길이는 1 이상 5이하입니다.
  • s의 맨앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져있습니다.
  • s는 "0"으로 시작하지 않습니다.

 

 

 

Solution 코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        int len = s.length();//단위를 알기 위한 변수
        int i=0;
        
        if(s.charAt(i)=='-' || s.charAt(i)=='+'){
            len--;
            i=1;
        }
        
        for(;i<s.length();i++){
            int c = Character.getNumericValue(s.charAt(i));
            
            int temp=c;
            for(int j=1;j<len;j++)
            	temp*=10;
            
            answer+=temp;
            len--;
        }
        
        if(s.charAt(0)=='-')
            return -answer;  
        else
            return answer;
    }
}
  • 문자열 s의 맨 앞의 문자가 '-'이거나 '+'일 때 맨 첫 번째 숫자는 1 번째부터 시작한다.(i=1) 또한, s가 "-1000"일 때 s.length();의 값은 5이지만 -는 숫자로 포함시키지 않기 때문에 len의 값에 1을 빼 4자리임을 알린다.
  •  모든 문자열을 한 글자씩 문자화 시키고 자릿수만큼 10을 반복하여 곱한 값을 answer 변수에 모두 더해 리턴한다. 만약 "1000" 일 때 첫 번째 글자는 1이 아닌 1000으로 저장되야 한다. 이 때, len을 이용하여 자릿수만큼 10을 반복하여 곱하면 1이 아닌 1000으로 저장할 수 있다.
728x90
반응형

'문제 > JAVA' 카테고리의 다른 글

[JAVA] 하샤드 수  (0) 2023.05.30
[JAVA] 정수 제곱근 판별  (0) 2023.05.30
[JAVA] 문자열 내 p와 y의 개수  (0) 2023.05.29
[JAVA] 자연수 뒤집어 배열로 만들기  (0) 2023.05.29
[JAVA] x만큼 간격이 있는 n개의 숫자  (0) 2023.05.29
728x90
반응형

문제

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 갯수를 비교할 때 대문자와 소문자는 구별하지 않습니다. 예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

 

s answer
"pPoooyY" true
"Pyy" false

 

▶ 제한사항

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

 

 

Solution 코드

class Solution {
    boolean solution(String s) {
        int count=0;
        s = s.toLowerCase(); //대소문자를 구분하지 않기 때문에 가독성을 위해 소문자화
        
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(c=='p')
                count++;
            else if(c=='y')
                count--;
        }
        
        if(count == 0)
            return true;
        
        else
            return false;
    }
}
  • 갯수를 비교할 때 대문자와 소문자는 구별하지 않기 때문에 문자열 s의 값을 소문자나 대문자로 변경하여 통일한다. 변경하지 않아도 상관없지만 if(c=='p' || c=='P') 와 같이 코드가 복잡해지기 때문에 가독성을 위해 변경해주었다.
  • 문자열을 한 글자씩 문자화해서 'p' 또는 'y'인지 확인한다. 문자가 p와 같다면 count에 1을 더하고, y와 같다면 1을 빼준다.
  • 문자열 s에 p와 y의 갯수가 같다면 count의 값은 0이 된다. count 값이 0이 아니라면 p와 y의 갯수가 같지 않다는 것을 의미한다.
728x90
반응형

'문제 > JAVA' 카테고리의 다른 글

[JAVA] 정수 제곱근 판별  (0) 2023.05.30
[JAVA] 문자열을 정수로 바꾸기  (2) 2023.05.29
[JAVA] 자연수 뒤집어 배열로 만들기  (0) 2023.05.29
[JAVA] x만큼 간격이 있는 n개의 숫자  (0) 2023.05.29
[JAVA] 약수의 합  (0) 2023.05.29

+ Recent posts