로또의 최고 순위와 최저 순위

bumjinkim·2021년 10월 25일
0

👟 단계

프로그래머스 1단계 (완료)


💻 사용 언어

C


📄문제 내용

민우가 구매한 로또 번호를 담은 배열 lottos,
당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다.
이때, 당첨 가능한 "최고 순위"와 "최저 순위"를 차례대로 배열에 담아서
return 하도록 solution 함수를 완성해주세요.


✍ 문제 조건

1) lottos는 길이 6인 정수 배열입니다.
2) lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
3) 0은 알아볼 수 없는 숫자를 의미합니다.
4) 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
5) lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
6) win_nums은 길이 6인 정수 배열입니다.
7) win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
8) win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
9 )win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.


입출력 예시)

lottoswin_numsresult
[44, 1, 0, 0, 31, 25][31, 10, 45, 1, 6, 19][3, 5]
[0, 0, 0, 0, 0, 0][38, 19, 20, 40, 15, 25][1, 6]
[45, 4, 35, 20, 3, 9][20, 9, 3, 45, 4, 35][1, 1]

⌨ 코드작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// lottos_len은 배열 lottos의 길이입니다.
// win_nums_len은 배열 win_nums의 길이입니다.
int* solution(int lottos[], size_t lottos_len, int win_nums[], size_t win_nums_len) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    
int count1 = 0;
int count2 = 0;
    
    
  for(int i = 0; i < lottos_len; i++){
        
     if(lottos[i] == 0) count1 ++;
           
        for(int j = 0; j < lottos_len; j++){
        
            if(lottos[i] == win_nums[j]) {
                count1 ++;
                count2 ++;
      }
   }
}   
  if(count1 == 0) count1 = 1;
  if(count2 == 0) count2 = 1;
    
  int* answer = (int*)malloc(1);
        
  answer[0] = 7 - count1;
  answer[1] = 7 - count2;
    
    return answer;
}

🔔해결방법 및 내가 접근한 방식

👉<조건확인>

조건에서 로또 숫자중 알아 볼 수 없는 숫자만 "0"으로 표기했다고 한다.
"순서와 상관없이 번호만 일치"한다면 맞힌걸로 인정을 하기 때문에
0에 들어가는 숫자만 잘 고려해보면 쉽게 풀 수 있다.

🔑<접근방식 및 풀이>

일단 순서상관없이 최고순위와 최저순위만 구하면 되기 때문에, 2가지 경우로 생각하면 된다.
<최고순위인 경우>
임의의 숫자 0 이 win_nums에 포함될 것.
<최저순위인 경우>
임의의 숫자 0 이 win_nums에 제외될 것.

이제 남은 것들은 간단하다. 로또 번호가 맞았을때 개수에 따라 순위가 결정되므로 count라는 변수를 설정해서 개수를 세준다. 하지만 2가지의 경우의 수가 존재하므로 "count1"과 "2"로 나누어 설정한다.
for문 2개를 활용하여 lottos배열과 win_nums의 배열을 하나하나씩 확인한다. 그 두 값이 같을 경우에 count 1, 2가 +1되도록 설정했다.
어,,? 그럼 위에 따로 count1만 더해주는 이유가 뭔가요?
최고순위는 로또의 변수 0값이 win_nums에 포함되게 판정이 되야하므로 count1에 +1을 해주는 것이다.

로또 순위가 총 1위~6등이 있으므로 "7-count1,2"를 하면 최종 순위가 나온다.
그 값들을 anwer에 넣어주면 끝.
🚫한가지 주의 사항🚫
lotts의 배열과 win_nums의 배열이 하나도 안맞으면 count값을 각각 1씩 배정해야 6등이 나온다!!


👨🏻‍💻 코테를 풀어보며 느낀점

생각보다 쉽게 풀렸는데 마지막 주의사항처럼
하나도 맞지 않았을 때의 경우의 수를 생각하지
않아서 틀렸어서 아쉬웠다.

profile
프로그래밍의 새싹

0개의 댓글