본문 바로가기
후기 및 회고/코딩테스트 리뷰

[프로그래머스(programmers)] (2021 와디즈 코딩챌린지) 3번 : we make CODE #better

by 광진구뚝배기 2021. 8. 26.

알고리즘 문제 풀이 / 프로그래머스 (programmers)  - 코딩테스트 3번

 

 

와디즈 코딩챌린지의 마지막 문제인 3번 해설을 해보도록 하겠다. 3번 문항은 와디즈 문제들 중 푸는 시간이 가장 오래 걸렸던 문제다. 간단한 것 같으면서도 복잡했다.

 

 

문제 설명

 

저작권의 문제로 문제설명은 생략하겠습니다.

 

문제 풀이

 

arr을 중복없이 정렬한 list를 생성한다.

초기설정으로 0이 있을 때와 없을 때를 구분해 resArr의 값을 갱신해준다.

check 변수를 설정해 어디까지 바꿀지 판단한다.

 

 

최소한의 경우로 해야하므로 가장 작은 수로 전체를 맞춰나가야 하는것이 핵심이다. 그래서 나는 list에 어떤 숫자로 갱신해나가야하는지 정렬해두었다. 그 후 초기값인 0이나 최소값에서 부터 arr배열이 되기 까지의 과정을 나타낼 resArr 배열을 선언했다. arr이 정렬된 배열이 아니므로 같은 숫자더라도 한 번에 다 바꿀 수 있는것 만이 아니다. 따라서 어디까지 바꿀 수 있는지 찾기 위해 check 변수를 선언했다.

 

public static int solution(int[] arr) {
	int answer = 0;
	ArrayList<Integer> list = new ArrayList<>();
	for (int i : arr) {
		if(!list.contains(i)) {
			list.add(i);			
		}
	}
	Collections.sort(list);

	int[] resArr = new int[arr.length];
	int now = 0;
	int size = resArr.length;

	if(list.get(now) != 0) {
		for(int i = 0; i < size; i++) {
			resArr[i] = list.get(now);
		}
		answer++;
	}
	now++;

	int start = 0;
	int count = 0;
	while(now < list.size()) {
		int check = 0;
		for(int i = start; i < size; i++) {
			if(!(check == 1 && arr[i] > list.get(now)) && arr[i] >= list.get(now)) {
				resArr[i] = list.get(now);
				if(i+1 == size) answer++;
				check = 2;
			}else if(check == 2 ){
				answer++;
				check = 1;		
			}
				
			if(i+1 == size) {
				start = 0;
				now++;
			}
		}			
	}

	return answer;
}
반응형

댓글