재밌고 어려운 IT를 이해해보자~!
코딩테스트 풀어보기! 본문
찍신찾기[JAVA]
※문제이해
{key:value,key:value}2 개의 map 을 포함한 요소로 이루어진 배열 arr이 정답지로 넘어갈때,
가장 점수가 높은 사람의 이름과 점수를"이름:정수"형태로 return
시험 응시자는
1 번으로 모두찍은 a
3 번으로 모두 찍은 b
5 번으로 모두 찍은 c
총 세명
※로직정리
입력 문자열에 대해서 정규표현식을 사용해 숫자만 배열에 대입
해당 배열을 순회하며 정답이 맞으면 해당 번호를 찍은 응시자 점수 증가
응시자 점수중 최대값을 찾아 해당 점수를 받은 응시자의 이름과 점수를“이름:점수”형태로 출력
※코드[JAVA]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 사용자 입력
String input = scan.nextLine();
Main main = new Main();
main.solution(input);
}
public String solution(String input) {
// 출력할 문자열 변수 초기화
String output = "";
// 가장 높은 점수를 저장할 변수 초기화
int max = 0;
// 시험 응시자의 점수를 저장할 배열 선언 및 초기화
int[] scoreArray = new int[3];
scoreArray[0] = 0;
scoreArray[1] = 0;
scoreArray[2] = 0;
// 입력받은 문자열을 숫자를 제외한 문자를 기준으로 잘라서 배열에 대입
String[] numbers = input.split("[^0-9]+");
// System.out.println(Arrays.toString(numbers));
// 배열을 순회하며 정답이 맞으면 해당 번호를 찍은 응시자 점수 증가
// numbers 배열에 첫번째 요소는 공백이기 때문에 i 는 1부터 시작
// answer확인을 위해 i는 2씩 증가
for (int i = 1; i < numbers.length; i += 2) {
if (Integer.parseInt(numbers[i]) == 1) {
scoreArray[0] += Integer.parseInt(numbers[i + 1]);
}
if (Integer.parseInt(numbers[i]) == 3) {
scoreArray[1] += Integer.parseInt(numbers[i + 1]);
}
if (Integer.parseInt(numbers[i]) == 5) {
scoreArray[2] += Integer.parseInt(numbers[i + 1]);
}
}
// 응시자의 점수중 최댓값을 max에 대입
for (int i = 0; i < scoreArray.length; i++) {
if (scoreArray[i] > max) {
max = scoreArray[i];
}
}
// 가장 점수가 높은 응시자의 이름과 점수를 “이름 : 점수” 형태로 출력
// 이떄 맞은게 없으면 출력 X
// 출력할게 1개 이상이면 "," 추가
System.out.print(" > ");
if (scoreArray[0] != 0 && scoreArray[0] == max) {
output = "a:" + scoreArray[0];
}
if (scoreArray[1] != 0 && scoreArray[1] == max) {
if (output.isBlank()) {
output = "b:" + scoreArray[1];
} else {
output = output.concat(", b:" + scoreArray[1]);
}
}
if (scoreArray[2] != 0 && scoreArray[2] == max) {
if (output.isBlank()) {
output = "c:" + scoreArray[2];
} else {
output = output.concat(", c:" + scoreArray[2]);
}
}
System.out.println(output);
return output;
}
}
public int solution(String input) {
// 출력할 문자열 변수 초기화
String output = "";
// 최소공배수의 합을 저장할 변수 초기화
int totalValue = 0;
// 입력받은 문자열을 숫자를 제외한 문자를 기준으로 잘라서 배열에 대입
String[] numbersStrArr = input.split("[^0-9]+");
// 첫번째 원소 제거
numbersStrArr = Arrays.copyOfRange(numbersStrArr, 1, numbersStrArr.length);
// System.out.println(Arrays.toString(numbersStrArr));
// 배열을 int형으로 형변환
int[] numbersIntArr = new int[numbersStrArr.length];
for (int i = 0; i < numbersStrArr.length; i++) {
numbersIntArr[i] = Integer.parseInt(numbersStrArr[i]);
}
output += "( ";
// 마지막 원소끼리는 계산을 안해도 되기 떄문에 마지막 원소 전가지 순회
for (int i = 0; i < numbersIntArr.length - 1; i++) {
// 첫번째 원소 다음것 부터 계산
for (int j = i + 1; j < numbersIntArr.length; j++) {
// 최소공배수 계산을 위한 새로운 변수 num1, num2에 대입
int num1 = numbersIntArr[i];
int num2 = numbersIntArr[j];
// 최소공배수를 저장할 변수
int leastCommonMult = 1;
// 공약수 1은 의미가 없으므로 2부터 시작
int divideNum = 2;
// 최소공약수를 게산할 두 숫자중 한개보다 divideNum이 커지기 전까지 반복
while (divideNum < num1 || divideNum < num2) {
// 만약 공약수라면
if (num1 % divideNum == 0 && num2 % divideNum == 0) {
// divideNum으로 나누고
num1 /= divideNum;
num2 /= divideNum;
// 해당 divideNum을 변수에 곱하기
leastCommonMult *= divideNum;
}
// divideNum 1 증가
divideNum++;
}
// 반복이 끝나면 더이상 공약수가 없는 서로소들을 최소공배수에 곱하기
leastCommonMult *= num1 * num2;
// 출력을 위한 코드
if (i == numbersIntArr.length - 2) { // 마지막 출력시 "+" 추가 X
output += "{" + numbersIntArr[i] + "|" + numbersIntArr[j] + "} > " + leastCommonMult;
} else {
output += "{" + numbersIntArr[i] + "|" + numbersIntArr[j] + "} > " + leastCommonMult + " + ";
}
// 최소공배수 모두 더하기
totalValue += leastCommonMult;
}
}
output += " ) = " + totalValue;
System.out.println(output);
// 최소공배수를 합한 값 리턴
return totalValue;
}
public int solution(int input) {
// 소수를 모두 합한 변수 초기화
// input은 최소 4부터 주어지기에 소수 2,3을 더한값으로 초기화
int primeNumTotal = 5;
// 4부터 input값까지 순회하며 반복
for (int i = 4; i <= input; i++) {
// 소수인지 확인을 위한 변수 초기회
int divideCnt = 0;
// 1과 자기자신은 무조건 나눴을때 나머지가 0이기에 제외
for (int j = 2; j < i; j++) {
// 나눴을때 나머지가 0이되는 숫자가 있는지 확인
if (i % j == 0) {
divideCnt++;
}
}
// 나눠지는 숫자가 없었다면 i는 소수이기에 총합에 더하기
if (divideCnt == 0) {
primeNumTotal += i;
}
}
System.out.print("> " + primeNumTotal);
// 모든 소수의 합 리턴
return primeNumTotal;
}
'알고리즘' 카테고리의 다른 글
소유주가 다른 땅에서 가장 큰 'ㄷ' 모양 찾기 (0) | 2024.10.24 |
---|---|
타일채우기 재귀 알고리즘 (0) | 2024.08.10 |
[백준] 2775 (0) | 2024.05.26 |
[백준] 1010 (0) | 2024.05.25 |
[백준] 17287 (0) | 2024.05.19 |
Comments