문제 : 정수 start_num와 end_num가 주어질 때 start_num에서 end_num까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
해결 시도 :
using System;
public class Solution {
public int[] solution(int start_num, int end_num) {
int[] answer = new int[] {};
for (int i = start_num; i >=end_num; i--)
{
answer[i] += start_num;
Console.WriteLine(string.Join(", ",answer[i]));
}
}
}
해결 :
using System;
public class Solution {
public int[] solution(int start_num, int end_num) {
int[] answer = new int[start_num - end_num +1];
for (int i = start_num; i >= end_num; i--)
{
answer[start_num - i] = i;
}
Console.WriteLine("[" + string.Join(", ", answer)+"]");
return answer;
}
}
문제는 정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러개가 담긴 리스트 num_list가 주어진다. slicer에 담긴 정수를 차례대로 a,b,c라고 할 때, n에 따라 num_list를 슬라이싱 하려고 한다.
세부 조건이 3가지 있는데 각각 n의 값에 따라 num_list의 출력 인덱스 범위를 지정하는 것이었다. (프로그래머스 기초 트레이닝에서 찾아볼 수 있다)
해결 시도
public int[] solution(int n, int[] slicer, int[] num_list)
{
int[] answer = new int[];
while (true)
{
if (n == 1)
{
for (int i = 0; i <= slicer[1]; i++)
answer = num_list[i];
break;
}
else if (n == 2)
{
for (int i = slicer[0]; i < num_list.Length(); i++)
answer = num_list[i];
break;
}
else if (n == 3)
{
for (int i = slicer[0]; i <= slicer[1]; i++)
{
answer = num_list[i];
}
break;
}
else if (n == 4)
{
for (int i = slicer[0]; i <= slicer[1]; i += slicer[2])
answer = num_list[i];
break;
}
}
}
문제는 n의 값이 1~4일 때 각 num_list의 출력값을 나누도록 하였다.
일단 초기값으로 int[] answer = new int[];가 선언되어 있었기 때문에 그대로 사용하고자 했고, n의 값에 따라 범위가 바뀌므로 if 문을 사용하고자 했다.
그리고 배열을 출력해야 하니 for문을 통해서 조건에 맞게 범위를 지정하고자 하였다.
아직도 의문인건 while을 왜 사용했었는지 나 스스로도 모르겠다. 아마 for문으로의 반복을 사용해 놓고 착각해서 추가해버린 것 같다.
당연히 이렇게 작성했을 때 에러가 발생했다. 앞서 말했듯 int 배열의 크기를 명확히 지정하지 않았다.
그리고 배열에 값을 대입하는 방식이 잘못되었는데, num_list[i]는 int[] 가 아니고, int 타입이기 때문에 int[] 배열인 answer에 대입을 하려고 하면 type mismatch가 발생하게 된다.
이것을 해결하려면 배열이 아니라 List를 사용해서 .Add로 직접 추가해주는 방법과, 아니면 answer에 저장하는게 아니라 answer[i] = num_list[i]로 둘 다 type을 int로 맞춰주는 방식이 있다.
아 그리고 Length는 그냥 속성이라 괄호 빼야 한다.
해결
using System;
using System.Collections.Generic;
public class Solution {
public int[] solution(int n, int[] slicer, int[] num_list)
{
List<int> answer = new List<int>();
if (n == 1)
{
for (int i = 0; i <= slicer[1]; i++)
{
answer.Add(num_list[i]);
}
}
else if (n == 2)
{
for (int i = slicer[0]; i < num_list.Length; i++)
{
answer.Add(num_list[i]);
}
}
else if (n == 3)
{
for (int i = slicer[0]; i <= slicer[1]; i++)
{
answer.Add(num_list[i]);
}
}
else if (n == 4)
{
for (int i = slicer[0]; i <= slicer[1]; i += slicer[2])
{
answer.Add(num_list[i]);
}
}
return answer.ToArray();
}
}
배열은 선언할 때 크기를 결정해야 하고, 또 그 크기를 변경할 수 없다.
int[] arr = new int[3]; // 크기 고정
arr[0] = 10; // 값 할당만 가능
리스트는 선언 후 크기를 자유롭게 조정할 수 있다.
List<int> list = new List<int>();
list.Add(10); // 크기 자유롭게 추가 가능
list.Add(20);
배열, 리스트 둘 다 값에는 인덱스로 접근한다.
arr[0] = 5;
list[0] = 5;
배열=> 리스트, 리스트<=배열의 형변환이 가능하다.
List<int> list2 = arr.ToList(); //배열 =>리스트
int[] arr2 = list.ToArray(); // 리스트 => 배열
또 불필요한 반복문 없이 그냥 한 줄로만 배열, 리스트를 출력할 수 있는 방법이 있다.
Console.WriteLine(string.Join(", ", arr));
Console.WriteLine(string.Join(", ", list));
=> 배열/리스트 관련 코딩을 할 때에믄 크기가 고정인지 추가, 삭제가 많은 작업인지, 혹은 반환형이 어떻게 되는지를 살펴본다면 배열과 리스트 중 어떤걸 써야 하는지 쉽게 판단할 수 있다.