오늘도 정답률 높은 순으로 풀었다. 미리 순서를 보고 시작했는데, 풀고 올 때마다 정답률 높은 문제가 실시간으로 바뀌어 정신이 없다. 그 정도로 동시에 풀이를 진행하는 사람이 많은가 보다.
머쓱이보다 키 큰 사람
쉬운 문제다. for 반복문에서 height보다 큰 array의 원소가 나올 때마다 answer을 1씩 올려주면 될 것 같다.
제대로 확인 안 하고 꼭 한 번씩 틀려서 스트레스를 많이 받는다. if 조건식에 array[i]가 들어가야 하는데 i를 넣어 버렸다.
짝수 홀수 개수
이것도 쉬운 문제다. 짝수와 홀수가 나올 때마다 answer[0]과 answer[1]의 원소를 하나씩 늘려 주면 된다.
또 식을 제대로 안 썼다. 바로 제출을 안 해도 되니 꼼꼼하게 안 쓰고 코드 실행부터 눌러보는 버릇을 고치기가 어렵다. 캡처는 고치고 나서 해 버렸나 보다.
창의력이 좋다. 짝수인 경우 나머지가 0, 홀수인 경우 나머지가 1인 것을 이용해 answer 배열의 index에 바로 삽입했다. int 배열의 초기값은 따로 지정해 주지 않으면 0이므로 선언 시 초기값을 설정하지 않아도 된다.
배열에서 간단하게 쓸 수 있는 for 반복문을 연습하고 싶어 다시 풀어 보았다. 역시 손에 익지 않으니까 어색하고 쓰다가 버벅거린다. 역시 문법은 손에 익도록 골고루 자주 써 봐야 한다. 결과는 같다.
배열 뒤집기
이 문제는 앞의 두 문제보다 조금 어렵다. num_list의 index와 반대 순서의 값을 answer에 대입하도록 풀면 될 것 같다.
역시 또 실수한 모습이다. j 반복문을 0부터 돌려도 되는데 가독성을 위해 위에서부터 내려오게 해 보다가 범위 지정을 틀려서 실수했다. j는 num_list.length - 1 부터 시작해야 한다.
아직 끝이 아니다. 값은 여전히 틀리게 나온다. 마지막 if 조건식에서도 마찬가지로 num_list.length + 1이 아니라 num_list.length - 1이 되어야 한다. 머릿속에서는 index가 길이보다 1 적다는 걸 알고 있는데 손은 반대로 행한 모습이다.
아직 안 끝났다ㅠㅠ i와 j가 같을 때는 answer의 변화가 없어 그대로 0이 되어 버린다. (i != j) 조건식은 사실 필요가 없다. 어차피 i와 j가 같으므로 num_list[i]든 num_list[j]든 answer에 넣어 주면 된다. 불필요하게 넣어서 오히려 틀린 식을 만들어 버렸다. 아래 answer 관련 식을 작성하기 전에 만들어 놓고 다시 수정하지 않아서 발생한 문제다. 아직 미리 다 설계해 놓을 실력이 안 돼서 그렇다.
힘들게 정답을 받았다.
num_list.length - i - 1 이 i와 반대에 위치한다는 특징을 이용해 한 번에 만들었다. 조건문을 하나만 써도 되므로 간결성 면에서도 시간 복잡도 면에서도 내 방식보다 훨씬 효율적이다. 반성해야겠다.
웃기게 할인 받기
역시 쉬운 문제... 라고 생각했는데 내가 전에도 헷갈렸던 자동타입변환과 강제타입변환 부분에서 문제가 생겼다.
0.95, 0.9, 0.8이 소수이므로 연산은 자동으로 실수 연산이 되고 결과값도 실수가 된다. 그래도 연산결과는 항상 정수이므로, 10,000.0 등이 나오더라도 정수형 변수인 answer가 10,000으로 담을 수 있다고 생각했다. 하지만 당연히 정수형 변수에는 실수값을 담을 수 없다. 담으려면 반드시 강제 타입 변환을 해야 한다. 아주 기초적인 부분인데 자꾸 헷갈린다.
이 과정에서 새로이 알게 된 사실은 이미 선언된 변수는 강제로도 타입을 바꿀 수 없다는 것이다. 선언할 때만 설정할 수 있다. 즉 answer를 int로 선언했으면 끝까지 정수형이고 double로 선언했으면 끝까지 실수형이다. 타입을 바꾸려면 다른 변수를 선언하면서 옮겨야 한다. 기초적인 사실일 테지만 정말 몰랐다.
예상대로 if-else 조건문으로 푼 사람이 압도적으로 많다. 그런데 이제는 삼항 연산자가 더 편하다. 써 본 지 얼마나 됐다고 삼항 연산자 없이는 살 수 없는 몸이 되어 버렸다.
순서쌍의 개수
약수의 순서쌍을 구하는 단순한 문제로 보인다.
???
범위를 n으로 하면 n이 커질수록 너무 연산이 많아질 것 같아서 500,000으로 제한했다. 이렇게 하면 시간 복잡도가 1/4이 된다. 하지만 시간은 이것도 허락해 주지 않았다.
그동안 시간 복잡도를 고려 안 하고 너무 대충 작성했다. 위에서 반성한다고 해놓고 바로 시간 초과를 띄워 버렸다. 1,000,000^2이면 1조가 되니 500,000^2만 해도 무려 2,500억 번의 연산을 해야 한다. 실행시간이 2,500초...나 걸리는 참사가 발생하는 것이다. 앞으로는 시간 복잡도를 고려하면서 풀어야겠다. 꼭 실행시간이 초과되지 않더라도 연산은 적게 할수록 좋다.
맞는 j를 찾으면 break로 바로 빠져나오도록 했다. 그래도 어림도 없는 모양이다.
결국 나눗셈으로 바꿨다. 그런데 또 에러가 발생한다. 어떤 수도 0으로는 나눌 수 없다. 급하게 하다 보니 초보적인 실수를 저질렀다.
이번에는 맞았나 싶더니 뭔가 또 틀렸다. 왼쪽의 입출력 예를 보니 1도 순서쌍에 포함이다. 그러면 반복문의 제한을 500,000이 아닌 n으로 해야 한다.
예상보다 너무 힘들게 풀어서 얼얼하다. 앞으로는 컴퓨터를 사랑하는 마음으로 최대한 적은 연산 횟수로 풀도록 노력해야겠다.
역시 나와 같은 문제를 겪은 사람이 있다. 답변이 달려 있으니 잘 해결했을 것이다. 다만 int는 21억이 넘게 커버할 수 있으므로 long은 불필요하다.
'Coding Test' 카테고리의 다른 글
Java 코딩테스트 연습 9일차 (프로그래머스 스쿨 Lv.0, 1100점) (0) | 2023.03.15 |
---|---|
Java 코딩테스트 연습 8일차 (프로그래머스 스쿨 Lv.0, 1095점) (0) | 2023.03.14 |
Java 코딩테스트 연습 6일차 (프로그래머스 스쿨 Lv.0, 1073점) (0) | 2023.03.12 |
Java 코딩테스트 연습 5일차(2) (프로그래머스 스쿨 Lv.0, 1061점) (2) | 2023.03.11 |
Java 코딩테스트 연습 5일차(1) (프로그래머스 스쿨 Lv.0, 1055점) (0) | 2023.03.11 |