-
알고리즘 코드카타로 시작하는 하루입니다.
앞으로도 계속 그럴 것이지만요.
오늘 알고리즘 코드카타는 조금씩 버벅거리는 부분이 있었습니다. 그러다가 한 곳에서 딱 막혀버렸는데요.
원래 하는 시간이 지나서 풀지는 못했지만 제가 생각했던 것을 적어보도록 하겠습니다.
x만큼 간격이 있는 n개의 숫자
public long[] solution(int x, int n) { long[] answer = new long[n]; for(int i = 0; i < n; i++) { answer[i] += x; } return answer; }
시간이 지나서 어떻게 만들었는지 정확하게 기억은 안나지만 사이트에 들어가보니 이렇게 적혀있더라구요.
이렇게 할 경우 처음 answer을 생성했을 때 값을 지정해주지 않았기 때문에 인덱스 값은 0입니다.
여기에 x를 더해줄 경우 x 값만 들어가기 때문에 값이 증가하지 않습니다.
public long[] solution(int x, int n) { int sum = 0; long[] answer = new long[n]; for(int i = 0; i < n; i++) { sum += x; answer[i] = sum; } return answer; }
그래서 수정한 함수가 이것입니다.
sum은 x값만큼 계속 더해져서 증가하고 있습니다. 그 값을 answer에 넣어주면 됩니다.
사실 이 생각을 못했지는 않았습니다. 근데 왜 계속 오류가 뜨는가 했더니
long[] answer = new long[] {};
이렇게 설정이 되어있었습니다.
중괄호는 왜 있었는지 모르겠네요.. 혹시나 이게 무슨 의미가 있을까 싶어서 visual studio에서 확인해보니 오류를 내는 범인이였습니다.
그게 아니라면 왜 있던걸까요?
배열의 평균값
평균은 모든 수를 더한 후 더한 갯수를 나눠주면 나오게 됩니다.
잘 풀긴했는데 다른 사람 풀이에서 생각 못했던걸 보게 되어서 적어봅니다.
int[] numbers.Average()
배열의 평균값을 구해주는 함수입니다
foreach문으로 열심히 길게 적는 것보다 함수 하나를 사용해서 간단하게 만드는 것이 좋아보여서 추가해봤습니다.
오늘 팀프로젝트에서는 포션의 종류를 또 만들어보았습니다!
어제는 MP 포션을 만들었다면 오늘은 포션을 이용해서 회복되는 양을 다양하게 만들어주었습니다.
포션만 건드는 이유는 다른 분들이 어디까지 하셨는지 모르기 때문에..
public enum PortionValue { Small = 30, Medium = 50, Big = 100, }
HP, MP와 같이 enum을 사용해주었습니다.
enum의 경우 정수를 설정해줄 수 있는데, 설정하지 않을 경우 자동으로 순서대로 0부터 1씩 증가하는 정수를 부여받습니다.
포션의 종류가 다양해지면서 포션을 관리하기 위해서 PortionList.cs를 만들어주었습니다.
포션 사용 함수 또한 옮겨주었습니다.
private void SumPortion(Portion portion) { for (int i = 0; i < portionlist.Count; i++) { if (portionlist[i].Type == portion.Type && portionlist[i].Value == portion.Value) { portionlist[i].SetPortion(portion.Count); return; } } portionlist.Add(portion); }
포션의 종류에 따라서 포션의 개수만 늘어나게 설정해주었습니다.
새로운 종류의 포션을 얻게 되면 바로 리스트에 저장되지만, 새로운 종류가 아니라면 기존에 있던 포션의 갯수에서 증가되도록 해주었습니다.
portionlist.Sort((portion1, portion2) => portion1.Type == portion2.Type ? portion1.Value.CompareTo(portion2.Value) : portion1.Type.CompareTo(portion2.Type));
포션의 종류가 다양해짐에 따라서 포션 리스트를 출력할 때 보기 편하도록 만들어주었습니다.
리스트를 정렬할 때는 OrderBy(), Sort()를 사용할 수 있습니다.
두 함수 모두 HP와 MP를 구분해서 같은 타입별로 정렬이 가능하지만, Sort()의 경우 같은 타입일 때 회복되는 양에 따라 정렬할 수 있도록 설정할 수 있기 때문에 사용해주었습니다.
PortionList로 포션을 관리함에 따라 포션 사용 함수 또한 조금 변경되었습니다.
매개 변수에 Portion을 생성하여 구성해주었습니다.
그렇다면 매개변수 Portion에 PortionList에 있는 포션이 들어가야 물약 갯수 변경이 PortionList에도 적용이 됩니다.
public Portion GetPortion(PortionType type, int n) { int idx = 0; for (int i = 0; i < portionlist.Count; i++) { if (portionlist[i].Type != type) { idx++; } else break; } return portionlist[idx + n -1]; }
PortionList에 있는 Portion을 가져오는 함수입니다.
간단하게 사용할 포션의 숫자를 입력하면 (입력값-1)을 인덱스에 넣어서 포션을 사용하면 됩니다.
만! 문제는 MP포션입니다.
회복할 수 있는 것은 체력(HP), 마나(MP) 두 가지가 있습니다.
하지만 PortionList에서는 HP포션과 MP포션을 모두 포함하여 list로 관리하고 있습니다.
그래서 HP포션 리스트와 MP포션 리스트를 만들어서 사용해주려고 했는데,
음... 이렇게 될 경우 PortionList와 HPList, MPList를 서로 연결해줘서 사용되거나 얻으면 갯수가 변경되도록 해야하는데 그게.. 생각처럼 쉽지 않아서 새롭게 방법을 생각했습니다.
PortionList는 위에 정렬을 통해서 HP와 MP로 나눠져서 정렬되어 있습니다.
즉, MP포션보다 HP포션의 인덱스의 값이 작습니다.
그렇기 때문에 int idx = 0을 이용해서 PortionList에 있는 HP포션의 인덱스 값을 더해서 MP포션의 인덱스 값을 찾도록 만들었습니다.
idx는 HP포션의 인덱스 값을 의미하며 n-1은 선택된 포션의 인덱스 값을 의미합니다.
HP포션을 선택하면 idx = 0으로 인덱스 값은 n-1만 들어가게 되며, MP포션을 선택하면 idx !=0이므로 idx + n - 1 값이 들어가게 됩니다.
말로 설명하기 너무 빡쎄고..
아무튼! 정상적으로 작동합니다! 오예!
이제 또 머하죠..?
기능 구현할 것이 지금 생각이 딱히 나지 않아서 고민입니다..
ReadMe 작성을 할까 싶어서 찾아보고 있기는하는데 무엇을 적어야할지 팀원들이랑 논의를 해봐야할 것 같습니다.