문제설명
배열에 들어있는 숫자중에 가장 큰수 2개를 뽑아서 곱하면 된다
제한사항
입출력 예
말로하는 순서도
solution 함수 선언 및 매개변수 배열 numbers 배열 numbers 의 길이 numbers_len 선언 및 반환형 int
answer이라는 계산값 및 최종 반환값을 저장할 변수 선언 및 초기화
for문 배열의 길이만큼 반복 변수증가(i)
for문 배열의 길이만큼 반복 변수증가(x)
if문 number의i위치의 값과 number의x위치의 값을 곱한 값이 answer의 값보다 크다면
answer의 number의i위치의 값과 number의x위치의 값을 곱한 값을 넣는다
최종 반환
소스코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// numbers_len은 배열 numbers의 길이입니다.
int solution(int numbers[], size_t numbers_len) {
int answer = 0;
for(int i=0; i<numbers_len;i++)
{
for(int x=i+1; x<numbers_len; x++)
{
if(numbers[i]*numbers[x]>answer)
answer=numbers[i]*numbers[x];
}
}
return answer;
}
풀이
처음 부터 끝까지 곱해서 가장 큰값이 answer의 들어가게 하는 것이다
for문을 활용해서 짧게 구현이 가능했다
시행착오
문제가 있었던 것은 아니다 다 풀고 나서 다른 사람의 풀이를 보는데 정석이라고 하는 풀이가 있어 해보았다
나는 배열의 모든 요소를 계산하고 반환 하였지만
배열 자체를 오름 차순 정렬하고 가장 큰 두 값을 곱하는 방법이 있었다
아래 코드가 C언어의 오름차순의 코드로 정석 느낌이었다
말로하는 순서도
solution 함수 선언 및 매개변수 배열 numbers 배열 numbers 의 길이 numbers_len 선언 및 반환형 int
answer이라는 계산값 및 최종 반환값을 저장할 변수 선언 및 초기화
flag라는 오름차순정렬을 위한 변수 선언
for문 배열의 길이만큼 반복 변수증가(i)
for문 배열의 길이만큼 반복 변수증가(j)
if문 number의i위치의 값 보다 number의j위치의 값이 더 크다면
flag에 number의i 위치의 값을 넣는다
number의i 에 number의j 위치의 값을 넣는다
number의j 에 flag의 값을 넣는다
answer의 number의 배열의 길이값에서 1을 뺀 위치의 값과 number의j 배열의 길이값에서 1을 뺀 위치의 값 위치의 값을 곱한 값을 넣는다
최종 반환
소스코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// numbers_len은 배열 numbers의 길이입니다.
int solution(int numbers[], size_t numbers_len) {
int answer = 0;
int flag = 0;
for (int i=0; i<numbers_len; i++)
{
for (int j=0; j<numbers_len; j++)
{
if (numbers[i] < numbers[j])
{
flag = numbers[i];
numbers[i] = numbers[j];
numbers[j] = flag;
}
}
}
answer = (numbers[numbers_len-1]) * (numbers[numbers_len-2]);
return answer;
}
풀이
오름 차순이 되는 원리를 프로그래머스 예제숫자로 설명한다
0,31,24,10,1,9 가 주워질때
for문 i가 한번 증가하면
j는 처음부터 끝까지 비교한다
i가 0이고 j가 1일때
i위치의 값은 0이다
j는 31이기에 i보다 j가 작다는 if문 조건이 맞아서
두 숫자의 위치가 바뀐다 이때 배열의 순서는 31,0,24,10,1,9이다
i위치의 숫자가 가장크기에 다음 숫자를 볼 필요가 없다
i가 1로 증가한다 j가 0일때 둘을 비교하면 다시 if문이 작동한다
배열의 순서는 0,31,24,10,1,9이다
i위치의 숫자가 가장크기에 다음 숫자를 볼 필요가 없다
i가 2로 증가한다 j가 0일때 둘을 비교하면 다시 if문이 작동한다
i의값이 24이다 j가1일때 둘의 순서가 바뀐다 이때 0,24,31,10,1,9가 된다
i위치의 숫자가 가장크기에 다음 숫자를 볼 필요가 없다
i가 3로 증가한다 j가 0일때 둘을 비교하면 다시 if문이 작동한다
i의 값은 10이다 j는1일때 24와 순서가 바뀐다 0,10,31,24,1,9
i의 값은 24이다 j는2일때 31과 순서가 바뀐다 0,10,24,31,1,9
i위치의 숫자가 가장크기에 다음 숫자를 볼 필요가 없다
i가 4로 증가한다 j가 0일때 둘을 비교하면 다시 if문이 작동한다
i의 값은 1이다 j는 1일때 10과 순서가 바뀐다 0,1,24,31,10,9
i의 값은 10이다 j는 2일때 24와 순서가 바뀐다 0,1,10,31,24,9
i의 값은 24이다 j는 3일때 31과 순서가 바뀐다 0,1,10,24,31,9
i위치의 숫자가 가장크기에 다음 숫자를 볼 필요가 없다
i가 5로 증가한다 j가 0일때 둘을 비교하면 다시 if문이 작동한다
i의 값은 9이다 j는2일때 10과 순서가 바뀐다 0,1,9,24,31,10
i의 값은 10이다 j는3일때 24와 순서가 바뀐다 0,1,9,10,31,24
i의 값은 24이다 j는4일때 31과 순서가 바뀐다 0,1,9,10,24,31
최종적으로 오름차순으로 정렬이 완료 되었다.
출처: 프로그래머스 코딩테스트연습 입문문제, https://school.programmers.co.kr/learn/courses/30/lessons/120847
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr