알고리즘

[SWEA] 9940/10032

haesa_s 2020. 9. 24. 23:43

#9940 : 순열1

[코드]

[코드설명]

① main

scanf_s로 N을 입력 받고, while문으로 N이 1이상 100,000이하인지 검사한다.

숫자 N의 순열인지 확인할 N개의 숫자열을 저장하기 위해 malloc함수로 numArr에 sizeof(int)*N만큼의 메모리를 동적할당한다.

for문에서 i가 0부터 N전까지 증가하면서 numArr에 N개의 숫자를 입력 받고, while문에서 numArr_check함수로 N개의 숫자가 0이상 N이하인지 확인한다.

permutation_check함수로 numArr에 저장된 N개의 숫자가 N의 순열인지 확인하고, 그 결과를 YS에 반환한다.

결과 출력 후 free함수로 numArr 메모리를 해제한다.

② numArr_check

포인터 변수 numArr와 정수형 변수 N을 매개변수로 사용한다.

for문에서 i가 0부터 N전까지 반복하면서 numArr[i]가 0이상 N이하인지 확인한다.

0이상 N이하가 맞다면 함수는 1을 반환하고, 아니면 0을 반환한다.

③ permutation_check

numArr가 갖고 있는 정수의 개수를 새기 위해서 malloc함수로 permuArr에 sizeof(int)*N만큼의 메모리를 동적할당한다.    ex : permuArr[0]==2    →    1이 2개

permuArr[0]~permuArr[N-1]을 0으로 바꾸고, numArr[i] 값을 n에 대입해서 permuArr[n-1]에1을 더한다.

모든 permuArr의 값이 1이어야 numArr이 N의 순열이 되므로 permuArr이 1이 아닌경우 No를 반환하고, 모두 1인 경우 Yes를 반환한다.

 

[실행결과]

SWEA 9940 결과

 

#10032 : 과자 분배

[코드]

[코드설명]

① main

NK를 입력 받고, while문으로 NK가 0이상 100이하인지 확인한다.

과자를 분배했을 때 과자 수의 최소 차이는 제일 공평한 분배를 했을 때의 과자 수의 차이다. 따라서 과자를 가장 공평하게 분배하려면 과자 수를 사람 수로 나눈 몫만큼 분배하고 나머지를 한 명씩 더 주어야 한다. 이때 나머지가 0이 아니면 분배 받은 최대 과자 수와 최소 과자 수의 차이는 1이고, 나머지가 0이면 최소 차이는 0이 된다. 

따라서 NK로 나누었을 때 나머지가 0이 아니면 mini_difference는 1, 나머지가 0이면 mini_difference는 0이 된다.

 

[실행결과]

SWEA 10032 결과