728x90
반응형

1. 선택 정렬

▶ 아래의 선택 정렬 코드를 보완한 내용

 

[자바] 선택정렬 보완

 

deliciouscode.tistory.com

 

 

▶ 코드

		//선택정렬
		int[] arr={9,6,7,3,5};	//정렬할 배열
		int index, min, temp;	//최솟값이 들어있는 인덱스 변수, 최솟값을 비교할 변수, 값을 변경할 때 사용할 변수

		for(int i=0;i<arr.length-1;i++){ //배열의 수가 5개이면 4번만 비교한다.
			index=i;	//0
			min=arr[i];	//9
			for(int j=i+1;j<arr.length;j++){	//선택 정렬은 맨 앞에 최솟값을 넣기때문에 i+1부터 비교하면 된다.
				if(min>arr[j]){	//9>6?
					index=j;	//index=1
					min=arr[j];	//min=6
				}
			}

			//최솟값이 들어있는 인덱스와 자리 변경
			if(i != index){
				temp=arr[i];
				arr[i]=arr[index];
				arr[index]=temp;
			}
		}

		System.out.println(Arrays.toString(arr));//배열 출력
  • 배열을 정렬하기 위해서는 두 개씩 값을 비교한다. 그래서 배열의 갯수가 5개면 5번이 아니라 4번만 비교하면 된다. (0,1,2,3=> 4번)
  • arr 배열의 갯수가 5개일 때, arr.length의 값은 5이다. 하지만 배열의 맨 끝이 arr2[5]가 아닌 arr2[4]이기 때문에 i는 arr.length-1 의 값까지만 비교한다.
  • 값을 비교하기 위해 첫 번째 인덱스의 값이 최솟값이라고 가정한다. 만약 최솟값을 0으로 설정하면 배열의 모든 값이 음수일 때 배열에 없는 0이 최솟값이 된다. 그렇기 때문에 배열의 값으로 설정한다.
  • 최솟값을 arr[0]으로 설정하면 j는 1부터 비교하면 된다. 이 때, 선택 정렬은 맨 앞에 최솟값을 정렬하기 때문에 j는 i+1의 값부터 시작하는 것으로 설정한다.
  • 설정한 최솟값보다 작은 arr[j]값이 나타난다면 arr[j]이 최솟값이 되고, 맨 끝의 배열까지 비교를 반복한다.
  • 제일 작은 값이 들어있는 인덱스 값과 i 번째 값을 temp 변수를 이용하여 교환한다. 만약 비교가 끝난 뒤에도 index값이 처음 설정한 최솟값 인덱스인 i와 같으면 값을 변경하지 않아도 된다.
  • 끝까지 반복하면 정렬이 완료된다.

 

 

▶ 출력 결과

[3, 5, 6, 7, 9]

 

 

 

2. 버블 정렬

▶ 코드

		//버블 정렬
		int[] arr2={9,6,7,3,5};	//정렬할 배열
		int temp2=0;
		
		for(int i=arr2.length-1;i>0;i--){	//버블 정렬은 최댓값을 맨 뒤에 저장하기 때문에 배열의 맨 뒤를 기준으로 잡고 length-1부터 시작한다. 배열의 수가 5개이면 4번만 비교한다. (4,3,2,1 => 4번)
			for(int j=0;j<i;j++){	//맨 뒤에 최댓값을 넣기 때문에 정렬된 배열 전까지만 비교한다.
				if(arr2[j]>arr2[j+1]){	//인접한 배열인 j번째 배열과 j+1번째 배열을 비교한다.
					temp2=arr2[j];
					arr2[j]=arr2[j+1];
					arr2[j+1]=temp2;
				}
			}
		}
		
		System.out.println(Arrays.toString(arr2));//배열 출력

 

  • 배열을 정렬하기 위해서는 두 개씩 값을 비교한다. 그래서 배열의 갯수가 5개면 5번이 아니라 4번만 비교하면 된다. (4,3,2,1 => 4번)
  • 버블 정렬은 최댓값을 맨 뒤에 저장하기 때문에 배열의 맨 뒤를 기준으로 length-1부터 시작한다. arr 배열의 갯수가 5개일 때, arr.length의 값은 5이다. 하지만 배열의 맨 끝이 arr2[5]가 아닌 arr2[4]이기 때문에 i의 값은 length-1부터 시작한다.
  • 버블정렬은 인접한 arr2[j]와 arr2[j+1]의 값을 반복하여 비교하고 제일 큰 값을 마지막 배열에 정렬한다. 이미 정렬된 최댓값은 비교하지 않기 위해 j<i의 값까지만 비교한다. 만약 j가 i 번째까지 비교를 하게 된다면 i가 4일 때 arr2[j+1]이 arr2[5]가 되기 때문에 오류가 발생한다. 
  • 서로 인접한 값을 비교하여 정렬한다. 왼쪽에 있는 arr2[j]의 값이 크다면 오른쪽에 있는 arr2[j+1]과 값을 변경한다.
  • 끝까지 반복하면 정렬이 완료된다.

 

 

		//위의 코드와 같은 버블 정렬 코드이다.
		for(int i=0;i<arr2.length-1;i++){	//배열의 수가 5개이면 4번만 비교한다.
			for(int j=0;j<(arr2.length-1)-i;j++){	//맨 뒤에 최댓값을 넣기 때문에 -i를 해서 정렬된 값은 비교하지 않는다.
				if(arr2[j]>arr2[j+1]){
					temp=arr2[j];
					arr2[j]=arr2[j+1];
					arr2[j+1]=temp;
				}
			}
		}
  • 위의 버블 정렬 코드와 같은 버블 정렬 코드이다.
  • 맨 뒤에 최댓값을 넣기 때문에 값을 비교하여 정렬하는 j 반복문에서 j<(마지막 배열의 인덱스)-i를 해서 정렬된 값은 비교하지 않는다.

 

 

