최댓값 만들기 (1)
배열의 원소 두 개를 곱해 최댓값을 만드는 문제로, 최댓값과 그 다음으로 큰 값을 구해 곱하거나, 처음부터 둘을 곱한 값의 최댓값을 구하면 될 것 같다. 나는 아직 sort 메소드를 공부하지 않았으니, 이번에도 3일차 마지막 문제에서 중앙값을 구할 때처럼 더 어려운 방식으로 풀어야 할 것 같다.
for i 반복문 안에 for j 반복문을 만들어, 서로 다른 i와 j에 한해 둘을 곱해 주면서 계속 큰 값으로 갱신하는 방법을 선택했다. 그런데 하나가 틀리게 나왔다. 원인은 어이없게도 numbers의 길이가 2부터 시작한다고 해서 i와 j의 index를 1부터 시작한 것 때문이다. 배열의 길이가 길든 짧든 index 0이 없을 리가 없다... 뇌가 어떻게 되었나 보다.
반복문을 0부터 시작하니 정상적으로 작동한다.
역시 가장 많은 좋아요를 받은 풀이는 sort 메소드를 이용해 풀었다. 배열을 정렬할 수 있다면 많은 문제가 쉬워질 것이다.
중복된 숫자 개수
어제 아침에 힘들게 풀었던 최빈값을 구하는 문제의 열화판이다. 프로그래머스 스쿨에서 제공하는 순서에서 이 문제보다 최빈값 구하는 문제가 먼저 나오는 것이 이해되지 않는다.
최빈값 문제와 비슷한 논리지만 훨씬 간단하게 풀 수 있다. array[i]의 값이 n과 같을 때마다 answer의 카운트를 1씩 늘려주기만 하면 된다.
배열의 index를 구분할 필요 없는 경우, for 반복문을 이와 같은 식으로 보다 간단한 방법으로 작성할 수 있다. 안 써도 되다 보니 자꾸 고려를 안 하게 되는데 그렇게 하면 발전이 없다. 앞으로는 index를 구분할 필요가 있는지 여부를 항상 생각한 후 작성해야겠다.
배열 자르기
이 문제는 answer 배열에 numbers 배열의 일부만 잘라서 넣으면 될 것 같다.
... 는 말이 쉽다. 뭔가 잘못됐다. i가 왜?
그렇다. for 반복문의 초기값에 int를 안 넣었다. 아침이라 정신이 없나 보다. 선언도 안 한 i로 뭔가를 만들고 있었다. 하지만 그래도 안 된다. index 2가 길이 2의 범위 밖에 있다고 한다. 당연한 소리다. index 2는 길이가 3 이상이어야 존재하니까. 그런데 왜 길이가 2밖에 안 되지? 또는 두 번째 테스트에서 result의 문제라면 result에 왜 index 2가 필요하지?
index 2를 넣어보니 역시 안 된다.
생각을 아예 잘못했다. answer[i]는 index 0부터 시작해야 하는데 index num1부터 시작하도록 만든 것이다. 길이 2짜리 배열에 answer[1]과 answer[2] 값을 넣으려 했으니 될 리가 없다. 치밀하지 못해 거의 항상 이런 실수를 하는 것 같다. 체계적인 풀이법의 필요성을 절실히 느낀다.
역시 메소드가 편하다. 대신 메소드를 이용하지 않으면 soultion을 기획하고 검증하는 과정에서 머리를 더 써 보게 된다는 장점은 있다고 생각한다.
삼각형의 완성조건 (1)
원래는 아주 간단한 문제다. 변이 세 개밖에 없으므로 index 0, 1, 2를 이용하면 금방 풀이가 끝난다.
이렇게 쉽게 풀 수 있지만 이렇게 풀면 공부가 덜 된다고 생각한다. index 중에서 최댓값을 찾고, 나머지 두 변을 더한 값과 비교하는 방식으로 풀어 봤다.
예상했던 것보다 더 쉽지 않다. 위의 for i 반복문을 이용해 max는 쉽게 구할 수 있지만, 아래의 for i 반복문으로 나머지 두 변을 골라내는 과정에서 문제가 생긴 모양이다. 설계 과정에서는 두 변 또는 세 변의 길이가 같은 경우 sum이 max보다 작아지게 되어 자동으로 1이 나온다고 생각했었다. 그래서 따로 분리하지 않았다. 그런데 다시 보니 반대다. sum이 max보다 작아지면 2가 나온다. 따라서 두 변 이상의 길이가 같은 경우를 추가로 구분해야 한다.
두 변의 길이가 같은 경우 sum에 max + 1을 대입해 무조건 1이 나오도록 만들었다. 그래도 테스트 하나는 틀렸다고 나온다.
반복문에서 앞의 두 변의 길이가 같지만 세 번째 변의 길이가 더 큰 경우 2가 나와야 된다. 앞의 식은 이 경우를 걸러내지 못한다. 실제로는 index 3이 max인데, index 0의 길이가 max인 상태에서 index 1만 보고 sum을 max + 1로 만들어 버리기 때문이다. 그러면 1이 나온다. 그래서 방식을 바꿨다.
max와 길이가 같은 변이 추가로 나오는 경우 미리 sum에 더해 버리고 해당 변의 길이는 0으로 만들어 버렸다. 이렇게 하면 아래쪽의 for i 식에서도 sum을 중복해 더할 일이 없다.
sort 메소드를 이용해 크기 순으로 정렬하고 삼항 연산자를 이용했다. 내 대부분 고생의 근원이 이 메소드까지 Java 진도가 나가지 못한 데 있다.
배열 원소의 길이
answer 배열에 strlist 배열의 길이만 담아 주면 될 것 같다.
???
나는 지금 2차원 배열의 길이를 구하는 field를 사용한 것이다. String의 길이를 구하는 method를 사용한 게 아니다. 그 사실은 금방 깨달았지만, String의 길이를 구하는 method는 이미 내 기억에서 날아가 버린 지 오래다.
결국 책에서 찾아 풀고 말았다. field명과 method명은 같다. 배열의 길이를 구하는 length field에서 ()를 붙이면 그대로 String의 길이를 구하는 method를 호출할 수 있다. 아무래도 기본적인 암기가 부족한 것 같다. 빨리 진도를 끝내고 회독을 많이 해야겠다ㅠㅠ
'Coding Test' 카테고리의 다른 글
Java 코딩테스트 연습 8일차 (프로그래머스 스쿨 Lv.0, 1095점) (0) | 2023.03.14 |
---|---|
Java 코딩테스트 연습 7일차 (프로그래머스 스쿨 Lv.0, 1088점) (0) | 2023.03.13 |
Java 코딩테스트 연습 5일차(2) (프로그래머스 스쿨 Lv.0, 1061점) (2) | 2023.03.11 |
Java 코딩테스트 연습 5일차(1) (프로그래머스 스쿨 Lv.0, 1055점) (0) | 2023.03.11 |
Java 코딩테스트 책 구입, 연습 4일차 (프로그래머스 스쿨 Lv.0, 1045점) (0) | 2023.03.10 |