본문 바로가기

코딩 테스트 문제 풀이/프로그래머스 lv 0

프로그래머스 코딩 테스트(lv 0) 문제 풀이 - 3

옷가게 할인받기

class Solution {
    public int solution(int price) {
        double answer = 0;
        if(price >= 100000 && price < 300000){
            answer = price * 0.95;
        }else if(price >= 300000 && price < 500000){
            answer = price * 0.9;
        }else if(price >= 500000){
            answer = price * 0.8;
        }else{
            answer = price;
        }
        return (int)(Math.floor(answer));
    }
}

삼항 연산자를 사용하면 간단하게 나타낼 순 있지만, 가독성이 조금 떨어지는 것 같아 조건문으로 처리했다.

채점 시, 자꾸 오류가 발생했는데 확인 결과 2가지 이유가 있었다.

 

1. 소수점 이하 자리를 버리지 않음.

2. 10만원이하의 조건에 대한 처리가 되어 있지 않음.

 

문제에 많은 조건이 달려있거나, 소수점 이하 자리를 활용해야하는 경우 좀 더 꼼꼼히 살필 필요가 있다.

 

 

순서쌍의 개수

class Solution {
    public int solution(int n) {
        int answer=0;
        for(int i=1;i<=n;i++){
            if(n%i==0)
                answer++;
        }
        return answer;
    }
}

 

 

중앙값 구하기

import java.util.*;

class Solution {
    public int solution(int[] array) {
        Arrays.sort(array);
        return array[(array.length/2)];
    }
}

 

 

제곱수 판별하기

class Solution {
    public int solution(int n) {
        for(int i=1; i*i<=n;i++){
            if(i*i==n){
                return 1;
            }
        }
        return 2;
    }
}

조건문을 돌려 제곱수를 판별하고자 했으나, 제곱근을 반환해주는 Math.sprt() 메서드를 이용했으면 더 간단했을 것이다.

 

 

모음 제거

class Solution {
    public String solution(String my_string) {
        String answer = "";
        String[] list = {"a","e","i","o","u"};
        
        for(int i=0; i<list.length;i++){
            if(my_string.contains(list[i])){
                answer = my_string.replace(list[i],"");
                my_string = answer;         
            }
        }   
        return my_string;
    }
}

문자 또는 문자열에 대한 내부함수를 많이 알고 있어야할 듯 하다.

정규표현식을 사용하는 replaceAll 메서드를 이용했다면 조건문 없이 간단히 나타낼 수 있었을 것이다.

 

 

숨어있는 숫자의 덧셈 (1)

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        my_string = my_string.replaceAll("[^0-9]","");
        
        for(int i = 0; i < my_string.length();i++){
            answer += Integer.parseInt(String.valueOf(my_string.charAt(i)));
        }
        return answer;
    }    
}

정규표현식을 사용하여 숫자만 추출한 후, string > char > int 로 형변환해서 합산했다.

변수 타입간의 형변환을 막힘없이 사용할 수 있도록 연습이 필요하다.

 

 

 개미 군단

class Solution {
    public int solution(int hp) {
        int answer = hp / 5 + hp % 5 / 3 + hp % 5 % 3;
        return answer;
    }
}

 

 

세균 증식

class Solution {
    public int solution(int n, int t) {
        for(int i = 0; i < t; i++){
            n = (n * 2);
        }
        return n;
    }
}

 

 

직각삼각형 출력하기

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String star = "";
        for(int i=0; i<n; i++){
            star += "*";
            System.out.println(star);
        }
    }
}

 

 

문자열 정렬하기 (1)

import java.util.*;

class Solution {
    public int[] solution(String my_string) {
        my_string = my_string.replaceAll("[^0-9]","");
        int[] answer = new int[my_string.length()];
        
        for(int i = 0; i < my_string.length(); i++){
            answer[i] = Integer.parseInt(String.valueOf(my_string.charAt(i)));
          //answer[i] = my_string.charAt(i) - '0';
        }
        Arrays.sort(answer);
        return answer;
    }
}

정규식과 형변환이 중요했던 문제이다.

char를 int형으로 출력하면 해당 문자의 아스키 코드가 출력된다.

문자 '0'의 아스키코드가 48이라는 점을 이용하여, 문자 0을 빼주면 문자를 숫자로 변환할 수 있다.

ex)  '9' - '0' = 9  // 9의 아스키코드 57에서 0의 아스키코드 48을 뺀 값.

 

 

n의 배수 고르기

import java.util.ArrayList;

class Solution {
    public ArrayList<Integer> solution(int n, int[] numlist) {
        ArrayList<Integer> arr = new ArrayList();
        for(int i = 0 ; i < numlist.length ;i++){
            if(numlist[i]%n==0){
                arr.add(numlist[i]);
            }
        }
        return arr;
    }
}

향상된 for문을 사용해서 더 간단한 코드를 구현할 수 있었을 것이다.

 

 

대문자와 소문자

class Solution {
    public String solution(String my_string) {
        String answer = "";
        for(int i = 0; i < my_string.length(); i++){
            if(Character.isUpperCase(my_string.charAt(i))){
                answer += String.valueOf(my_string.charAt(i)).toLowerCase();
            }else{
                answer += String.valueOf(my_string.charAt(i)).toUpperCase();
            }
        }
        return answer;
    }
}

해당 문자가 대문자인지, 소문자인지 판별하는 내부함수가 있는지 검색해보았다.

isUpperCase, isLowerCase 메서드를 사용하면 해당 문자의 대소문자를 구분할 수 있다.

 


3주차 후기

문자열 > 문자 // 문자 > 숫자 로의 형변환을 사용하는 문제가 많았다.

여러가지 타입을 다룰 수 있도록 오버로딩되어있는 valueOf() 메서드에 대해서 기억해두어야겠다.

 

기본형으로의 변환은 parse~~메서드를 많이 이용하므로 기억해둘 필요가 있을 것 같다.

 

시간이 오래 걸리다가도, 턱없이 간단한 코드로 문제가 풀리는 경우가 많았다.

문제를 읽고 바로 풀려고 하기보다, 해결 방법을 머릿 속으로 그려보고 좀 더 쉽게 풀 수 있는 방법은 없는지 고민해 봐야 겠다. 

 

3주차 초반은 코딩 테스트 문제를 풀지 못했는데, 문제 해결 능력이 많이 떨어진 것을 느꼈다.

한꺼번에 많은 양을 풀기 보다, 적게 풀더라도 매일 매일 한 두 문제씩이라도 풀어보려고 노력해야겠다.