My Space

반응형

코드(HashSet 이용)
public int solution(int n, int[] lost, int[] reserve) {		
		// 총인원 - 체육복 분실 인원수
		int answer = n-lost.length;
		// 카운트 변수 선언
		int cnt = 0;
		HashSet<Integer> hs = new HashSet<Integer>();
		for(int i : reserve) {
			hs.add(i);
		}
		// 여분체육복 가져온 사람이 분실했을 경우
		for(int i=0; i<lost.length; i++) {
			if(hs.contains(lost[i])) {
				hs.remove(lost[i]);
				lost[i] = -1;
			}
		}		
		for(int i=0; i<lost.length; i++) {
			if(lost[i] == -1) {
				cnt++;
			} else if(hs.contains(lost[i]+1)) {
				cnt++;
				hs.remove(lost[i]+1);
			} else if(hs.contains(lost[i]-1)) {
				cnt++;
				hs.remove(lost[i]-1);
			}
		}		
		return answer+cnt; 
	}	
		public static void main(String[] args) {
		Solutaion3 sol = new Solutaion3();		
		int[] lost = {1,2,3};
		int[] reserve = {2,3,4};		
		System.out.println(sol.solution(5, lost ,reserve));
	}
설명

여분 체육복이 있는 학생은 다른 사람을 빌려주는 것이 아닌 본인이 입는 다는 것을 신경써야한다.

따라서, HashSet를 선언해서 lost와 reserve에서 중복되는 값을 제거하고 보관하고, 

lost학생 중 여분이 있는 학생은 -1로 변경해준다. (이웃하는 학생을 빌려줄 수 있기때문에 제외 시키기위해 -1로 변경)

 

풀이(초기 풀이법) 
        int cnt = 0;		
		// 중복되는 리스트 저장
		ArrayList<Integer> list = new ArrayList<Integer>();		
		// 처음에 중복되는 배열제거
		for(int i=0; i<lost.length; i++) {
			for(int j=0; j<reserve.length; j++) {
				if(lost[i] == reserve[j]) {
					list.add(lost[i]);
					cnt++;
					break;
				}
			}
		}
		//System.out.println("cnt : "+cnt + "|| "+list);
        //중복을 제거한 분실, 여분 체육복 학생 선언
		int[] new_lost = new int[lost.length-cnt];
		int[] new_reserve = new int[reserve.length-cnt];		
		cnt = 0;			
        // 중복값이 제거된 분실학생 입력
		for(int i : lost) {	
			int num = 0;
			for(int j : list) {
				if(i == j) {
					num++;
					break;
				}
			}
			if(num == 0) {
				new_lost[cnt] = i;
				cnt++;
			}
		}
		cnt = 0;
        // 중복값이 제거된 여분학생 입력
		for(int i : reserve) {	
			int num = 0;
			for(int j : list) {	
				if(i == j) {
					num++;
					break;
				}
			}
			if(num == 0) {
				new_reserve[cnt] = i;
				cnt++;
			}
		}
		cnt = 0;
		//분실 학생
		for(int i=0; i<new_lost.length; i++) {
			//여분 가져온 학생
			for(int j=0; j<new_reserve.length; j++) {
				if(new_lost[i] == new_reserve[j]+1 || new_lost[i] == new_reserve[j]-1) {
					new_reserve[j] = -1;
					cnt++;
					break;
				}
			}
		}		
        // 전체학생-분실학생+중복학생+빌린학생수
		return n-lost.length+list.size()+cnt;

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading