public class Main {
static List<Integer> luckyNumbers;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
luckyNumbers = new ArrayList<>();
int[] members = new int[m];
for(int i = 0; i < m; i ++){
members[i] = Integer.parseInt(br.readLine());
}
assignLuckyTickets(n, m, luckyNumbers, members);
luckyNumbers.forEach(System.out::println);
}
private static void assignLuckyTickets(int n, int m, List<Integer> luckyNumbers, int[] members) {
for(int i = 0; i < m; i ++){
int number = members[i] % n;
while (true) {
if(!luckyNumbers.contains(number)){
luckyNumbers.add(number);
break;
}
else{
number ++;
if(number > n - 1){
number = 0;
}
}
}
}
}
}
강의 풀이 ▼
더보기
import java.lang.*;
import java.util.*;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
/**
*
* @param n 전체 티켓의 수
* @param m 요청 고객의 수
* @param ids 각 고객들의 회원번호
* @return
*/
public static ArrayList<Integer> getTicketNumbers(int n, int m, int[] ids)
{
ArrayList<Integer> tickets = new ArrayList<>();
TicketTable table = new TicketTable(n);
for(int ticket : ids){
int ticketIndex = table.findEmptyIndexByUserId(ticket);
tickets.add(ticketIndex);
table.setUsed(ticketIndex, true);
}
return tickets;
}
public static void main(String[] args) throws Exception {
int n = scanner.nextInt(); // 전체 티켓의 수
int m = scanner.nextInt(); // 요청 고객의 수
int[] ids = new int[m];
for(int i = 0 ; i < m ; i ++)
{
ids[i] = scanner.nextInt();
}
ArrayList<Integer> tickets = getTicketNumbers(n, m, ids);
for(int index : tickets){
System.out.println(index);
}
}
}
class TicketTable
{
private final boolean[] used;
public final int length;
public TicketTable(int length)
{
this.length = length;
this.used = new boolean[length];
}
/**
* 사용자의 회원 번호로 지급받게 될 행운권 번호를 계산하는 메소드
*/
public int findEmptyIndexByUserId(int userId)
{
int index = userId % length;
while(isUsed(index)){
index = (index + 1) % length;
}
return index;
}
/**
* 해당 행운권 번호가 이미 사용 중인지 여부를 반환하는 메소드
*/
public boolean isUsed(int ticketIndex)
{
return used[ticketIndex];
}
/**
* 티켓 사용 여부를 갱신하기 위한 메소드
*/
public void setUsed(int index, boolean status)
{
used[index] = status;
}
}
'자료구조 & 알고리즘 관련 > 코딩테스트' 카테고리의 다른 글
N진수 게임 문제 (자바) (0) | 2022.12.28 |
---|---|
최대공약수 최소공배수 (0) | 2022.12.24 |
스도쿠 보드 (0) | 2022.12.20 |
세 카드 (0) | 2022.12.19 |
두 카드 (1) | 2022.12.16 |