:: 게시판
:: 이전 게시판
|
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다. 통합 규정을 준수해 주십시오. (2015.12.25.)
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
19/06/27 19:15
음... 중복되지 않게 출력하는 쪽이 문제라면 아래 링크와 같이 하면 될 것 같습니다(중간쯤 C++).
https://www.geeksforgeeks.org/print-distinct-elements-given-integer-array/ 어떤점이 문제인지 잘 모르겠네요...
19/06/27 19:39
배열 1개만 사용했을 떄 가장 좋은 방법은 sort한 다음 출력하는 것이죠
그러면 가장 마지막에 출력한 숫자와 인덱스의 다음숫자를 비교해서 중복이면 다음 인덱스로 건너뛰면 되니까요
19/06/27 19:48
그럼 사실상 저장해야 할 공간이 하나 더 있어야 됩니다
그것이 배열이 되었건 STL에서 사용하는 맵이나 셋같은 컨테이너가 되었건 말이죠
19/06/27 20:12
삽질을 거하게까지는 아니고 변수 하나를 더 쓰면 될 거 같은데요.
ex. int end = 9로 선언.... 일단 0~9까지 입력 받은 수로 채워 넣고, 0번째와 1번째, 0번째와 2번째... 와 같이 비교해 나갑니다. 그러다가 0번째와 4번째가 같으면 array[4] = array[end] 로 하고, end = end - 1; 해 주고, 다시 0번째와 4번째를 비교합니다. 0번째와 end번째의 비교가 끝나면 1번째와 2번째, 1번째와 3번째.... 이렇게 비교해 나가면 될 것 같은데요. 아마 다른 방법도 있겠지만 장실에서 잠시 써 봤습니다... ^^;;
19/06/28 00:59
그렇게 했을 경우의 문제점을 배열 하나로 표현하면
3 1 3 1 3 1 3 1 3 1 이렇게 있을 경우 처음에 이미 출력된 3에 대한 정보를 2번째 루프 돌때 비교해야 할 3은 그전에 3이란 숫자가 이미 출력이 되어 있는지 아닌지 알 수가 없습니다. 과거에 대한 기록은 출력으로 이미 끝났기 때문이죠.
19/06/28 08:29
(수정됨) 말씀 하신 배열을 예로 들면
3 1 3 1 3 1 3 1 3 1 에서 배열의 0번 Item 인 3과의 비교가 끝나고 나면 3 1 1 1 1 1 ? ? ? ? 이 되고, end 는 5 가 되지 않을까요? 그리고 1번 item인 1 과의 비교가 끝나면 3 1 ? ? ? ? ? ? ? ? 이 되고, end 는 1이 되고요. 그 다음에 3 1 출력하면 되는 거 아닌가요? 3은 첫번째 루프 돌고 바로 출력해도 상관 없고요. 한 바퀴가 끝나면 이미 비교한 놈과 같은 애는 end 가 가리키는 index 안 쪽에 더 이상 없으므로 이미 출력 되어 있는지 아닌지 알 필요 없을 거 같은데요..
19/06/27 20:12
(수정됨) 소팅을 안하려면 매 루프마다 배열 오른쪽을 싹 서칭해서 중복이 발생하면 해당 숫자는 버리면 됩니다. 이렇게 하면 각 중복정수 중에서 가장 오른쪽에 있는 것만 출력하게 되죠. 근데 O(n2)이니 알고리즘상으론 소팅보다 못할수도 있죠. 뭐 아주 무식하게 생각한거라 추가로 개선이 되긴 하고, 사이즈가 10밖에 안되니 실질적으론 소팅보다 나을겁니다.
c++ 제약이 없다면 자바스크립트에서 빈 오브젝트에 다 집어넣으면서 덮어쓰면 끝나는 문제이긴 합니다만 출제자 의도는 어레이를 쓰라는거니까 역시 의미가 없겠네요.
19/06/27 20:22
주 언어가 파이썬인데...
cpp 포기하기를 잘 했네요.... 파이선이면 가독성 조금 포기하면 한줄에 입력부터 출력까지 끝납니다. print (set(input().split(“ “)))
19/06/27 22:14
걍 입력받고 배열에 넣을때 기존에 넣은 값들과 한번 싹 스캔해서 비교한담에 다를때만 추가하세요.
소트가 O(nlogn)이고 이게 O(n^2)로 비효율이긴 하겠지만 어차피 10개면 신경안써도 됩니다.
19/06/27 22:15
(수정됨) 일단 도전!!!
int ar[10]= {1,2,...}; for( int i = 0; i< 10; i++ ) { int nFind = 0; for( int j = 0; j<10 ; j++) { if( ar[i] == ar[j]) nFind++; } if(nFind != 1) printf("%d",ar[i]); } 스페이스가 왜 안먹는거야 ㅠ.ㅠ
|