일단 먼저 '논리'로 풀되, 구현 아이디어가 떠오르면 적어놔도 된다. 그러나 일단 논리가 다 갖추어지면 구현으로 가는 것.
확실히 Coding을 구현하는데에 익숙하지가 않다. 문제 풀이를 할 때 문제의 section을 미리 나누어 놓고, 미리 풀어놓은 다음에 코딩으로 구현을 하는 아이디어는 매우 좋다. 그러나 좀 더 아이디어 풀이와, 실제 구현을 명확히 구분한 다음에 접근해야 할 필요는 있다.
--> 단순히 문제 이해와 적당한 풀이로부터의 시작이 아니고, 먼저 아이디어로 확실히 문제를 풀고 접근할 것.
준비 안돼있다고 생각이 드는게 일단 패착의 가장 큰 원인인 것같다. 역시 매일 적어도 2-3문제의 알고리즘 문제를 풀어야 하는 것 같다.
이차원 배열이나 그래프 관련 문제는 확실히 자신감이 없다. 이쪽 관련해서 준비를 해봐야할 것 같다.
문제
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;
}
}
문제
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
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);
}
}
}
자른 것은 없어진다.
배열을 따로 선언하지 않아도, 알아서 생성해준다음에 값을 집어넣어 준다.
문제
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;
}
}
String == 로 비교하니까 틀렸음. equals()로 해야한다.
이게 처음에 명시해놓은 대충 풀어놓고 구현에 뛰어든 문제. 구현과 풀이를 동시에 생각하려고 할 때, 헷갈리면 버퍼링이 심하게 걸린다.
문제
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;
}
}