728x90

유저 아이디 배열과 "신고자 피신고자" 배열, 제재 대상 기준 횟수가 주어질때 ,

신고자가 신고한 유저가 제재 대상이 되면 신고자에게 메일을 보내고

이때 신고자가 받은 메일의 개수를 담은 배열을 반환  

public int[] solution(String[] id_list, String[] report, int k) {

int[] answer = new int[id_list.length];

Map<String,Set<String>> reportedMap = new HashMap<String,Set<String>>();//K:신고당한사람 V:신고한사람SET

ArrayList<String> id = new ArrayList<String>();//answer에 저장할때 index를 알아내기 위해 id_list와 같은 순서로 add

for (int i = 0; i < id_list.length; i++) {

id.add(id_list[i]);

}

for(int i=0; i<report.length;i++){

Set<String> thoseReporting = reportedMap.getOrDefault(report[i].split(" ")[1],new HashSet<String>());//신고한사람SET

thoseReporting.add(report[i].split(" ")[0]);

reportedMap.put(report[i].split(" ")[1],thoseReporting);

}

Set<String> reportedSet = reportedMap.keySet();

for (Iterator iterator = reportedSet.iterator(); iterator.hasNext();) {

String string = (String) iterator.next();

Set<String> a = reportedMap.get(string);

if(a.size()>=k) {

for (Iterator iterator2 = a.iterator(); iterator2.hasNext();) {

String string2 = (String) iterator2.next();

answer[id.indexOf(string2)]++;

}

}

}

return answer;

}

 

다른사람 풀이를 보는데   객체 지향으로 푼 사람이 있었다. 

class User{

String name;

HashSet<String> reportList;

HashSet<String> reportedList;

public User(String name){

this.name = name;

reportList = new HashSet<>();

reportedList = new HashSet<>();

}

}

유저 객체는

본인 이름과 

본인이 신고한 사람 set, 본인을 신고한 사람 set을 가지고 있다.   

public int[] solution2(String[] id_list, String[] report, int k) {

int[] answer = new int[id_list.length];

ArrayList<User> users = new ArrayList<>();

HashMap<String, Integer> suspendedList = new HashMap<>(); // <이름>

HashMap<String, Integer> idIdx = new HashMap<String, Integer>(); // <이름, 해당 이름의 User 클래스 idx>

int idx = 0;

 

for (String name : id_list) {

idIdx.put(name, idx++);

users.add(new User(name));

}

 

for (String re : report) {

String[] str = re.split(" ");

users.get(idIdx.get(str[0])).reportList.add(str[1]);//신고가 한번 발생하면 신고 당한사람과 신고한 사람의리스트 모두 갱신 

users.get(idIdx.get(str[1])).reportedList.add(str[0]);

}

 

for (User user : users) {

if (user.reportedList.size() >= k)//신고당한 횟수가 k번 이상이면

suspendedList.put(user.name, 1);//제재리스트에 유저이름을 올린다.

}

 

for (User user : users) {

for (String nameReport : user.reportList) {

if (suspendedList.get(nameReport) != null) {//제재 대상에 이름이있다면 

answer[idIdx.get(user.name)]++;//그 이름으로 index 찾아서 answer증가

}

 

}

}

return answer;

 

}

'Java > Coding Test' 카테고리의 다른 글

달리기 경주 문제풀이  (0) 2023.09.24
공원 산책 문제풀이  (0) 2023.09.24
소수찾기 문제풀이  (0) 2023.09.18
소인수분해 문제풀이  (0) 2023.09.18
치킨 쿠폰 문제풀이  (0) 2023.09.17
728x90

주어진 수까지의 정수 중 소수의 개수 반환

 

public int solution(int n) {

int answer = (n>=2)? 1: 0;

for(int i=3; i<=n;i+=2){

if(isPrime(i)){

answer++;

}

}

return answer;

}

public boolean isPrime(int n){

for(int i=2; i*i<=n;i++){

if(n%i==0){

return false;

}

}

return true;

}

n이 2일땐 소수는 2 자신을 갖고 1이하는 답은 0 이다.

소수를 찾을 때 3부터 찾고

