본문 바로가기

Coding Test

Java 코딩테스트 연습 6일차 (프로그래머스 스쿨 Lv.0, 1073점)

최댓값 만들기 (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이 나온다고 생각했었다. 그래서 따로 분리하지 않았다. 그런데 다시 보니 반대다. summax보다 작아지면 2가 나온다. 따라서 두 변 이상의 길이가 같은 경우를 추가로 구분해야 한다.

 

 

 

 

두 변의 길이가 같은 경우 sum max + 1을 대입해 무조건 1이 나오도록 만들었다. 그래도 테스트 하나는 틀렸다고 나온다.

 

반복문에서두 변길이같지만 세 번째 변길이더 큰 경우 2나와야 된다. 앞의 식은 이 경우를 걸러내지 못한다. 실제로는 index 3이 max인데, index 0의 길이가 max인 상태에서 index 1만 보고 summax + 1로 만들어 버리기 때문이다. 그러면 1이 나온다. 그래서 방식을 바꿨다.

 

 

 

 

max길이같은 변이 추가로 나오는 경우 미리 sum에 더해 버리고 해당 변길이0으로 만들어 버렸다. 이렇게 하면 아래쪽의 for i 식에서도 sum을 중복해 더할 일이 없다.

 

 

다른 풀이

 

 

sort 메소드를 이용해 크기 순으로 정렬하고 삼항 연산자를 이용했다. 내 대부분 고생의 근원이 이 메소드까지 Java 진도가 나가지 못한 데 있다.

 

 

배열 원소의 길이

 

 

 

 

answer 배열에 strlist 배열의 길이만 담아 주면 될 것 같다.

 

 

 

 

???

 

나는 지금 2차원 배열길이를 구하는 field를 사용한 것이다. String길이를 구하는 method를 사용한 게 아니다. 그 사실은 금방 깨달았지만, String의 길이를 구하는 method는 이미 내 기억에서 날아가 버린 지 오래다.

 

 

 

 

결국 책에서 찾아 풀고 말았다. field명과 method명은 같다. 배열 길이를 구하는 length field에서 ()를 붙이면 그대로 String길이를 구하는 method를 호출할 수 있다. 아무래도 기본적인 암기가 부족한 것 같다. 빨리 진도를 끝내고 회독을 많이 해야겠다ㅠㅠ