Programmers #20

이강용·2023년 6월 10일
0

Programmers

목록 보기
19/58

자릿수 더하기

📑 문1) 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.


제한사항

  • N의 범위 : 100,000,000 이하의 자연수

입출력 예

Nanswer
1236
98724

나의 풀이

package 프로그래머스;

public class AddDigits {
	
	public static int solution(int n) {
        int answer = 0;
        String str = Integer.toString(n);
     
       
        for(int i = 0; i < str.length(); i++) {
        	answer += Integer.parseInt(str.split("")[i]);
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		solution(987);
	}

}

나의 풀이

알고리즘 문제를 풀면서 늘 했던 생각은 틀에 갇혀있는 생각을 자유롭게 생각할 수 있게 놓아주자 이다. 숫자를 숫자로만 보는것이 아닌, 때로는 문자로 나타내면 문제에 대한 답에 더 근접할 수 있다. int형 n을 먼저, Interger.toString() 메서드를 활용하여 문자로 변환해준다. 만약 n = 987 이라면 문자로 변환했을 때의 길이는 3이된다. 따라서 for문 또는 향상된 for문으로 str.length()만큼 순회하여, str.split("") 즉, 한 문자씩 Int형으로 다시 변환하여 +연산의 결과를 answer에 대입한다.


평균 구하기

📑 문2) 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.


제한사항

  • arr은 길이 1 이상, 100 이하인 배열입니다.

  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.


입출력 예

arrreturn
[1,2,3,4]2.5
[5,5]5

package 프로그래머스;

public class Average {
	public static double solution(int[] arr) {
        double answer = 0;
        
        for(int i = 0; i < arr.length; i++) {
        	answer += arr[i];
        }
       
        System.out.println(answer / arr.length);
        return answer / arr.length;
    }
	
	public static void main(String[] args) {
		solution(new int[] {1,2,3,4});
	}
}

자연수 뒤집어 배열로 만들기

📑 문3) 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.


제한 조건

  • n은 10,000,000,000이하인 자연수입니다.

입출력 예

nreturn
12345[5,4,3,2,1]

나의 풀이

package 프로그래머스;

public class NnumberFlip {
	public static int[] solution(long n) {
		String size = Long.toString(n);
		
		int[] answer = new int[size.length()];
		
		for(int i = 0; i < size.length(); i++) {
			answer[i] = Integer.parseInt(size.split("")[size.length()-i-1]);	
		}
        return answer;
    }
	
	public static void main(String[] args) {
		solution(12345);
	}

}

나의 풀이

long 타입의 n의 자리수의 크기(예: 12345 = 5)를 알아야 하기때문에 Long.toString() 메서드를 활용하여 타입을 형변환시켜 자리수의 크기를 구할 수 있다. 그리고 자리수 만큼 순회를 하여, int 배열 answer에 n을 String타입으로 형변환 한 문자n을 잘라서 배열에 넣는데 [size.length() - i - 1] 을 하면 0번 index에 다음과 같은 순서로 배열에 들어간다.

answer[0] = Integer.parseInt(size.split("")[5 - 0 - 1] -> [4]
answer[1] = Integer.parseInt(size.split("")[5 - 0 - 2] -> [3]
answer[2] = Integer.parseInt(size.split("")[5 - 0 - 3] -> [2]
answer[3] = Integer.parseInt(size.split("")[5 - 0 - 4] -> [1]
answer[4] = Integer.parseInt(size.split("")[5 - 0 - 5] -> [0]

즉, answer[0] 번 index부터 형변환한 문자의 마지막 글자부터 차례로 들어간다.


문자열 내 p와 y의 개수

📑 문4) 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.


제한사항

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

입출력 예

sanswer
"pPoooyY"true
"Pyy"false

입출력 예 설명

  • 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.

  • 'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.


나의 풀이

package 프로그래머스;

public class PyNumber {
	
	public static boolean  solution(String s) {
        boolean answer = true;
        int Pcnt = 0;
        int Ycnt = 0;

        String[] strCheck = s.split("");
         
        for(int i = 0 ; i < strCheck.length; i++) {
        	if (strCheck[i].equals("p") ||strCheck[i].equals("P")) {
        		Pcnt++;
        	}else if(strCheck[i].equals("y") ||strCheck[i].equals("Y")) {
        		Ycnt++;
        	}else {
        		answer = true;
        	}
        }
        if(Pcnt == Ycnt) {
        	answer = true;
        }else {
        	answer = false;
        }
        return answer;
    }
	
	public static void main(String[] args) {
		solution("PyY");
	}

}

나의 생각

매개변수 문자 s를 String 배열에 한 글자씩 쪼개어 넣는다. 그 이유는 반복횟수와, 각 문자를 비교하기 위해서이다. 그리고 "p","P","y","Y"를 판별하여, 대소문자 P, 대소문자Y 의 카운트 횟수를 체크하여 카운트 수가 같으면 true, 그렇지않으면 false를 리턴하는 방법을 사용하였다.


정규식을 이용한 풀이

class Solution {
    boolean solution(String s) {
        return s.replaceAll("[^yY]", "").length() == s.replaceAll("[^pP]", "").length();
    }
}

나의 생각

정규식을 사용하여 s.replaceAll() 메서드를 사용하여, ^yY, ^pP -> "" , 즉, yY,pP 문자를 제외한 모든 문자를 ""로 대체하여, 문자에서 yY,pP의 길이만을 비교하는 간단한 방법이다. 매번 느끼는 생각이지만, 내가 구현하기 쉬운 방법만을 생각하고, 알고리즘 문제를 푸는거같은데, 늘 새로운 사고와 다른 메서드를 활용하여 문제를 푸는 기계적인 학습에서 더 논리적으로 사고하는 습관을 기르도록 노력해야겠다.


정수 제곱근 판별

📑 문5) 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.


제한 사항

  • n은 1이상, 50000000000000 이하인 양의 정수입니다.

입출력 예

nreturn
121144
3-1

나의 풀이

package programmers;

public class SquareRoot {
	
	public static long solution(long n) {
        long answer = 0;
 
        for(long i = 1; i <= n; i++) {
        	if(n % i == 0) {
        		if(i * i == n) {
        			answer = (i+1) * (i+1);
        			break;
        		}else {
        			answer = -1;
        		}
        	}
        }
        return answer;
    }
	
	public static void main(String[] args) {
		solution(121);
	}

}

나의 생각

시간복잡도를 생각안한 문제 풀이여서 시간 복잡도를 생각하여 문제를 다시 풀었다.

package programmers;

public class SquareRoot {
    public static long solution(long n) {
        long sqrt = (long) Math.sqrt(n);

        if(sqrt * sqrt == n)
            return (sqrt+1) * (sqrt+1);
        else
            return -1;
    }

    public static void main(String[] args) {
        System.out.println(solution(500000000));
    }
}

처음에는 long 타입으로 변환을 시키면, 정수가 딱 맞게 떨어지는게 아니라면, 소숫점 부분이 버려지게 되는데 이를 이를 이용하면 정확한 값이 안나오겠다는 1차원적인 생각으로 for문으로 문제를 풀었다. 하지만 다시 생각해본 결과, sqrt * sqrt == 매개변수 n 로직을 풀면 간단히 생각할 수 있는 문제 였다.


profile
HW + SW = 1

0개의 댓글