[백준] 2750 : 수 정렬하기 - JAVA

Benjamin·2022년 11월 12일
0

BAEKJOON

목록 보기
11/70

슈도코드

solution() {
루프 횟수 체크할 check 변수 선언
answer배열 선언
  while(check >0) {
    for(N-1만큼 반복) {
        현재 배열의 index값 보다 한 칸 오른쪽에있는 값이 더 작으면 swap
    }
    check--;
  }
}

main() {
  N선언 및 입력받기
  intArr선언

  for(N만큼 반복) {
      수 입력받아 intArr에 넣기
  }
  solution 결과를 intArr에 넣기
  for(N만큼 반복) {
      인덱스로 각 원소 출력 
  }
}

Troubleshooting

문제

import java.util.Scanner;

public class Main {
	public static int[] solution(int N, int[] intArr) {
		int[] answer = new int[N];
		
		int check = N;
		while(check>0) {
			for(int i=0; i<N-1; i++) {
				if(intArr[i] > intArr[i+1]) {
					int temp = intArr[i+1];
					intArr[i+1] = intArr[i];
					intArr[i] = temp;
				}
			}
			check--;
		}
		answer = intArr;
		return answer;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] intArr = new int[N];
		for(int index = 0; index < N ; index++) {
			intArr[index] = sc.nextInt();
		}
		System.out.println(solution(N, intArr));
	}
}

처음엔 이처럼 코드를 짰는데, 아래처럼 출력이 이상하게 나왔다.

원인

배열 변수의 이름은 배열의 시작 주소인데, 출력부분에서 저렇게 로직을 짜서 배열의 시작 주소가 출력된것으로 보인다.

해결

solution호출의 리턴값을 따로 받아서, 출력코드에서는 []를 사용해 인덱스로 각 원소에 접근했다.(for문 이용)

제출코드

import java.util.Scanner;

public class Main {
	public static int[] solution(int N, int[] intArr) {
		int[] answer = new int[N];
		
		int check = N;
		while(check>0) {
			for(int i=0; i<N-1; i++) {
				if(intArr[i] > intArr[i+1]) {
					int temp = intArr[i+1];
					intArr[i+1] = intArr[i];
					intArr[i] = temp;
				}
			}
			check--;
		}
		answer = intArr;
		return answer;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] intArr = new int[N];
		for(int index = 0; index < N ; index++) {
			intArr[index] = sc.nextInt();
		}
		intArr = solution(N, intArr);
		for(int p=0; p<N; p++) {
			System.out.println(intArr[p]);
		}
	}
}

공부한 내용

  • 버블정렬 : 루프를 언제 마무리할건지도 체크해주어야한다.(위 코드의 check변수)
  • 오름차순정렬을 가장 빠르게하는방법은 자바에서는 sort()를 사용하는것이다.

다른 방법

import java.util.Scanner;

public class Main {
	public static int[] solution(int N, int[] intArr) {
		int[] answer = new int[N];
		
		int check = N;
		for(int i=0; i<N-1; i++) {
			for(int j=0; j<N-1-i; j++) {
				if(intArr[j] > intArr[j+1]) {
					int temp = intArr[j];
					intArr[j] = intArr[j+1];
					intArr[j+1] = temp;
				}
			}
		}
		answer = intArr;
		return answer;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] intArr = new int[N];
		for(int index = 0; index < N ; index++) {
			intArr[index] = sc.nextInt();
		}
		intArr = solution(N, intArr);
		for(int p=0; p<N; p++) {
			System.out.println(intArr[p]);
		}
	}
}


내 방법의 문제점

  • 루프를 돌면 가장 뒷 원소가 하나씩 정렬되기때문에 루프 횟수가 늘어남에따라 체크하지 않아도 되는 뒷 원소가 추가되는데, 나의 방법은 정렬된 원소도 for문 속에서 계속 정렬하고있다는것이다.
    -> 불필요한 작업 수행
    : 나는 while(check>0)으로 루프를 언제 종료할지만 체크하고있었음.

배울점

  • 나는 loop는 while, swap은 for문을 사용해서 진행했는데, 다른 코드에서는 둘 다 for문으로 로직을 구현했다
    : loop는 for(0~N-1)만큼 반복, swap은 for(0~N-1-j)만큼 반복해서 이중 for문으로 구현

0개의 댓글