[2018 국민대 알고리즘대회 예제 - 1]

2020. 7. 30. 02:57·🖥️ 컴퓨터공학 🖥️/알고리즘
반응형

문제

길이가 n인 배열에 1부터 n까지 숫자가 중복없이 한 번씩 들어 있는지를 확인하려고 합니다. 1부터 n까지 숫자가 중복없이 한 번씩 들어있는 경우를 true, 아닌 경우를 false를 반환하도록 함수 solution을 완성해주세요.

 

제한사항

배열의 길이는 10만 이하입니다.
배열의 원소는 0이상 10만 이하인 정수입니다.


입출력 예

arr=[4,1,3,2]       result=true
arr=[4,1,3]         result=false

 

소스코드 및 풀이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
#include<vector>
using namespace std;
 
bool solution(vector<int>arr) {
    
    bool answer;
    int A[] = { 0, };
    //벡터 arr을 0과 1로 표현하여 정렬한 배열
 
    int n = arr.size();//벡터 arr의 크기
 
    for (int i = 0; i < n; i++) {
        int j = A[i];
        //A[0]=4인 경우에는 4번째 A 배열에 대입
 
        A[j] = A[j] + 1;
        //A는 0으로 초기화시켰으므로 1로 만들어줌.
    }
 
    for (int i = 0; i < n; i++) {
        if (A[i] == 0||A[i]>1) 
            return false;
        //처음부터 n까지 연속되지 않아 0으로 잔류하거나 중복되어 여러 번 더해진 경우에는 false를 출력
    }
 
    return answer;
}
Colored by Color Scripter
cs

 

위의 문제에서 가장 중요한 포인트는 2가지 이다.

1. n개의 숫자들이 빠지지 않고 정렬이 되었는가?

2. 중복이 되었는가?

 

이를 위해 벡터 arr과 추가적으로 배열 A를 만들고자 한다.

 

 

예를 들어 벡터 arr은 4132라고 하였다. 이제 우리는 벡터 arr이 n까지 숫자가 빠진게 없는지, 중복이 되지 않았는지를 판단해야 한다.

 

①arr[0]을 추출하여 이를 arr[0]번째 배열에 저장한다.

 

예시로 든 벡터에서 arr[0]은 4이다. 이제 이를 4번째 배열에 저장한다.

 

② 위의 방법처럼 arr[1]을 추출하여 arr[1]번째 배열에 저장한다.

 

 

③ 이런식으로 n번 반복하여 실행한다. 실행 결과 만약에 4가 2번 있었다면(중복이라면) 4번째에 1을 두번 더해주어 2가 있을 것이다. 또한 벡터에 빠진 숫자가 있었다면 0이 존재하였을 것이다. 하지만 예시로 제시한 벡터 arr은 4132로 숫자 4개가 다 있고, 중복도 되지 않으므로 다음과 같은 배열 A가 출력된다.

 

④ 1부터 n까지 숫자가 0인지 1인지를 파악하여 1이 하나로도 없으면 false, n개의 숫자가 모두 1이면 true를 출력하도록 한다.

 

 

의견 및 반성

처음에는 그냥 sort를 하여 일일히 비교를 하는 방법을 사용하려고 하였다. 맨 마지막 숫자와 배열의 크기를 비교하여 숫자가 같으면 중복되는 숫자가 없다는 의미이므로 벡터의 중복여부를 판단하는 것은 평탄하였으나 빠진 숫자가 있는지를 판별하는 것은 쉽지만은 않은 것 같았다.

 

숫자가 존재할 때마다 0에서 하나씩 더하는 방법은 숫자가 1인지 아닌지를 판별하기만 하면 되므로 간단한 것 같았다. 앞으로 이런 방법을 애용해야 겠다.

 

728x90
반응형

'🖥️ 컴퓨터공학 🖥️ > 알고리즘' 카테고리의 다른 글

[백준 - 10171] 고양이  (0) 2020.07.31
[백준 - 1008] A/B  (0) 2020.07.31
[백준 - 1920] 수 찾기(feat. 이진탐색 알고리즘) / C++  (0) 2020.07.04
[백준 - 2178] 미로 탐색 (feat. 너비우선탐색) / C++  (0) 2020.07.03
[백준 - 2267] 단지번호붙이기 (feat. 깊이우선탐색) / C++  (0) 2020.07.03
'🖥️ 컴퓨터공학 🖥️/알고리즘' 카테고리의 다른 글
  • [백준 - 10171] 고양이
  • [백준 - 1008] A/B
  • [백준 - 1920] 수 찾기(feat. 이진탐색 알고리즘) / C++
  • [백준 - 2178] 미로 탐색 (feat. 너비우선탐색) / C++
공대생 배기웅
공대생 배기웅
군노답 미필 공대생 배기웅의 대학생활을 갈아 넣은 블로그
    반응형
  • 공대생 배기웅
    글쓰는공대생의 IT블로그
    공대생 배기웅
  • 전체
    오늘
    어제
    • 분류 전체보기 (166)
      • 🖊️ 공대생 글쓰기 🖊️ (17)
        • 공대생 회고록 (4)
        • 공대생의 끄적끄적 (4)
        • 슬기로운 공대생활 (9)
        • 무한도전 대학원생 (0)
      • 📈 산업공학 📈 (14)
        • 금융, 파생상품 (13)
        • 통계 (0)
        • 선형대수 (0)
        • 보험, 리스크관리 (0)
        • 재무회계 (1)
      • 🖥️ 컴퓨터공학 🖥️ (92)
        • 머신러닝, 딥러닝 (12)
        • 텐서플로우, 케라스 (1)
        • 알고리즘 (24)
        • 웹 (5)
        • Python (3)
        • C | C++ (23)
        • Java (15)
        • 코드 에러 모음집 (9)
      • 😙 취미, 교양 😙 (2)
        • 영어공부 (1)
        • 일본어회화 공부 (1)
      • 🔍 정보 공유 🔍 (38)
        • 대학생 외부활동 정보 (2)
        • 개발자관련 정보 (3)
        • 대입 논술 입시자료 정보 (22)
        • 프로그램 세팅 (11)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • [공지] 글쓰는 공대생입니다 😃
  • 인기 글

  • 태그

    acmicpc
    스캐너
    경제성공학
    조작자
    예외
    객체지향
    무작위 변수
    Operator
    프로그래머스
    equals프레임워크
    Java
    알고리즘
    재귀함수
    이클립스
    프랜드함수
    백준
    데이터베이스
    OOP
    자바
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
공대생 배기웅
[2018 국민대 알고리즘대회 예제 - 1]
상단으로

티스토리툴바