배열과 for문을 이용한 문제(중복제거)

이수보🧑🏻‍💻·2021년 11월 4일
1

문제

목록 보기
1/6

그 동안 우리가 배운 것으로 간단한 문제를 풀어보자.
내 블로그에 처음 올리는 문제인데 이 문제는 나도 비전공자로써 많이 어려웠던 문제이다.
하지만 한 시간 고민 끝에 힘들게 문제를 풀었던 기억이 있다.

문제를 풀 때 내가 추천하는 방법은 최~대한 혼자만의 시간을 가지고 문제를 푸는 것을 추천한다.
옆에서 참견하는 이가 있거나 알려주고 싶어하는 성격의 친구들이 있다면 잠시 카페로 가 혼자만의 시간을 가지는 것을 추천한다. (도망치라는 말...)
남이 도와준다고 그 문제가 내 것이 되는게 아니기 때문이다.

혼자 정~말 못풀겠다면 인터넷의 도움을 받아도 좋다. 하지만 최대 1시간 30분 정도 혹은 자신의 기준만큼 혼자 생각해보는 시간을 가지는 것이 실력 향상과 사고능력을 기르는 데에 가장 좋다는 것을 내 경험을 토대로 추천한다.

앞에서 거창하게 얘기했지만 사실 자바를 접해봤던 사람들이라면 다 아는 문제일 수 있고 나보다 더 나은 풀이법을 가지고 있는 사람도 있을 것이고 내 생각에 틀린 부분이 존재할 수 있다.
그렇다면 뒤로 가기 버튼을 눌러 뒤로가시거나 댓글로 알려주시기 바랍니다 ㅠㅠ 저도 알고 싶으니까여

자 문제 들어갑니다.

1 ~ 5 사이의 랜덤한 난수를 10개 발생 시켜 배열에 저장하고 그 배열 속에서 중복 된 값을 제거해라.
ex) [1,1,1,3,3,3,5,5,5,2,2,] 처럼 배열이 있다면 [1,3,5,2]로 만들어 보아라 0은 제외

HINT !! 중복 배제된 값을 여러 개 저장 받을 배열을 생성하는 것을 추천한다.

이제 스크롤 내리는 것을 멈추고 문제를 풀어주세요. 밑에는 답이 있기 때문....

쉬운 사람도 있겠지만 너무 어렵게 느껴진다며 스크롤을 내리려는 사람도 있을 수 있습니다.
그런 사람들을 위해 두 번째

HINT !! 배열에는 주소가 있다는 것을 기억하고, 111 222 333 처럼 첫번 째 값은 그 전에 중복 값이 없다는 것을 기억해라.


정답 공개

       	// 10개의 난수를 저장 받을 변수를 생성
		int[] arr = new int[10];
      
		// 1 ~ 5 까지의 난수 10개를 0 부터 9 인덱스에 저장 받고
		for(int i = 0; i < arr.length; i++){
			arr[i] = (int)(Math.random() * 5) + 1;
		}
		
        	// 값이 잘 들어갔나 확인
		System.out.println(Arrays.toString(arr));
		
        	// 중복이 배제된 값을 저장받을 배열
		int[] temp = new int[5];
      	
            // 중복이 배제된 회수
		int count = 0;
		
        	// 중복을 걸러주는 부분
		for(int i = 0; i < arr.length; i++){
			boolean flag = false;
			for(int j = 0; j < temp.length; j++){
				if(arr[i] == temp[j]){
					flag= true;
					System.out.println(Arrays.toString(temp));
				}
			}
            	// 중복이 배제된 값이 저장.
			if(!flag){
				temp[count++] = arr[i];
			}
		}

		// 0을 배제 해주기 위한 부분
		int[] result = new int[count];
		for(int i = 0; i < result.length; i++){
			result[i] = temp[i];
		}
		System.out.println(Arrays.toString(result));

이렇게 문제를 풀어봤다. 이해가 안되는 분들이 혹시나 있을까 해서 문제를 풀며 한 생각을 적어보자면

배열 속에서 첫 번째 값은 중복이 존재할 수 없다는 것이다.

위에서도 말했지만 111 222 33 44 처럼 배열이 존재한다면 항상 첫 번째 값 1, 2, 3, 4 는 그 이전 중복된 값이 존재하지 않는다.

그렇다는 것은 배열에서 처음 만난 단위의 수는 바로 중복 배제 배열에 넣어주고 안에 들어간 배열의 값을 if문으로 비교만 해주면 된다는 것이다.

코드를 순서대로 설명하면

  1. 10개의 1 ~ 5 까지의 난수를 arr배열에 저장한다.

  2. 중복이 배제된 값을 저장 받을 배열 temp를 만든다 크기가 5인 이유는 1 ~ 5 를 중복 제거 하면 5 이하의 개수만 나올 수 있기 때문이다.

  3. 첫 for문이 돌면 temp의 값은 전부 0 이기 때문에 무조건적으로 첫 번째 배열 값이 들어간다.

  4. 그렇게 0번지에 3이 들어갔다고 하면 for문 속에서 3이 계속해 arr의 다른 배열 값들과 비교되고

  5. if(false)로 값이 저장되지 않으며 항상 arr 속 새로운 수의 첫번째 값만 temp 배열에 저장될 것이다.

  6. 그렇게 값이 저장 된 회수마다 count는 ++ 되고 중복을 배제한 값의 합이 4 라면
    result의 크기는 4가 되며 중복이 배제된 temp[i]값부터 차례로 result[i]에 저장되며 0을 배제한다.

첫 문제를 내봤는데 나는 초급 때 상당히 어려웠던 문제이다. 내가 그렇게 강조 했던 for문을 제대로 활용할 줄 몰랐기 때문ㅠㅠ...

  • 앞서 내가 말한 것 처럼 위 문제가 어려웠던 사람들은 앞으로도 남의 도움이 없이 혼자 해결해 나갔으면 좋겠다.
  • 만약 남이 도와준다면 남의 지식을 내것으로 만들때 까지 복습 또 복습!!!!!!!!!!!!

0개의 댓글