▶ 출력 결과

[3, 5, 6, 7, 9]

 

728x90
반응형
728x90
반응형

문제

  • Random 함수를 이용한다.
  • 정수형 변수 num에 랜덤 값을 넣는다.
  • 숫자를 입력하여 num의 값과 같은지 비교한다. 입력한 숫자가 num의 값보다 작으면 UP, 크면 DOWN을 출력한다.
  • 사용자가 입력한 값과 num의 값이 같으면 몇 번의 입력만에 정답을 입력했는지 출력한다.

 

 

 

코드

		Random rand = new Random();
		Scanner scan = new Scanner(System.in);

		int num = rand.nextInt(100)+1;	//랜덤 값:1~100
		
		for(int count=1;;count++){ //count 변수를 이용해 몇 번만에 맞추는지 확인
			//숫자 입력
			System.out.printf("1부터 100사이의 랜덤한 숫자를 입력하세요 >> ");
			int temp = scan.nextInt();

			//정답 판별
			if(temp==num){
				System.out.printf("정답입니다! %d번 만에 맞추셨습니다.\n",count);
				break;	//반복 종료
			}
			else if(temp<num)
				System.out.println("UP");
			else if(temp>num)
				System.out.println("DOWN");
			
			System.out.println();//줄바꿈
		}

		scan.close();

 

 

 

출력 결과

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 50
UP

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 75
UP

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 88
UP

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 95
DOWN

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 92
DOWN

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 90
UP

1부터 100사이의 랜덤한 숫자를 입력하세요 >> 91
정답입니다! 7번 만에 맞추셨습니다.

 

728x90
반응형
728x90
반응형

문제

  • Random 함수를 이용한다.
  • 무한 반복문을 이용한다.
  • 몇 문제를 풀 것인지 입력 받고, 입력 받은 숫자만큼 문제를 출력한다.
  • 정수형 변수 num1과 num2에 랜덤 값을 넣는다.
  • num1의 값과 num2의 값을 곱한 결과와 사용자가 입력한 값이 같은지 비교하여 정답과 오답을 출력한다.
  • 모든 문제가 종료된 뒤 0을 입력하면 break문을 이용해 무한 반복문을 입력을 종료한다. 0 외의 숫자를 입력하면 다시 문제 수를 입력 받는다.

 

 

 

코드

		//곱셈 문제
		Random rand = new Random();	//랜덤 값
		Scanner scan = new Scanner(System.in);	//입력

		int first=1;//문제를 구분하는 선을 출력하기 위해 선언
		while(true){
			if(first!=1)//문제를 구분하기 위해 출력. 문제 풀이를 두 번 이상 반복할 때 출력
				System.out.println("-------------------------------------------------------------------");
			first=0;
			
			System.out.print("문제 수를 입력하시오 >> ");
			int work = scan.nextInt();
			System.out.println("총 "+work+"문제가 출력됩니다.\n");
			
			for(int i=1;i<=work;i++){
				//곱셈 값 만들기
				int num1 = rand.nextInt(8)+2;	// 2단부터 9단까지 출력	
				int num2 = rand.nextInt(9)+1;	// 1부터 9까지 출력
				int multiplication = num1*num2;	//곱셈의 정답을 저장하는 변수

				System.out.printf("%d번 문제:%d*%d=",i,num1,num2);	//랜덤 문제 출력

				//정답 맞추기
				int check = scan.nextInt();	//입력한 값이 정답이 맞는지 확인하는 변수

				if(check==multiplication)
					System.out.println("정답입니다.");
				else
					System.out.printf("오답입니다.정답은 %d입니다.\n",multiplication);
				System.out.println(); //한 문제가 끝나면 줄바꿈
			}
			
			//문제 종료
			int question = 1;
			System.out.print("계속해서 문제를 푸시겠습니까? 종료를 원하시면 0을 입력해주세요. >> ");
			question =scan.nextInt();

			if(question== 0)
				break;	//무한 반복 종료

		}
		System.out.println("수고하셨습니다. 문제 풀이가 종료되었습니다.");
        
		scan.close();

 

 

출력 결과

문제 수를 입력하시오 >> 2
총 2문제가 출력됩니다.

1번 문제:7*2=14
정답입니다.

2번 문제:4*5=22
오답입니다.정답은 20입니다.

계속해서 문제를 푸시겠습니까? 종료를 원하시면 0을 입력해주세요. >> 1
-------------------------------------------------------------------
문제 수를 입력하시오 >> 1
총 1문제가 출력됩니다.

1번 문제:2*8=16
정답입니다.

계속해서 문제를 푸시겠습니까? 종료를 원하시면 0을 입력해주세요. >> 0
수고하셨습니다. 문제 풀이가 종료되었습니다.

 

728x90
반응형
728x90
반응형

문제

영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.

입력 출력
aBcDeFg AbCdEfG
  • str은 알파벳으로 이루어진 문자열입니다.

 

 

 

코드

		String str="aBcDeFg";
		String str2="";
		
		System.out.println("변경 전:"+str);
		
		//아스키 코드표를 기준으로 대문자의 값과 소문자의 값이 32가 차이가 나는 점을 이용한다
		for(char c : str.toCharArray()){
			if(c>=65&&c<=90){ //대문자를 소문자로 변경
				str2+=(char)(c+32);
			}
			else if(c>=97&&c<=122){ //소문자를 대문자로 변경
				str2+=(char)(c-32);
			}
		}//for_end
		
		System.out.println("변경 후:"+str2);

 

 

 

출력 결과

변경 전:aBcDeFg
변경 후:AbCdEfG

 

 

728x90
반응형

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

[JAVA] 약수의 합  (0) 2023.05.29
[JAVA] 옹알이  (0) 2023.05.28
[JAVA] 삼총사  (0) 2023.05.24
[JAVA] 알파벳 대소문자 변환 (아스키 코드표 이용)  (0) 2023.05.23
[JAVA] 금액 표시하기 (돈 단위 표시)  (0) 2023.05.23
728x90
반응형

문제

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다.

예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

입력 출력
[-2, 3, 0, 2, -5] 2
[-3, -2, -1, 0, 1, 2, 3] 5
[-1, 1, -1, 1] 0

 

▶ 제한사항

  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.
  • [-3, -2, -1, 0, 1, 2, 3]에서 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.

 

 

 

Solution 코드

class Solution {
	public int solution(int[] number) {
		int result=0;	//삼총사가 되는 값 출력

		//삼총사 값 구하기
		for(int i=0;i<number.length;i++){//0번째 배열을 선택하여 비교

			for(int j=i+1;j<number.length;j++){//i번째 배열 바로 옆의 값부터 선택
	
				for(int k=j+1;k<number.length;k++){//j번째 배열 바로 옆의 값부터 선택하여 반복
					if((number[i] + number[j] + number[k]) == 0){
						result++;	//세 값을 합쳤을 때 0이 나오면 삼총사!!
					}
				}//for_k_end
			}//for_j_end
		}//for_i_end

		 //삼총사가 0명일 때 출력
		if(result==0)
			System.out.println("삼총사가 될 수 있는 방법이 없습니다.");

		return result;	//삼총사 값 리턴
	}
}//Solution_end

 

 

 

main 코드

▶ 작성한  solution 함수를 이용하여 main문에서 출력해 보자.

		Solution s = new Solution();
        
		int[] number1={-2,3,0,2,-5};
		int[] number2={-3,-2,-1,0,1,2,3};
		int[] number3={-1,1,-1,1};
		
		//삼총사 값 출력
		int num = s.solution(number1);
		System.out.println("삼총사 수:"+num);
		
		num = s.solution(number2);
		System.out.println("삼총사 수:"+num);
		
		num = s.solution(number3);
		System.out.println("삼총사 수:"+num);

 

 

 

출력 결과

삼총사 수:2
삼총사 수:5
삼총사가 될 수 있는 방법이 없습니다.
삼총사 수:0
728x90
반응형

+ Recent posts