티스토리 뷰
□문제 설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
□제한사항
- numbers의 길이는 2 이상 100 이하입니다.
- numbers의 모든 수는 0 이상 100 이하입니다.
□입출력 예
numbers | result |
[2,1,3,4,1] | [2,3,4,5,6,7] |
[5,0,2,7] | [2,5,7,9,12] |
□입출력 예 설명
더보기
입출력 예 #1
- 2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
- 3 = 2 + 1 입니다.
- 4 = 1 + 3 입니다.
- 5 = 1 + 4 = 2 + 3 입니다.
- 6 = 2 + 4 입니다.
- 7 = 3 + 4 입니다.
- 따라서 [2,3,4,5,6,7] 을 return 해야 합니다.
입출력 예 #2
- 2 = 0 + 2 입니다.
- 5 = 5 + 0 입니다.
- 7 = 0 + 7 = 5 + 2 입니다.
- 9 = 2 + 7 입니다.
- 12 = 5 + 7 입니다.
- 따라서 [2,5,7,9,12] 를 return 해야 합니다.
□초기화면
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
int* answer = (int*)malloc(sizeof(int)*numbers_len*(numbers_len-1));
int count=0;
for(int i=0;i<numbers_len;i++){
for(int j=i+1;j<numbers_len;j++){
int value = numbers[i]+numbers[j];
bool same = false;
for(int z=0;z<count;z++){
if(answer[z]==value) same = true;
}
if(same == false)
answer[count++] = value;
}
}
//정렬
for(int i=0;i<count;i++){
for(int j=i+1;j<count;j++){
int temp;
if(answer[i]>=answer[j]){
temp = answer[i];
answer[i] = answer[j];
answer[j] = temp;
}
}
}
return answer;
}
□코드 분석
단계 | 과정 |
배열 & 변수 | answer의 크기 : 주어진 수의 개수 x (개수 - 1) ➙ 경우의 수 중복없는 값의 개수를 저장하는 변수 count 각 경우의 합(결과값)을 저장하는 변수 value 현재 값과 그동안의 값이 같은 지 판별하는 변수 same |
for(i) - for(j) | i의 값은 0부터 수의 크기만큼, j의 값은 i+1부터 수의 크기만큼 반복한다. value에 numbers[i]값과 numbers[j]의 값의 합을 할당한다. |
for(z) | value의 값과 지금까지 나왔던 value의 값들을 비교하여 같은 경우 same의 값을 true로 변경한다. |
answer[count++] | same의 값이 false인 경우 = 중복값이 아님 answer[count]의 방에 해당 값을 넣고 count++를 진행한다. |
selection 정렬 | 방의 값과 그 다음방의 값을 비교하여 방의 값이 클 경우 뒤로 미루는 것을 반복함으로써 오름차순으로 만든다. selection 참고자료 |
□도전했던 풀이법 1
일단 방의 개수가 큰 배열을 하나 잡은 후, 배열에 값을 넣으면서 이전에 같은 값이 있었는지 판별하고, 같은 값이 있을 경우 count--를 진행하여 그 다음의 값(합)을 배열의 같은 방에 할당하는(값을 다시 지정) 방법을 사용했다. 이때 if(i==j) continue; 등의 문장은 같은 값을 더하면(ex numbers[2]+numbers[2]) 배열에서 하나의 수만 뽑아 더하는 것이기 때문에,,, 넣어보았으나 별 소용은 없는 듯 싶다. count를 이용하여 answer의 크기를 지정했다. |
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
int arr[500] = {0, };
int count=0;
for(int i=0;i<numbers_len;i++){
for(int j=i+1;j<numbers_len;j++){
if(i==j) continue;
arr[count++] = arr[i]+arr[j];
for(int z=0;z<count;z++){
if(z==count) continue;
if(arr[z]==arr[count]){
count--;
break;
}
}
}
}
//정렬
for(int i=0;i<count;i++){
for(int j=i+1;j<count;j++){
int temp;
if(arr[i]>=arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
int* answer = (int*)malloc(sizeof(int)*count);
answer = arr;
return answer;
}
□도전했던 풀이법 2
풀이1과 마찬가지로 방의 개수가 큰 배열을 하나 잡고 count를 이용하여 answer의 크기를 지정하는데, 같은 값이 있는지 bool 변수 'same'을 이용하여 알아낸 다음 같은 값이 없을 경우에만 배열에 값을 넣어주는 방법을 이용했다. 이때 실행결과는 일치했지만 arr방의 크기를 몇으로 설정하느냐 malloc으로 크기값을 몇으로 지정하느냐에 따라 채점결과가 달라져서 방 크기가 문제인것을 알게 되었다. 이런 결과들을 바탕으로 그냥 시작부터 malloc과 count가 아닌 경우의 수(최대값)으로 잡아준것이 위의 정답 코드이다. |
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
int arr[500] = {0, };
int count=0;
for(int i=0;i<numbers_len;i++){
for(int j=i+1;j<numbers_len;j++){
int value = numbers[i]+numbers[j];
bool same = false;
for(int z=0;z<count;z++){
if(arr[z]==value) same = true;
}
if(same == false)
arr[count++] = value;
}
}
int* answer = (int*)malloc(sizeof(int)*count+1);
//정렬
for(int i=0;i<count;i++){
for(int j=i+1;j<count;j++){
int temp;
if(arr[i]>=arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
answer = arr;
return answer;
}
이 문제가 지금까지 풀었던 문제 중
복잡하고 시간이 오래 걸렸던 것 같다.
0603 새벽에 한번 풀고,
0604 학교에서 계속 보고,,
0605 아침에 시작해서 저녁에 끝남
틀렸던 풀이법도 계속 수정해봐야겠다 😒😒
□링크
코딩테스트 연습 - 두 개 뽑아서 더하기
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한
programmers.co.kr
About Me
💻GitHub/KimSky904 KimSky904 - Overview Department of New Media Software. KimSky904 has 8 repositories available. Follow their code on GitHub. github.com
code-review.tistory.com
'[코테] > [Programmers Lv1]' 카테고리의 다른 글
[Programmers] Lv1_두 정수 사이의 합 (C/C++) (0) | 2021.06.06 |
---|---|
[Programmers] Lv1_가운데 글자 가져오기 (C/C++) (0) | 2021.06.06 |
[Programmers] Lv1_2016년 (C/C++) (0) | 2021.06.05 |
[Programmers] Lv1_3진법 뒤집기 (C/C++) (0) | 2021.06.03 |
[Programmers] Lv1_약수의 개수와 덧셈 (C/C++) (0) | 2021.06.03 |
댓글
공지사항
최근에 올라온 글
TAG
- YBM기출
- cospro기출
- 코딩테스트
- c언어
- CosPro
- Cos Pro
- 구름에듀 기출문제
- cospro기출문제
- 알고리즘
- 1급
- groom
- 배열
- Java
- 구름 기출문제
- COSPRO 2급
- 자바
- C
- 연습문제
- 코스프로
- C++
- 프로그래머스
- YBM
- groomedu
- 기출문제
- lv1
- 구름에듀
- programmers
- c언어 기출문제
- 배열활용문제
- lv2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함