효율성을 위해 소수인지 확인할 때는 i^2이 해당 수까지만 계산한다.

'Java > Coding Test' 카테고리의 다른 글

공원 산책 문제풀이  (0) 2023.09.24
신고 결과 받기 문제풀이  (0) 2023.09.23
소인수분해 문제풀이  (0) 2023.09.18
치킨 쿠폰 문제풀이  (0) 2023.09.17
유한소수 판별하기 문제풀이  (0) 2023.09.17
728x90

주어진 수의 소인수를 오름차순 정렬하여 반환

 

public int[] solution(int n) {

Set<Integer>set = new HashSet<Integer>();

for (int i = 2; i <= n; i++) {

while(n%i==0) {

n/=i;

set.add(i);

}

}

int[] a = new int[set.size()];

Iterator<Integer> it = set.iterator();

for (int i = 0; i < a.length; i++) {

a[i]=it.next();

}

Arrays.sort(a);

return a;

}

2부터 n까지 수를 나누는데 

한번 나눌때 나눠질때까지 계속 나눠야 소인수만 구해진다 그렇지 않으면 소인수의 배수들이 걸러지지 않는다. 

나눌때마다 i를 set에 넣기 때문에 set은 중복을 거르는 Set으로 하였다. 

Set은 순서가 없기 때문에 오름차순 정렬을 위해 배열로 변경하였다.

'Java > Coding Test' 카테고리의 다른 글

신고 결과 받기 문제풀이  (0) 2023.09.23
소수찾기 문제풀이  (0) 2023.09.18
치킨 쿠폰 문제풀이  (0) 2023.09.17
유한소수 판별하기 문제풀이  (0) 2023.09.17
저주의 숫자 3 문제풀이  (0) 2023.09.17
728x90

치킨 10마리면 1마리 서비스 

주어진 주문 횟수로 서비스 치킨을 얼마나 더 시킬 수 있는지 반환 

public int solution(int chicken) {

int answer = 0;

int coupon = chicken;

answer = R(coupon,answer);

return answer;

}

private int R(int coupon, int answer) {

int chicken = coupon/10;

answer+=chicken;

coupon-=chicken*10;

coupon+=chicken;

if(coupon>=10) {

return R(coupon,answer);

}

return answer;

}

재귀함수를 이용하여 시킨 치킨 수를 모두 쿠폰으로 반환하고 쿠폰 10번이면 answer를 증가시키고 coupon을 감소시키고  동시에 쿠폰도 증가시켰다. 

쿠폰이 10보다 작아질때까지 계속했다. 

 

다른 풀이 보는데 그냥 while문으로 쉽게 푼듯하다..

재귀함수도 어차피 반복문으로 풀 수 있는데 재귀함수 배우고 나서 이런문제는 재귀함수로 접근해야한다는 강박이 생긴것 같다...

public int solution2(int chicken) {

int coupon = chicken;

int answer = 0;

while (coupon >= 10) {

answer += coupon / 10;

coupon = coupon % 10 + coupon / 10;

}

return answer;

}

아래 코드는 아예 계산을 해서 답을 구했다.

public int solution3(int chicken) {

int answer = chicken/9;

if(chicken>1&&chicken%9==0){

answer--;

}

return answer;

}

10번 시키고 난 후부터는 9번만 시키면 1번을 서비스로 먹을 수 있다. 

9번 시켰을 떄는 최초 10번에 달성하지 못해 치킨을 9로 나는 값이 답이 아니라 -1 해줘야 한다. 

반면 10번 시켰을 땐 answer=1이 맞고 

18번 시켰을 때도 한번이 부족해서 시키지 못하기 때문에  answer-1해줘야한다. 

19번 시켰을땐 answer=2가 맞다.

즉 9의 배수일때는 answer에서 하나 빼줘야 한다. 

'Java > Coding Test' 카테고리의 다른 글

소수찾기 문제풀이  (0) 2023.09.18
소인수분해 문제풀이  (0) 2023.09.18
유한소수 판별하기 문제풀이  (0) 2023.09.17
저주의 숫자 3 문제풀이  (0) 2023.09.17
문자열 밀기 문제풀이  (0) 2023.09.17

+ Recent posts