재밌고 어려운 IT를 이해해보자~!

코딩테스트 풀어보기! 본문

알고리즘

코딩테스트 풀어보기!

언제나즐거운IT 2024. 5. 28. 23:47

 

찍신찾기[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