๐ 1. ๋ฌธ์ ์ค๋ช
์ํฌ์๋ ์ํ์ ํฌ๊ธฐํ ์ฌ๋์ ์ค๋ง์
๋๋ค. ์ํฌ์ ์ผ์ธ๋ฐฉ์ ๋ชจ์๊ณ ์ฌ์ ์ํ ๋ฌธ์ ๋ฅผ ์ ๋ถ ์ฐ์ผ๋ ค ํฉ๋๋ค. ์ํฌ์๋ 1๋ฒ ๋ฌธ์ ๋ถํฐ ๋ง์ง๋ง ๋ฌธ์ ๊น์ง ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ต๋๋ค.
1๋ฒ ์ํฌ์๊ฐ ์ฐ๋ ๋ฐฉ์: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2๋ฒ ์ํฌ์๊ฐ ์ฐ๋ ๋ฐฉ์: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3๋ฒ ์ํฌ์๊ฐ ์ฐ๋ ๋ฐฉ์: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1๋ฒ ๋ฌธ์ ๋ถํฐ ๋ง์ง๋ง ๋ฌธ์ ๊น์ง์ ์ ๋ต์ด ์์๋๋ก ๋ค์ ๋ฐฐ์ด answers๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๋ง์ ๋ฌธ์ ๋ฅผ ๋งํ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ๋ฐฐ์ด์ ๋ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์กฐ๊ฑด
- ์ํ์ ์ต๋ 10,000 ๋ฌธ์ ๋ก ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
- ๋ฌธ์ ์ ์ ๋ต์ 1, 2, 3, 4, 5์ค ํ๋์ ๋๋ค.
- ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๋ฐ์ ์ฌ๋์ด ์ฌ๋ฟ์ผ ๊ฒฝ์ฐ, returnํ๋ ๊ฐ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
์ ์ถ๋ ฅ ์
์
์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
- ์ํฌ์ 1์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋งํ์ต๋๋ค.
- ์ํฌ์ 2๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ๋ ธ์ต๋๋ค.
- ์ํฌ์ 3์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ๋ ธ์ต๋๋ค.
๋ฐ๋ผ์ ๊ฐ์ฅ ๋ฌธ์ ๋ฅผ ๋ง์ด ๋งํ ์ฌ๋์ ์ํฌ์ 1์
๋๋ค.
์
์ถ๋ ฅ ์ #2
- ๋ชจ๋ ์ฌ๋์ด 2๋ฌธ์ ์ฉ์ ๋ง์ท์ต๋๋ค.
๐ก 2. ์ ๊ทผ๋ฐฉ์
์์ ํ์
์ฒซ๋ฒ์งธ ํ์์ 1,2,3,4,5 ๋์๊ฐ๋ฉด์ ๋ฐ๋ณต(5๊ฐ์ฉ)
๋๋ฒ์งธ ํ์์ 2,1,2,3,2,4,2,5 ๋์๊ฐ๋ฉด์ ๋ฐ๋ณต(8๊ฐ์ฉ)
์ธ๋ฒ์งธ ํ์์ 3,3,1,1,2,2,4,4,5,5 ๋์๊ฐ๋ฉด์ ๋ฐ๋ณต(10๊ฐ์ฉ)
`๋ชจ๋๋ฌ ์ฐ์ฐ(%)` ํด์ฃผ๊ธฐ
๋ชจ๋๋ฌ ์ฐ์ฐ์ ๋ฐฐ์ด์ ์ํํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ์ฐ์ฐ์ผ๋ก ` i % ๋ฐฐ์ด์ ๊ธธ์ด`๋ฅผ ์ฌ์ฉํ๋ฉด i๊ฐ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋์ด๊ฐ๋๋ผ๋ ๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ค. ๊ทธ๋์ ๊ฐ ํ์๋ง๋ค i ๋ฅผ 5, 8, 10์ผ๋ก ๋๋ ๋๋จธ์ง ๊ฐ๊ณผ answer[i]๋ฅผ ๋น๊ตํ๋ฉด์ ์ผ์นํ๋ฉด ์ ๋ต์ ๋ง์ถ๊ฒ์ผ๋ก ์นด์ดํ
ํ๋ค.
๋ง์ถ ์ ๋ต์ score[] ๋ฐฐ์ด์ ๋ด์ ์ฃผ๋๋ฐ,
0๋ฒ ์ธ๋ฑ์ค๊ฐ ์ฒซ๋ฒ์งธ ํ์์ ์ ์์ด๊ณ ๊ทธ ๋ค๋ก ๋๋ฒ์งธ, ์ธ๋ฒ์งธ ํ์์ ์ ์๊ฐ ๋ด๊ธด๋ค.
์ธ ํ์์ ์ ์๋ฅผ ๋น๊ตํ ๋๋ Math.max ๋ฅผ ์ค์ฒฉํด์ ์ฐ๋ฉด ๋๋ค. 0,1๋ฒ ์ธ๋ฑ์ค ์์ ์๋ ๊ฐ์ ๋น๊ตํด์ ๋์จ ์ต๋๊ฐ์ ๋ค์ 2๋ฒ ์ธ๋ฑ์ค์ ๊ฐ๊ณผ ๋น๊ตํด์ ์ต๋๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค. (๋๋ ์๋์์ ์ฝ๋ ์ฐ๋ค ๋ณด๋ 1,2๋ฒ ๋จผ์ ๋น๊ตํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ 0๋ฒ์ด๋ ๋น๊ตํด ์ฃผ์๋ค.)
๋ง์ง๋ง์ผ๋ก ์ต๋ ์ ์๋ฅผ ๋ฐ์ ์ํฌ์๋ค์ ๋ฒํธ๋ฅผ ๋ฃ์ด ์ค ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ int ํ ๋ฐฐ์ด๋ก ๋ฐํํ ํ ๋ฆฌํดํ๋ค.
์๋๋ int[] answer = new int[?]; ๋ก ์ ์ธํด์ ๋ฐ๋ก ๋ฐํํ ๋ ค๊ณ ํ๋๋ฐ ์๊ฐํด๋ณด๋๊น
๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ชจ๋ฅธ๋ค. ์ ์๊ฐ ์ต๋์ธ ํ์์ ์ซ์๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ผ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์ฐพ์ผ๋ ค๊ณ ์ต๋ ์ ์์ธ ํ์์ ์นด์ดํ
ํด์ cnt์ ๋ด์ ์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ผ for๋ฌธ์ ๋๋ฒ ๋๋ ค์ผ ํด์ ๋ณต์กํ ์ฝ๋๊ฐ ๋๋ค.
โญ 3. ์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int first[] = {1, 2, 3, 4, 5}; // ์ฒซ๋ฒ์งธ
int second[] = {2, 1, 2, 3, 2, 4, 2, 5}; // ๋๋ฒ์งธ
int third[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // ์ธ๋ฒ์งธ
int scores[] = {0, 0, 0}; // ๊ฐ ์ํฌ์๋ค์ ์ ์
// ์ํฌ์๋ค์ ์ ์ ๊ณ์ฐ
for(int i = 0; i < answers.length; i++) {
if(answers[i]==first[i%5]) {scores[0]++;}
if(answers[i]==second[i%8]) {scores[1]++;}
if(answers[i]==third[i%10]) {scores[2]++;}
}
// ์ ์์ ์ต๋๊ฐ ๊ณ์
int max = Math.max(scores[0], Math.max(scores[1],scores[2]));
// ์ต๋ ์ ์๋ฅผ ๋ฐ์ ์ํฌ์ ๋ด์์ค ๋ฆฌ์คํธ ์์ฑ
List<Integer> list = new ArrayList<>();
for(int i = 0; i < scores.length; i++) if(max==scores[i]) list.add(i+1);
// ๋ฆฌ์คํธ๋ฅผ int ํ์
์ ๋ฐฐ์ด๋ก ๋ณํ
int[] answer = list.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
ํ๋ฆฐ ๋ถ๋ถ
1. `if(answers[i]==first[i / 5])` ๋ก ์์ฑํ๋๋ฐ ์๊ฐํด๋ณด๋ ํ๋ ค์` i / 5` ๋์ ` i % 5` ๋ก ์์
2. `list.add(scores[i])` ๋์ `list.add(i+1)`๋ก ์์ ํจ. ์ด ๋ฌธ์ ๋ ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๋ฐ์ ์ฌ๋์ ์ ์๊ฐ ์๋ ๋ฒํธ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ๋ชฉ์
3. `maptoInt()` ๋ผ๊ณ ์๋ชป์จ์ to๋ฅผ ๋๋ฌธ์ To๋ก ์์ ํจ `mapToInt()`
์ฝ๋์์ ๋จ๊ธธ ๋
ธํธ
// ๊ทธ๋ฅ ์ด๋ ๊ฒ ํ ์ค๋ก ์ ์ด๋ ๋จ
if(answers[i]==first[i%5]) {scores[0]++;}
// ์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง
for(int i = 0; i < scores.length; i++) if(max==scores[i]) list.add(i+1);
๋ฆฌ์คํธ๋ฅผ int ๋ฐฐ์ด๋ก ๋ฐํํ ๋ `list.stream().mapToInt(Integer::intValue).toArray();`
// ๋ฆฌ์คํธ๋ฅผ int ํ์
์ ๋ฐฐ์ด๋ก ๋ณํ
int[] answer = list.stream().mapToInt(Integer::intValue).toArray();
๋ฆฌ์คํธ ๋์ answer ๋ฐฐ์ด ์์ฑํด์ ํธ๋ ์ฝ๋
// ๋นํจ์จ์ด๋ผ์ ๋น์ถ์ฒ์ธ๋ฐ ๊ทธ๋ฅ ์ฐ์ต ๊ฒธ ์จ ๋ดค๋ค.
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
// ๊ฐ ์ํ์์ ๋ต์ ํจํด
int[] first = {1, 2, 3, 4, 5};
int[] second = {2, 1, 2, 3, 2, 4, 2, 5};
int[] third = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
// ๊ฐ ์ํ์์ ์ ์
int[] scores = {0, 0, 0};
// ์ฃผ์ด์ง ๋ต์๊ณผ ๋น๊ตํ์ฌ ์ ์ ๊ณ์ฐ
for (int i = 0; i < answers.length; i++) {
if (answers[i] == first[i % 5]) {
scores[0]++;
}
if (answers[i] == second[i % 8]) {
scores[1]++;
}
if (answers[i] == third[i % 10]) {
scores[2]++;
}
}
// ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ตฌํจ
int max = Math.max(scores[0], Math.max(scores[1], scores[2]));
// ์ต๊ณ ์ ์์ ๊ฐ์ ์ ์๋ฅผ ์ป์ ์ฌ๋์ ์๋ฅผ ์
int cnt = 0;
for (int score : scores) {
if (score == max) {
cnt++;
}
}
// ์ต๊ณ ์ ์์ ๊ฐ์ ์ ์๋ฅผ ์ป์ ์ฌ๋ ๋ฒํธ๋ฅผ answer ๋ฐฐ์ด์ ์ ์ฅ
int[] answer = new int[cnt];
int index = 0;
for (int i = 0; i < scores.length; i++) {
if (scores[i] == max) {
answer[index++] = i + 1; // ์ฌ๋ ๋ฒํธ๋ 1๋ถํฐ ์์
}
}
return answer;
}
}
๐๐ป ์ข์์ ์ ์ผ ๋ง์ด ๋ฐ์ ์ฝ๋
import java.util.ArrayList;
class Solution {
public int[] solution(int[] answer) {
int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 1, 2, 3, 2, 4, 2, 5};
int[] c = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] score = new int[3];
for(int i=0; i<answer.length; i++) {
if(answer[i] == a[i%a.length]) {score[0]++;}
if(answer[i] == b[i%b.length]) {score[1]++;}
if(answer[i] == c[i%c.length]) {score[2]++;}
}
int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
ArrayList<Integer> list = new ArrayList<>();
if(maxScore == score[0]) {list.add(1);}
if(maxScore == score[1]) {list.add(2);}
if(maxScore == score[2]) {list.add(3);}
return list.stream().mapToInt(i->i.intValue()).toArray();
}
}
๋๋ ๋น์ทํ๋ฐ ์ฐจ์ด์ ์ ๋ง์ง๋ง์ ๋๋ค์ ์ด ๊ฒ
`list.stream().mapToInt(i->i.intValue()).toArray();`
๊ทธ๋ฆฌ๊ณ ๋๊ธ ๋ณด๊ณ stream ์ฐ๋ฉด ์๊ฐ์ด ๋ง์ด ๋์ด๋๋ ๊ฒ๋ ์๊ฒ ๋์๋ค.
๐๐ป ์ข์์ ๋๋ฒ์ฌ๋ก ๋ง์ด ๋ฐ์ ์ฝ๋ (์ด์ฐจ์ ๋ฐฐ์ด)
์ง์ง ์ต๊ณ ์ธ๋ฏ.... ์ด๋ ๊ฒ ํผ ์ฌ๋๋ค์ ์ฒ์ฌ์ด์ ๊ฐ
import java.util.*;
class Solution {
public static int[] solution(int[] answers) {
int[][] patterns = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] hit = new int[3];
for(int i = 0; i < hit.length; i++) {
for(int j = 0; j < answers.length; j++) {
if(patterns[i][j % patterns[i].length] == answers[j]) hit[i]++;
}
}
int max = Math.max(hit[0], Math.max(hit[1], hit[2]));
List<Integer> list = new ArrayList<>();
for(int i = 0; i < hit.length; i++)
if(max == hit[i]) list.add(i + 1);
int[] answer = new int[list.size()];
int cnt = 0;
for(int num : list)
answer[cnt++] = num;
return answer;
}
}
๊ฐ์ฒด์งํฅ์ ์ผ๋ก ํผ ์ต์ํ๋์ ์ฝ๋
์... ์ง์ง ๋๋จํ์๋ค
ํ๋ก๊ทธ๋๋จธ์ค์์ ์ด๊ฒ๋ ๋์ ๋์ฌ์ ๊ฐ์ ธ์๋ดค๋ค.
import java.util.*;
import java.util.function.IntPredicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public int[] solution(int[] answers) {
return new Students().getBestStudents(
Arrays.stream(answers)
.boxed()
.map(Answer::new)
.collect(Collectors.toList()))
.stream()
.mapToInt(i -> i)
.toArray();
}
private static class Students {
private final List<Student> students;
public Students() {
this.students = new ArrayList<>();
this.students.add(Student.of(1, Arrays.asList(1, 2, 3, 4, 5)));
this.students.add(Student.of(2, Arrays.asList(2, 1, 2, 3, 2, 4, 2, 5)));
this.students.add(Student.of(3, Arrays.asList(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)));
}
public List<Integer> getBestStudents(List<Answer> answers) {
return this.students.stream()
.map(student -> student.getResult(answers))
.collect(Collectors.collectingAndThen(Collectors.toList(), Results::new))
.getBestResults().stream()
.map(Result::getStudentId)
.collect(Collectors.toList());
}
}
private static class Student {
private final Integer id;
private final List<Answer> answerPattern;
public Student(Integer id, List<Answer> answerPattern) {
this.id = id;
this.answerPattern = answerPattern;
}
public static Student of(Integer id, List<Integer> answerPattern) {
return new Student(id, answerPattern.stream()
.map(Answer::new)
.collect(Collectors.toList()));
}
public Result getResult(List<Answer> answers) {
Long correctCount = IntStream.range(0, answers.size())
.filter(isCorrect(answers))
.count();
return new Result(this.id, correctCount.intValue());
}
private IntPredicate isCorrect(List<Answer> answers) {
return index -> {
int patternIndex = index % answerPattern.size();
Answer answer = answerPattern.get(patternIndex);
Answer correctAnswer = answers.get(index);
return answer.isCorrect(correctAnswer);
};
}
}
private static class Results {
private final List<Result> results;
public Results(List<Result> results) {
this.results = results;
}
public List<Result> getBestResults() {
Result bestResult = Collections.max(results);
return results.stream()
.filter(result -> result.isCorrectCountEqualTo(bestResult))
.collect(Collectors.toList());
}
}
private static class Result implements Comparable<Result> {
private final Integer studentId;
private final Integer correctCount;
public Result(Integer studentId, Integer correctCount) {
this.studentId = studentId;
this.correctCount = correctCount;
}
public boolean isCorrectCountEqualTo(Result result) {
return this.correctCount.equals(result.correctCount);
}
public Integer getStudentId() {
return studentId;
}
@Override
public int compareTo(Result o) {
return this.correctCount.compareTo(o.correctCount);
}
}
private static class Answer {
private final Integer answer;
public Answer(Integer answer) {
this.answer = answer;
}
public boolean isCorrect(Answer answer) {
return this.answer.equals(answer.answer);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Answer answer1 = (Answer) o;
return Objects.equals(answer, answer1.answer);
}
@Override
public int hashCode() {
return Objects.hash(answer);
}
}
}
๐๐ป 4. ๊ฐ์ ์ ํ ๋ฌธ์ (์์ ํ์)
'Algorithm > Programmers_Best' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ํผ๋ก๋ (์์ ํ์) (56) | 2024.11.22 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์นดํซ (์์ ํ์) (70) | 2024.11.22 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ต์ ์ง์ฌ๊ฐํ ๋ฌธ์ ํ์ด (์์ ํ์) (33) | 2024.11.15 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ง๊ฒ๋ค๋ฆฌ (์ด๋ถํ์) (42) | 2024.11.15 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ ๊ตญ์ฌ์ฌ ๋ฌธ์ ํ์ด (์ด๋ถํ์) (17) | 2024.11.13 |