배민 코테 201108

ims·2020년 11월 7일
0

알고리즘

목록 보기
12/23
post-thumbnail

전체적인 리뷰

일단 먼저 '논리'로 풀되, 구현 아이디어가 떠오르면 적어놔도 된다. 그러나 일단 논리가 다 갖추어지면 구현으로 가는 것.

확실히 Coding을 구현하는데에 익숙하지가 않다. 문제 풀이를 할 때 문제의 section을 미리 나누어 놓고, 미리 풀어놓은 다음에 코딩으로 구현을 하는 아이디어는 매우 좋다. 그러나 좀 더 아이디어 풀이와, 실제 구현을 명확히 구분한 다음에 접근해야 할 필요는 있다.

--> 단순히 문제 이해와 적당한 풀이로부터의 시작이 아니고, 먼저 아이디어로 확실히 문제를 풀고 접근할 것.

준비 안돼있다고 생각이 드는게 일단 패착의 가장 큰 원인인 것같다. 역시 매일 적어도 2-3문제의 알고리즘 문제를 풀어야 하는 것 같다.

이차원 배열이나 그래프 관련 문제는 확실히 자신감이 없다. 이쪽 관련해서 준비를 해봐야할 것 같다.

1번

문제

A+, A, ... F 까지 각각 점수가 있다.

각 학점은 A+ = 10, 이런식으로 점수가 있고 여기에 가중치가 또 있어서 곱한 값이 점수다.

그리고 마지막에 졸업점수라며 빼줄 값이 들어온다.

처음에 프로그래머스라는 것을 까먹고 입력 값이 어떻게 들어오는 지 생각을 아예 안하고 있었어서, 얼타면서 한시간을 날렸다.

처음 짰던 코드

public class number1 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();

        String [] array = s.split("]");

        String firstString = array[0] + "]";

        String firstStringArray = array[0].substring(1, array[0].length()-1);

        String[] firstSplit = firstStringArray.split(",");

        String secondString = array[1].substring(1, array[1].length());

        String[] secondSplit = secondString.split(",");

        int[] secondSplitArray = new int[secondSplit.length];

        for(int i=0;i<secondSplit.length;i++){
            secondSplitArray[i]= Integer.parseInt(secondSplit[i]);
        }

        int testInt[] = new int[firstSplit.length];

            for(int i=0;i< firstSplit.length;i++){
                switch (firstSplit[i]){
                    case "A+": testInt[i]=10;
                          break;
                    case "A0": testInt[i]=9;
                          break;
                    case "B+": testInt[i]=8;
                        break;
                    case "B0": testInt[i]=7;
                       break;
                    case "C+": testInt[i]=6;
                       break;
                    case "C0": testInt[i]=5;
                        break;
                    case "D+": testInt[i]=4;
                        break;
                    case "D0": testInt[i]=3;
                        break;
                    case "F": testInt[i]=0;
                        break;
                }
            }

            int[] result = new int[secondSplitArray.length];

            for(int i=0;i<secondSplitArray.length;i++){
                result[i] = secondSplitArray[i]*testInt[i];
            }

            int resultValue =0;

            for(int i:result){
                resultValue+=i;
            }

            int threshold = Integer.parseInt(array[2]);

        System.out.println(resultValue-threshold);

    }
}
  • 값이 [A+,B,C+,F][15,10,5,0]40 이런식으로 들어오는 줄 알았었다. 그래서 값을 짜르고, 짜른 값들을 String -> int로 다시 짜르고 변환한 다음에 하려고 했었다.

  • str.SubString(), str.split(), int 배열에 대해서 다시 알아보고 생각해볼 것.

    class Solution {
        public int solution(String[] grades, int[] weights, int threshold) {

            int gradeToInt[] = new int[grades.length];

            for(int i=0;i< grades.length;i++){
                switch (grades[i]){
                    case "A+": gradeToInt[i]=10;
                        break;
                    case "A0": gradeToInt[i]=9;
                        break;
                    case "B+": gradeToInt[i]=8;
                        break;
                    case "B0": gradeToInt[i]=7;
                        break;
                    case "C+": gradeToInt[i]=6;
                        break;
                    case "C0": gradeToInt[i]=5;
                        break;
                    case "D+": gradeToInt[i]=4;
                        break;
                    case "D0": gradeToInt[i]=3;
                        break;
                    case "F": gradeToInt[i]=0;
                        break;
                }
            }

            int multipleInt[] = new int[grades.length];

            for(int i=0;i< grades.length;i++){
                multipleInt[i] = gradeToInt[i]*weights[i];
            }

            int result = 0;

            for(int i : multipleInt){
                result += i;
            }

            result = result-threshold;
            return result;
        }
    }

2번

문제

String "942123" 이런식으로 주어지고, operator가 주어진다. 주어진 operator가 만약 + 라면 9 + 42123 , 94+2123, 942+123 , 9421+23, 94212+3 이렇게 처음부터 하나씩 자리가 커지면서 연산이 되는 값을 return하라. (operator는 +,-,*만 존재)

정답

    class Solution {
        public long[] solution(String s, String op) {
            long result[] = new long[s.length()-1];


            for(int i=1;i<s.length();i++){
                String s1 = s.substring(0,i);
                String s2 = s.substring(i,s.length());

                int i1 = Integer.parseInt(s1);
                int i2 = Integer.parseInt(s2);


                switch (op){
                    case "+":
                        result[i-1]= Long.valueOf(i1+i2);
                        break;
                    case "*":
                        result[i-1]= Long.valueOf(i1*i2);
                        break;
                    case "-":
                        result[i-1]= Long.valueOf(i1-i2);
                        break;
                }
            }

          return result;
        }
    }
  • String -> int : Integer.parseInt

  • Long -> Long.valueOf

subString

  1. subString(3) -> 3번째 인덱스부터 값 가져와라
  2. subString(0,4) -> 숫자의 차이만큼 갯수를 가져온다고 생각하면 편하다.
    뒤에꺼 전까지 가져온다.

str.split(" ")

public class StrPractice {
    public static void main(String[] args) {
        String str1 = "012 345 678 9";

       String[] str2= str1.split(" ");

       for(String s : str2){
           System.out.println(s);
       }
    }
}
  1. 자른 것은 없어진다.

  2. 배열을 따로 선언하지 않아도, 알아서 생성해준다음에 값을 집어넣어 준다.

3번

문제

100원부터 시작, 따면 2배 얻고, 잃으면 그 다음에 2배씩 걸음. 만약 돈이 부족하다면 전 재산건다. 0원 되면 바로 종료.

TEST CASE

String[] expected = {"H", "T", "H", "T", "H", "T", "H"};
String[] actual = {"T", "T", "H", "H", "T", "T", "H"};

int multiply = 1;

int money = 1000;
    class Solution {
        public int solution(int money, String[] expected, String[] actual) {

            int multiply = 1;

            for (int i = 0; i < actual.length; i++) {
                if (money <= 0) {
                    money = 0;
                    break;
                }

                int battingMoney = 100 * multiply;

                if (money < battingMoney) {
                    battingMoney = money;
                }

                if (expected[i].equals(actual[i])) {
                    money = money + battingMoney;
                    multiply = 1;
                }
                if (!expected[i].equals(actual[i])) {
                    money = money - battingMoney;
                    multiply = multiply * 2;
                }
            }
            return money;
        }
    }
  1. String == 로 비교하니까 틀렸음. equals()로 해야한다.

  2. 이게 처음에 명시해놓은 대충 풀어놓고 구현에 뛰어든 문제. 구현과 풀이를 동시에 생각하려고 할 때, 헷갈리면 버퍼링이 심하게 걸린다.

5번

문제

data를 penter.length만큼 분할해서, penter,pexit,pesacpe와 값이 겹치면 그 값 앞에 pescape를 붙여준다. 마지막에 penter를 맨 앞에, pexit값을 맨 마지막에 붙여서 return 할 것.

TEST CASE

String penter = "1100";
String pexit = "0010";
String pescape = "1001";
String data = "1101100100101111001111000000";
class Solution {
    public String solution(String penter, String pexit, String pescape, String data) {
        int size = data.length()/penter.length();

        String[] splitData = new String[size];

        for(int i=0;i<size;i++){
            splitData[i] = data.substring(i*penter.length(),i*penter.length()+penter.length());
        }

        for(int i=0;i<splitData.length;i++){
            if(splitData[i].equals(penter) || splitData[i].equals(pexit) || splitData[i].equals(pescape)){
                splitData[i] = pescape+splitData[i];
            }
        }

        String newData = "";

        for(String i : splitData){
            newData += i;
        }

        newData = penter + newData + pexit;

       return newData;

    }
}
  1. subString 관련해서 헷갈렸다.
profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글