OX 퀴즈
덧셈, 뺄셈 연산식 배열의 답이 맞으면 "O", 틀리면 "X"를 담은 배열을 return하는 문제다. 어제 다른 풀이에서 봤던 " "를 기준으로 나누는 방법이 제일 쉬울 것 같다.
for 반복문 안에서 split 메소드를 이용해 quiz 배열의 각 원소들을 공백 기준으로 나눴다. split[0] 위치에 있는 첫 번째 수와 split[2]의 두 번째 수, 결과값인 split[4]를 int형으로 변환한 값을 각각 firstNum, secondNum, result 변수에 대입했다. result는 앞에 -가 붙을 수 있으므로 -가 있을 때와 없을 때로 나눠 계산한다.
answer의 결과값 대입에는 삼항 연산자를 써 봤는데, 이것 저것 오류가 많이 났다. 괄호가 문제인 것 같은데 도통 이유를 모르겠다.
이리저리 고쳐 보다 안 되길래 모조리 boolean 연산자에 넣어 버리고 식을 간단하게 만들었다. 이게 가독성 측면에서도 훨씬 좋다.
그러나 답은 틀렸다.
20번째 줄의 - 변환식을 0 - Integer~ 에서 -Integer~ 로 바꾸고 삼항 연산자의 항들에 괄호를 묶어 주었다. 그래도 실행 결과는 똑같다.
16번째 줄의 식에 문제가 있다는 걸 알게 되었다. 정수는 5자리까지 있으므로, -가 안 붙는다고 해서 split[4]의 길이가 1이 되는 것은 아니다. contains 메소드를 이용해 -의 포함 여부를 판단하는 조건식으로 바꾸었다.
기분 좋게 테스트를 통과하고 성공한 줄 알았으나 막상 제출해 보니 정확성이 29.4% 밖에 되지 않는다.
문제를 다시 읽어 보다 연산식의 숫자들에도 -가 붙을 수 있다는 사실을 뒤늦게 알게 되었다. 모두 result처럼 -가 붙은 경우와 붙지 않은 경우로 나눠 주었다.
정확도가 약간 올랐지만 여전히 처참한 수준이다. 다시 뜯어봐도 원인을 파악하기가 어려웠다. 그래서 테스트 케이스를 추가하기 시작했다.
음수들이 주어지는 경우 제대로 작동하지 않는 것으로 보인다.
음수 대입식을 -Integer~ 에서 Integer~ - 2 * Integer~ 로 바꿔 봤다. 당연히 안 된다ㅠㅠ
한참 고생하다 그냥 - 관련 식을 빼고 실행했는데 성공했다. 정수형으로 변환해 주는 parseInt 메소드가 -도 변환하는지 확실하지 않아, replace 메소드로 "-"를 지우고 다시 -를 붙인 것이 오히려 독이 되었다. parseInt 메소드가 -도 변환할 수 있는 건 그렇다 쳐도, 대체 왜 replace 메소드가 작동하지 않았는지 확인하지 않고 넘어갈 수는 없다. 그래서 구글링을 해 봤다. 다음은 'java replace method "-" didn't work' 로 검색했을 때 첫 번째로 나오는 질문과 답변이다.
이 사람은 문자열을 대체하는 작업을 수행하는 replace 메소드를 호출했을 뿐 이 결과값을 test 변수에 대입하지 않았다. 이 메소드가 작업 후 다시 보내주는 변수는 test가 아니다. String 타입은 객체 생성 후 수정할 수 없으므로, 당연히 test 변수의 값은 그대로다. 수정하려면 StringBuilder 타입을 써야 한다. 내 문제는 그런 문제가 아니.......
지 않고 다시 보니 맞았다. 이 사실을 알고 나서 충격이 컸다. 이 사람의 코드는 보자마자 바로 문제점을 알았는데도, 내가 같은 행위를 한 사실은 반복해서 보면서도 전혀 알아차리지 못한 것이다. 이 사람도 원래 변수에 대입해야 한다는 사실은 알고 있었지만, 어쩌다 저렇게 적은 뒤 맞게 적었는데 안 된다고만 생각했을 것이다. 몰라서 틀리는 건 어쩔 수 없지만, 알고 있는 것을 틀리는 건 용납이 안 된다. 다시는 같은 실수를 반복하지 않도록 해야 한다ㅠㅠ
이 문제를 이렇게 짧은 식으로 풀 수 있으리라고는 생각도 못 했다. quiz 배열의 값을 직접 바꿔 return했다. 세상에 고수는 많은 듯하다.
다음에 올 숫자
등차수열과 등비수열의 다음에 올 수를 구하는 문제다. 정답률이 낮지만 쉬운 문제다. 정답률은 아마 한국에 수포자가 많은 영향인 것 같다.
등차와 등비인 경우밖에 없어 등비수열인 경우는 따로 조건식을 넣을 필요가 없다. 조건식을 넣는다면 등차수열의 조건식처럼 if (common[1] / common[0] == common[2] / common[1]) 과 같은 식으로 넣어 주면 될 것이다.
예상치 못한 문제가 나와 시간이 절약되었다 보니, 저번에 다른 풀이에서 배운 Math 클래스의 pow 메소드를 사용해 보고 싶어졌다.
pow 메소드의 return 타입이 double이란 걸 잊어버리고 있었다...
통과했다. Math 클래스가 유용한 것 같으니 아직 진도는 못 나갔지만 해당 챕터를 보며 미리 암기를 해 둬야겠다. 그런데 '이것이 자바다'에서는 Math 클래스 부분에서 pow 메소드는 나오지 않는다. 다른 챕터에 나오는 건지 다루지 않은 건지 모르겠다.
내 풀이와 동일한 구조지만 공차를 미리 변수 y에 대입해 바로 답에 활용했다. 그래서 내 풀이보다 더 간결하다.
연속된 수의 합
역시 쉬운 문제다. 등차수열이므로 초항만 구하면 된다.
등차 1인 정수의 합을 계산해 보면 total = (2 * answer[0] + num) * num / 2 이다. 이걸 answer[0]에 대한 식으로 정리해서 적고 그 다음 항부터는 for 반복문을 이용해 계산하면 된다.
...라고 우습게 봤지만 보기 좋게 틀려 버렸다. 계산을 잘못했다.
total = (2 * answer[0] + num) * num / 2 가 아니라
total = (2 * answer[0] + num - 1) * num / 2 이다.
운 좋게 int타입 소수점 버림으로 테스트 4는 맞힌 게 웃음벨이다.
식을 고치니 통과된다.
1부터 num까지의 합을 구하는 공식인 num * (num + 1) / 2 를 total에서 뺀 뒤, 다시 num + 1로 나눠 초항을 구했다. 1부터 num까지의 합과 answer[0]부터 answer[num - 1]까지의 합은 (answer[0] - 1) * num 만큼 차이 난다. 따라서 total - num * (num + 1) / 2를 num + 1 로 나누면 answer[0]이 나온다.
오늘은 첫 문제를 제외하고 오래 걸리지 않아 예상치 못한 소득에 기분이 좋다. Java 공부에 투자할 수 있는 시간이 더 많아졌다!
'Coding Test' 카테고리의 다른 글
Java 코딩테스트 연습 13일차 (프로그래머스 스쿨 Lv.0, 1183점) (0) | 2023.03.19 |
---|---|
Java 코딩테스트 연습 12일차 (프로그래머스 스쿨 Lv.0, 1176점) (0) | 2023.03.18 |
Java 코딩테스트 연습 10일차 (프로그래머스 스쿨 Lv.0, 1130점) (0) | 2023.03.16 |
Java 코딩테스트 연습 9일차 (프로그래머스 스쿨 Lv.0, 1100점) (0) | 2023.03.15 |
Java 코딩테스트 연습 8일차 (프로그래머스 스쿨 Lv.0, 1095점) (0) | 2023.03.14 |