코테 문제가 안 풀리는데, 풀 방법도 모르겠다. 그러다 보니 진지하게 '머리가 나쁜가...?'라던지 '잘못 선택했나...?' 에 대해 의심했다.
파고드는 성향이 강하고, 알고리즘에 취약한 사고 회로를 가진 탓인듯 하다. 지엽에 너무 꽂히고 왜? 왜? 왜? 하는게 문제.
이과였지만 과학만 좋아하고 수학을 제일 못했지. 논리? 알고리즘? 그게 뭔가요?
어엉엉ㅇ어엉 난 대체 왜 이런 사고회로를 가진 것인가😂😂😂😂😂 돌머리는 웁니다.
원빈 멘토님 말씀이,
그것이 멘토님 / 매니저님이 계시는 이유라고.
1/28 (토) 원빈 멘토님의 객체지향과 SOLID를 비롯 JAVA, Spring 학습 상담 기록은 이쪽.
long[] answer = new long[n];
for (int i = 0; i < n; i++) {
if (x == 0) {
answer[i] = x;
}
answer[i] = x * ( i + 1 );
}
이렇게 썼는데, 끝의 두 문제 (13, 14번 TC)에서 계속 틀리는 것이었다.
(이것도 질문답변에서 0인 경우를 고려하라고 해서 이건줄 알고 해봤는데, 알고보니 0이든 아니든 저 식이 틀린건 아니었다.)
와 뭐가 틀렸는지 도저히 모르겠어!! 질문답변을 보았다.
(long)(x * i) 식으로 처리하면 int형으로 계산되고 그 다음에 long으로 변경된 값이 들어가게 됩니다.
(long)x * i 으로 해야합니다.
아! 나는 아예 자료형 변환도 안했는데. long으로 반환하는지 보는거였구나.
아래와 같이 고쳤더니 잘 됐다.
long[] answer = new long[n];
for (int i = 0; i < n; i++) {
answer[i] = (long)x * ( i + 1 );
}
price += price * i;
처음엔 가격을 이렇게 했더니 몹시 큰 수가 나와서, 결국 놀이기구 요금 총액을 나타내는 변수를 pay로 새로 썼다.
그런데 return값이 계속 0이 나오는게 아닌가.
-> 문제는 for문의 조건부였다! i <= count로 썼어야 했다. 근호님의 예리한 관찰력!
for (int i = 1; i < count; i++)
pay += price * i;
if (pay > money) {
answer = pay - money;
} else {
answer = 0;
}
이렇게 쓰고 pay를 찍어봤더니, 총합 30원이 나와야 할 pay가 15원밖에 나오지 않았다.
주어진 값이 pay = 15, money = 20이었기 때문에 pay > money가 아니라서 0이 return 되었다.
public long solution(int price, int money, int count) {
long answer = 0;
long pay = 0;
for (int i = 1; i <= count; i++) {
pay += price * i;
if (pay > money) {
answer = pay - money;
} else {
answer = 0;
}
}
return answer;
}
이렇게 했더니 무사히 잘 된다. for문의 i <= count;
부분이 문제였다!
class Solution {
public String solution(String my_string) {
String answer = "";
char ch = ' ';
for (int i = 0; i < my_string.length(); i++){
if (my_string.charAt(i) >= 65 && my_string.charAt(i) <= 90) {
ch = my_string.charAt(i) - '32';
answer += ch;
}
else {
ch = my_string.charAt(i) + '32';
answer += ch;
}
}
return answer;
}
}
나는 이렇게 하려고 했더니 char와 int를 계산할 수 없다고 나왔는데, 음...뭐가 문젠지 모르겠다.
char형도 산술연산하면 ASCII 코드값으로 계산되지 않나?🤔 좀더 고민해봐야겠다.
charAt(i)는 getter지 setter가 아니라서 값을 얻어올 순 있지만 바꿀 순 없다고.
그래서 주의해서 써야 한다고.
이중 for문은 바깥 for문은 무조건 행만 찍어주는 애. 별이 찍는건 안에서 도는 for문.
그렇게 생각하고 for문을 사용하면 특별히 어려울거 없이 안의 별 수만 생각해주면 된다.
별찍기는 while보다는 이중 for문이 편할것.
더블클릭 하고 따옴표나 큰따옴표, 대괄호 등 누르면 거기에 그 특수문자로 감싸진다.
마크다운 문법에서 별표시를 보고싶으면 \를 앞에 써주면 보인다.
class Solution {
public String solution(int a, int b) {
String[] yoil = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
String answer = "";
for (a = 1; a <= 12; a++) {
if (a == 1) {
for (b = 1; b <= 31; b++) {
answer = yoil[(b + 4) % 7];
}
} //1월
else if (a == 2){
for (b = 1; b <= 29; b++) {
answer = yoil[b % 7];
}
} // 여기까지 일요일
else if (a == 3 || a == 12) {
for (b = 1; b <= 31; b++) {
answer = yoil[(b + 1) % 7];
}
} //여기까지 화요일
else if (a == 4) {
for (b = 1; b <= 30; b++) {
answer = yoil[(b + 4) % 7];
}
} //4월
else if (a == 7 || a == 10) {
for (b = 1; b <= 31; b++) {
answer = yoil[(b + 3) % 7];
}
} //여기까지 목요일
else if (a == 5 || a == 8) {
{for (b = 1; b <= 31; b++)
answer = yoil[(b - 1) % 7];
}
}
else if (a == 6 || a == 9) {
for (b = 1; b <= 30; b++) {
answer = yoil[(b + 2) % 7];
}
} //여기까지 수요일
else if (a == 11) {
for (b = 1; b <= 30; b++) {
answer = yoil[(b - 1) % 7];
}
} // 여기까지 일요일
} return answer;
}
}
이렇게 짰는데, reuturn을 했더니 자꾸 요일이 안 맞는다.
이렇게 했더니 IntelliJ에서는 answer를 찍었을 때 해당 월의 마지막날 요일이 return 되고, 프로그래머스에서는 무슨요일인지 모르겠는데 그냥 안맞는다.
그렇다면... 잠깐, 값을 입력받는다고 했는데. 내가 이걸 여러 if문은 몰라도 이렇게 여러 for문을 써야 할 이유가 있었나? 애초에 이걸 왜 for문을 썼었지?
class Solution {
public String solution(int a, int b) {
String[] yoil = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
String answer = "";
if ((a == 2 && b >= 1 && b <= 29) || (a == 8 && b >= 1 && b <= 31)) {
answer = yoil[b % 7];
} // 2월은 월요일부터 시작 -> 8월도 월요일 시작해서 추가함 -> 11월도...
else if ((a == 3&& b >= 1 && b <= 31) || (a == 11 && b >= 1 && b <= 30)) {
answer = yoil[(b + 1) % 7];
}
// 3, 12월은 화요일부터 시작 -> 3월은 31일까지야!! -> 12월 수요일 시작이야...
// -> 이것도 아냐 12월 목요일 시작이여 멍청아... 11월이 화요일 시작이고... 어휴...
else if ((a == 6 && b >= 1 && b <= 30) || (a == 12 && b >= 1 && b <= 31)) {
answer = yoil[(b + 2) % 7];
} // 6, 9월은 수요일부터 시작 -> 9월 아님 6월만!!! -> 12월 수요일 시작이라 옮김
else if (a == 9 && b >= 1 && b <= 30) {
answer = yoil[(b + 3) % 7];
} // 7, 10월 목요일부터 시작 -> 7월 아님! 9, 10월이 목요일 시작!!
//-> 10월 금요일 시작이야!! -> 7월도 금요일 시작이라 옮김!!
else if (((a == 1 || a == 7) && b >= 1 && b <= 31) || (a == 4 && b >= 1 && b <= 30)) {
answer = yoil[(b + 4) % 7];
} // 1, 4월은 금요일부터 시작 -> 7월도 금요일 시작!! 그리고 7월 31일까지야!!
else if ( a == 10 && b >= 1 && b <= 31) {
answer = yoil[(b + 5) % 7];
} // 뭐해... 10월 토요일 시작이잖아...
else if (a == 5 && b >=1 && b <= 31) {
answer = yoil[(b + 6) % 7];
} // 5, 8, 11월은 일요일부터 시작 => 아니야! 8월은 월요일이야 뺐어!
//-> 11월 일요일 시작 아니야... 화요일이야...
return answer;
}
}
그리고 새벽 5시까지 씨름한 결과 -> 아, 7월 이후로 월 계산을 다 틀려서 그렇구나.
머리가 바보면 좀 적어가면서... 했는데도 왜이러냐. 엉엉. 울고싶다.
시간이 너무 오래걸린 요인:
1. 푸는 방법이 잘못돼서
->(처음에 for문을 돌림 - 얘는 항상 그달의 마지막날의 요일만 return 해줬음)
2. 달별 일수에 따른 요일 계산을 틀려서
->2월 29일이 있다는걸 알면 뭐하나. 산수가 안되는디. 크흡.
저기요? 이러시는 이유가 있을거 아니에요.
만세...!!!!!!!!!!!🤪🤪🤪🤪🤪🤪🥴🥴🥴🥴🥴😵😵😵😵😵
12월의 시작 요일을 목요일로 옮기지 않은 탓이었다. 대체 이거 하나 하겠다고 몇시간을 헤맨건가. 너덜너덜해진 기분.
public int[] solution(int[] arr, int divisor) {
int[] answer = {};
for(int i : arr) {
if(arr[i] % divisor == 0) {
answer[i] = arr[i];
Arrays.sort(answer);
}
else {
answer[i] = -1;
}
} return answer;
이렇게 썼더니, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 0
예외가 뜬다.
if(arr[i] % divisor == 0) {
answer[i] += arr[i];
Arrays.sort(answer);
}
그래서 answer[i] += arr[i];
로 바꿔줬더니, 이젠 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
예외가 뜬다.
어쩌라는 것인가?!!?!?!?! 나 도라버려. 그냥 보통의 for문을 써보자.
-> 아니 보통 for문 썼더니 첫번째 예외가 또 나온다!