티스토리 뷰

IT/Lv0

프로그래머스 문제풀이 Level 0

Stv 2022. 12. 14. 13:54

목차


    안녕하세요 
    원하는 회사에 입사하기 위해서는 알고리즘 공부가 필요하다는 걸 알면서도 마냥 두렵기만 해서 차일피일 미루기만 했었는데요
    이제는 피할 수만은 없다는 생각이 들어서 공부를 시작하게 되었습니다.
    공부를 하게 된 계기는 어느 개발자분의 블로그에 알고리즘 공부는 필수다라는 주제로 포스팅 되어 있는 글을 보면서 알고리즘 공부를 실천하게 되었습니다. 
    해당 글에서는 알고리즘 공부의 필요성, 효과적인 공부방법 등 여러가지 주제의 글들이 있었는데 읽는 내내 제 자신에게 따끔한 채찍과, 공부를 하게 해줄 용기를 북돋아 주었습니다.

    공부를 시작하기에 앞서 공부를 하게 만드는 룰을 정해놓고 시작하자라고 생각했는데 
    더도 말고 덜도 말고 딱 하루에 한 문제만 풀자고 스스로 분량을 정했고 풀이한 문제와 답은 꼭 블로그에 올리기로 결심했습니다.
    분량이 적어 보인다고 하실 수도 있는데 욕심부려서 분량을 많이 정해놓고 시작하면 되래 쉽게 지칠까봐 정말 할 수 있는 양을 생각하여 결정하였습니다.
    빗방울이 바위를 뚫음은 강인함이 아니라 꾸준함이라고 했습니다. (수적석천/水滴石穿)) 제 자신을 빗방울이라고 생각하고 한번 꾸준히 바위를 뚫어보려고 합니다.!

    제 실력이 Level 0도 간당간당한 실력이라서 아직은 고난이도에 문제는 생각도 못하는 수준입니다..
    단계를 올라가면서 포스팅을 나눠 할 생각이고 낮은 단계의 문제들은 한꺼번에 포스팅 할 계획입니다.

    오늘 첫 번째로 풀은 문제를 시작으로 해서 꾸준히 포스팅 하도록 하겠습니다!

     

    1. 잘라서 배열로 저장하기

    👉 소스코드

    	public static String[] solution(String my_str, int n) {
    		int index = my_str.length() % n == 0 ? my_str.length() / n : my_str.length() / n + 1;
    
    		String[] answer = new String[index];
    		int cnt = 0;
    		for (int i = 0; i <= answer.length - 1; i++) {
    			if (i != answer.length - 1) {
    				answer[i] = my_str.substring(cnt, cnt + n);
    				cnt += n;
    			} else if (i == answer.length - 1) {
    				answer[i] = my_str.substring(cnt);
    			}
    		}
    		return answer;
    	}

    - 인자로 받은 n을 이용해서 카운팅 하느라 쓸데없이 시간을 낭비했습니다.
    카운팅 할 변수를 따로 선언하고 cnt 변수를 가지고 index 삼아 활용하니 간단한 문제였습니다.
    하지만 문제를 풀고 다른 사람들의 코드를 보고 좌절했습니다,, 

    저도 어서 클린 코드를 구사하고 싶다는 생각이 제 머릿속을 가득 매웠습니다

     

    2. 7의 개수

    👉 소스코드

    public static int solution(int[] array) {
            int answer = 0;
            String[] strArray = new String[array.length];
            for(int i = 0 ; i < strArray.length; i++) {
            	strArray[i] = String.valueOf(array[i]);
            }
            String intStr = "";
            for(int i = 0; i < strArray.length; i++) {
            	intStr += strArray[i].replaceAll("[^7]", "");
            }
            answer = intStr.length();
            return answer;
        }

    - 나머지 연산자를 이용하면 쉽게 풀 수 있을거 같았는데 도저히 생각나지 않아서 그냥 문자열로 변환한 뒤, 7만 잘라서 스트링에 이어붙혀서 해결했다.

     

    3. 문자열 정렬하기(2)

    👉 소스코드

    	public static String solution(String my_string) {
    		String[] strArray = my_string.split("");
    		Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
    		String answer = "";
    		for (int i = 0; i < strArray.length; i++) {
    			answer += strArray[i].toLowerCase();
    		}
    		System.out.println(answer);
    		return answer;
    	}

    - for문을 돌리지 않고 풀고 싶었는데 for문을 돌리고야 말았다,, 소문자로 먼저 변경해서 비교하면 됐었던 문제였다

     

    4. 세균 증식

    👉 소스코드

    public static int solution(int n, int t) {               
            return (int) Math.pow(2, t) * n;
        }

    5. 제곱수 판별하기

    👉 소스코드

    	public static int solution(int n) {
    		int tmp = (int) Math.sqrt(n);
    		return tmp * tmp == n ? 1 : 2;
    	}

    6. 문자열안에 문자열

    👉 소스코드

    public static int solution(String str1, String str2) {           
            return str1.contains(str2) ? 1 : 2;
        }

    7. OX퀴즈

    👉 소스코드

    	public static String[] solution(String[] quiz) {
    		String[] answer = new String[quiz.length];
    		String[] tmp = new String[quiz.length];
    		for (int i = 0; i < quiz.length; i++) {
    			tmp = quiz[i].split(" ");
    			if (tmp[1].equals("-")) {
    				if (Integer.parseInt(tmp[0]) - Integer.parseInt(tmp[2]) == Integer.parseInt(tmp[4])) {
    					answer[i] = "O";
    				} else {
    					answer[i] = "X";
    				}
    			}
    			if (tmp[1].equals("+")) {
    				if (Integer.parseInt(tmp[0]) + Integer.parseInt(tmp[2]) == Integer.parseInt(tmp[4])) {
    					answer[i] = "O";
    				} else {
    					answer[i] = "X";
    				}
    			}
    		}
    		return answer;
    	}

    - 문제를 어렵사리 풀어보고 타인의 코드를 보니 실제로 형변환을 해서 값을 비교했으면 코드를 좀 더 줄일 수 있었다.

    8.  자릿수 더하기

    👉 소스코드

    public int solution(int n) {
    		int answer = 0;
    		char[] tmp = String.valueOf(n).toCharArray();
    		for (int i = 0; i < tmp.length; i++) {
    			answer += Character.getNumericValue(tmp[i]);
    		}
    		return answer;
    	}

    9.  n의 배수 고르기

    👉 소스코드

    	public int[] solution(int n, int[] numlist) {
    		int[] array = new int[numlist.length];
    		int cnt = 0;
    		for (int i = 0; i < numlist.length; i++) {
    			if (numlist[i] % n == 0) {
    				array[cnt] = numlist[i];
    				cnt++;
    			}
    		}
    		int[] answer = new int[cnt];
    		for (int i = 0; i < cnt; i++) {
    			answer[i] = array[i];
    		}
    		return answer;
    	}

    - 배열은 추가, 삭제 개념이 없다. 다른 방법으로도 풀 수 있지만 간단하게 배열 두개를 이용해서 출력 값을 삭제한 것처럼 보여주면 되는 문제

    10.  숫자 찾기

    👉 소스코드

    public int solution(int num, int k) {
    		int answer = 0;
    		boolean flag = false;
    		String[] tmp = Integer.toString(num).split("");
    		String s = Integer.toString(k);
    		for (String string : tmp) {
    			answer++;
    			if (string.equals(s)) {
    				flag = true;
    				break;
    			}
    		}
    		if (flag == false)
    			answer = -1;
    		return answer;
    	}

    11.  배열의 유사도

    👉 소스코드

    	public int solution(String[] s1, String[] s2) {
    		int answer = 0;
    		for (int i = 0; i < s1.length; i++) {
    			for (int j = 0; j < s2.length; j++) {
    				if (s1[i].equals(s2[j])) {
    					answer++;
    				}
    			}
    		}
    		return answer;
    	}

    12. 문자열 계산하기

    👉 소스코드

    public int solution(String my_string) {
    		String[] tmp = my_string.split(" ");
    		int answer = Integer.parseInt(tmp[0]);
    		for (int i = 0; i < tmp.length; i++) {
    			if (i % 2 != 0) {
    				if (tmp[i].equals("+")) {
    					answer += Integer.parseInt(tmp[i+1]); 
    				} else {
    					answer -= Integer.parseInt(tmp[i+1]);
    				}
    			}
    		}			
    		return answer;
    	}

    13. 가장 큰 수 찾기

    👉 소스코드

    public int[] solution(int[] array) {
    		int[] answer = new int[2];
    		for (int i = 0; i < array.length - 1; i++) {
    			if (array[i] < array[i + 1]) {
    				answer[0] = array[i + 1];
    				answer[1] = i + 1;
    			}
    		}
    		return answer;
    	}

    14. 편지

    👉 소스코드

    	public int solution(String message) {
    		return message.length() * 2;
    	}

    15. 약수 구하기

    👉 소스코드

    	public int[] solution(int n) {
    		int cnt = 0;
    		int[] tmp = new int[n];
    		for (int i = 1; i < n; i++) {
    			if ((n / i) * i == n) {
    				tmp[cnt] = i;
    				cnt++;
    			}
    		}
    		cnt++;
    		tmp[cnt - 1] = n;
    		int[] answer = new int[cnt];
    		for (int i = 0; i < answer.length; i++) {
    			answer[i] = tmp[i];
    		}
    		return answer;
    	}

    16. 한 번만 등장한 문자

    👉 소스코드

    public String solution(String s) {
    		String answer = "";
    		String res = "";
    		String[] tmp = s.split("");
    		String[] result = new String[res.length()];
    		for (int i = 0; i < tmp.length; i++) {
    			if (!res.contains(tmp[i])) {
    				res += tmp[i];
    			}
    		}
    		for (int i = 0; i < res.length(); i++) {
    			if (s.indexOf(res.charAt(i)) == s.lastIndexOf(res.charAt(i))) {
    				answer += res.charAt(i);
    			}
    		}
    		char[] lastTemp = answer.toCharArray();
    		for (int i = 0; i < answer.length(); i++) {
    			for (int j = 0; j < answer.length(); j++) {
    				if (lastTemp[i] < lastTemp[j]) {
    					char x = lastTemp[i];
    					lastTemp[i] = lastTemp[j];
    					lastTemp[j] = x;
    				}
    			}
    		}
    		String lastResult = new String(lastTemp);
    		return lastResult;
    	}

    - 문자열과 배열만을 이용해서 풀이하려다보니 쓸데없이 코드가 길어지고 시간이 오래걸렸다. 난이도가 조금씩 올라갈수록 기존에 활용하던 자료형으로는 풀이하는데 한계가 있으니 ArrayList를 활용해야겠다.

    17. 인덱스 바꾸기

    👉 소스코드

    public String solution(String my_string, int num1, int num2) {
    		char[] temp = my_string.toCharArray();
    		char[] res = new char[temp.length];
    		for (int i = 0; i < temp.length; i++) {
    			res[i] = temp[i];
    			if (i == num1)
    				res[num1] = temp[num2];
    			if (i == num2)
    				res[num2] = temp[num1];
    		}
    		String answer = new String(res);
    		return answer;
    	}