[Android Studio] JAVA 로또 등수 확인 알고리즘 코드 | 로또 번호로 과거 등수 내역 확인하기
간단하게 로또 등수를 확인하는 코드를 먼저 알려드리고
그 다음에 로또 앱에서 흔히 볼 수 있는 자신이 만든 번호로 과거 등수 내역을 조회하는 코드를 작성해 볼게요
일단 로또 등수를 매기는 기준은
1등 : 6개의 숫자 일치
2등 : 5개의 숫자 일치 + 보너스 번호 일치
3등 : 5개의 숫자 일치
4등 : 4개의 숫자 일치
5등 : 3개의 숫자 일치
일단 로또 번호는 당연하게 보너스 번호를 제외한 6개의 숫자가 정렬되어 있습니다
혹시 필요하다면 Arrays.sort를 써서 정렬을 해두시면 될거같아요
저는 두개의 메소드를 사용했습니다 //
1. 일치하는 갯수 확인하는 메소드
2. 보너스 번호가 일치하는지
public void compareNums(int[] nums){
int cnt; // 같은 숫자의 갯수
//nums는 실제로 비교 해야하는 번호 (당첨 번호가 아닌 내가 임의로 생성한 번호 )
for(NumberQuery wNum : numberQueryList){
// 실제 등수 코드 시작
cnt = 0;
// win_idx는 실제 당첨 번호읜 인덱스, cmp_idx는 내가 만든 번호의 인덱스
int win_idx, cmp_idx;
win_idx = cmp_idx = 0;
while(win_idx <= 5 && cmp_idx <= 5){
if(wNum.getNums()[win_idx] == nums[cmp_idx]){
//두개의 번호가 일치하는 경우 인덱스를 둘다 증가 시켜 다음 번호들을 비교, 일치했으므로 cnt++
cnt++;
win_idx++;
cmp_idx++;
}else if(wNum.getNums()[win_idx] < nums[cmp_idx]){
// 생성한 번호(nums)가 더 크면 당첨 번호(wNum.getNums())의 배열 인덱스를 증가 시켜 다음 번호와 비교
win_idx++;
}else{
//위와 반대의 상황으로 생성 번호의 배열 인덱스만 증가
cmp_idx++;
}
}
setRank(cnt, wNum, nums);
// 등수 코드 끝
}
}
저는 일단 numberQueryList라는 모든 당첨된 번호들의 List와 nums를 비교 해야하니 반복문에 넣어주었습니다
일단 일치하는 번호의 갯수를 cnt 로 해주고 시작합니다
두개의 번호가 일치 하는 경우에는 번호들의 비교가 완료되었으니 둘다 다음 번호로 넘어가므로 인덱스를 모두 증가시켜주고 cnt를 증가,
배열들이 오름차순 이므로 번호가 일치하지 않고 둘중에 하나가 크면 작은 쪽의 인덱스를 증가시켜
다음 번호와 비교해주면 됩니다.
이후 setRank라는 메소드를 통해 2,3등을 결정짓는 보너스 번호를 통하여 등수를 정해주었습니다. 등수만 필요하신 분은 switch문만 확인하시면 됩니다.
// int cnt는 일치한 번호 갯수, wNum은 당첨번호의 객체, nums는 생성한 번호
public void setRank(int cnt, NumberQuery wNum, int[] nums ){ // 등수 지정해주는 메소드
switch(cnt){
case 6 : // 6개 다 맞을 때 1등
// 원하는 코드 작성 글쓴이는 first라는 리스트에 객체를 추가 하였음
first.add(wNum);
break;
case 5: // 보너스 번호를 포함한 경우 2등, 아닌 경우 3등
if(Arrays.asList(nums).contains(wNum.getNums()[6])){
second.add(wNum);
}
else{
third.add(wNum);
}
break;
case 4:// 4개를 맞춘 경우 4등
fourth.add(wNum);
break;
case 3: // 3개를 맞춘 경우 5등
fifth.add(wNum);
break;
default:
break;
}
// 각각의 등수들 회차 빠른 순으로 정렬
Collections.sort(first);
Collections.sort(second);
Collections.sort(third);
Collections.sort(fourth);
Collections.sort(fifth);
}
저는 과거 당첨 내역을 먼저 등수가 높은 순으로 정렬하고, 그 같은 등수 내에서는 회차가 빠른 순으로 정렬하였습니다
따라서 각각의 등수들을 담을 수 있는 리스트들과
전체 등수를 정렬하여 담을 리스트인 historyList를 생성해 주고
위에 스위치 문에서 볼수 있듯이 등수가 결정됨에 따라 리스트에 넣어주었습니다.
마지막으로 각각의 list를 Collection.sort로 회사별로 오름차순으로 정리하였습니다.
List<WinningHistory> historyList = new ArrayList<>();
List<NumberQuery> first = new ArrayList<>();
List<NumberQuery> second = new ArrayList<>();
List<NumberQuery> third = new ArrayList<>();
List<NumberQuery> fourth = new ArrayList<>();
List<NumberQuery> fifth = new ArrayList<>();
부족한 설명은 댓글 달아주세요
전체코드
package org.techtown.lottoworld.numAnalysis;
import static android.widget.Toast.makeText;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.techtown.lottoworld.DataAdapter;
import org.techtown.lottoworld.NumberQuery;
import org.techtown.lottoworld.R;
import org.techtown.lottoworld.madeNums.MadeNumListActivity;
import org.techtown.lottoworld.winningHistory.WinningHistory;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class NumAnalysisActivity extends AppCompatActivity {
int pages; // 전체 페이지 수
int totalItem;
int page = 0; // 현재 페이지
List<NumberQuery> numberQueryList;
List<WinningHistory> historyList = new ArrayList<>();
List<NumberQuery> first = new ArrayList<>();
List<NumberQuery> second = new ArrayList<>();
List<NumberQuery> third = new ArrayList<>();
List<NumberQuery> fourth = new ArrayList<>();
List<NumberQuery> fifth = new ArrayList<>();
TextView winningNum;
TextView total;
TextView even;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_num_analysis);
getNumberQueryList();
Bundle myBundle = getIntent().getExtras();
int[] nums = myBundle.getIntArray("numData");
Log.d("cheackingNums", nums[0] + ", " + nums[1]);
winningNum = findViewById(R.id.winningNum);
total = findViewById(R.id.total);
even = findViewById(R.id.analysis);
NumberQuery numberQuery = new NumberQuery();
numberQuery.setNums(nums);
Date dateNow = Calendar.getInstance().getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-M-dd", Locale.getDefault());
String date = format.format(dateNow);
numberQuery.setDate(date);
total.setText("총합:" + numberQuery.getTotal());
even.setText("짝홀:" + numberQuery.getEven()+"/"+( 6 - numberQuery.getEven()) );
winningNum.setText(numberQuery.numberString());
//history 리스트를 만들음
compareNums(nums);
addWinningNums();
totalItem = historyList.size();
if(totalItem % 10 == 0){ // 전체 페이지 계산
pages = totalItem / 10;
}else{ pages = totalItem / 10 + 1; }
Button saveButton = findViewById(R.id.saveNum);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
insertData(numberQuery);
}
});
Button madeList = findViewById(R.id.madeList);
madeList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent madeNumListActivity = new Intent(NumAnalysisActivity.this, MadeNumListActivity.class );
startActivity(madeNumListActivity);
finish();
}
});
RecyclerView recyclerView2 = findViewById(R.id.recyclerView2);
LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false);
recyclerView2.setLayoutManager(layoutManager);
NumAnalysisAdapter adapter = new NumAnalysisAdapter();
addNumItem(adapter);
recyclerView2.setAdapter(adapter);
recyclerView2.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
int totalCount = recyclerView.getAdapter().getItemCount();
if(lastPosition == totalCount -1 ){
//아이템 추가!
addNumItem(adapter);
adapter.notifyDataSetChanged();}
}
});
}
public int getNumberQueryList(){
int round = 0;
try {
DataAdapter mDbAdapter = new DataAdapter(getApplicationContext());
mDbAdapter.open();
// db에 있는 값들을 model을 적용해서 넣는다.
numberQueryList = mDbAdapter.getWinningData();
// db 닫기
mDbAdapter.close();
Log.d("insertData", "성공함");
} catch (SQLException e) {
e.printStackTrace();
Log.d("insertData", "실패함");
}
return round;
}
public void compareNums(int[] nums){
int cnt; // 같은 숫자의 갯수
for(NumberQuery wNum : numberQueryList){
cnt = 0;
int win_idx, cmp_idx;
win_idx = cmp_idx = 0;
while(win_idx <= 5 && cmp_idx <= 5){
if(wNum.getNums()[win_idx] == nums[cmp_idx]){
cnt++;
win_idx++;
cmp_idx++;
}else if(wNum.getNums()[win_idx] < nums[cmp_idx]){
win_idx++;
}else{
cmp_idx++;
}
}
setRank(cnt, wNum, nums);
}
}
public void setRank(int cnt, NumberQuery wNum, int[] nums ){ // 등수 지정해주는 메소드
switch(cnt){
case 6 : // 6개 다 맞을 때 1등
first.add(wNum);
break;
case 5: // 보너스 번호를 포함한 경우 2등, 아닌 경우 3등
if(Arrays.asList(nums).contains(wNum.getNums()[6])){
second.add(wNum);
}
else{
third.add(wNum);
}
break;
case 4:// 4개를 맞춘 경우 4등
fourth.add(wNum);
break;
case 3: // 3개를 맞춘 경우 5등
fifth.add(wNum);
break;
default:
break;
}
// 각각의 등수들 회차 빠른 순으로 정렬
Collections.sort(first);
Collections.sort(second);
Collections.sort(third);
Collections.sort(fourth);
Collections.sort(fifth);
}
public void addNumItem(NumAnalysisAdapter adapter){
int start = page * 10;
int end;
if( totalItem < (page + 1) * 10){
end = totalItem;
}else{
end = (page + 1) * 10;
}
for(int i = start; i < end; i++){
adapter.addItem(historyList.get(i));
}
page ++;
}
// historyList에 등수와 함께 저장하는 메소드
public void addWinningNums(){
for(NumberQuery wn : first){
historyList.add(new WinningHistory(wn,1));
}
for(NumberQuery wn : second){
historyList.add(new WinningHistory(wn,2));
}
for(NumberQuery wn : third){
historyList.add(new WinningHistory(wn,3));
}
for(NumberQuery wn : fourth){
historyList.add(new WinningHistory(wn,4));
}
for(NumberQuery wn : fifth){
historyList.add(new WinningHistory(wn,5));
}
}
public void insertData( NumberQuery wn){
try {
DataAdapter mDbAdapter = new DataAdapter(getApplicationContext());
mDbAdapter.open();
mDbAdapter.insertMadeNum(wn);
// db 닫기
mDbAdapter.close();
Log.d("insertMadeNum", "성공함");
makeText(getApplicationContext(), "번호가 저장되었습니다.", Toast.LENGTH_SHORT).show();
} catch (SQLException e) {
e.printStackTrace();
Log.d("insertData", "실패함");
}
}
}