2023/11/03 TIL
프로젝트가 거의 마무리된 오전엔 남은건 사소한 수정들 밖에 없었다.
뭘해야하나 생각하던 중 팀원중 한분이 알고리즘 문제를 추천해주셨다.
https://school.programmers.co.kr/learn/challenges?order=recent
코딩테스트 연습 | 프로그래머스 스쿨
개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!
school.programmers.co.kr
알고리즘 문제를 풀던 와중 최빈값 문제를 접하게 되었다.
생각보다 어려워서 해결방법을 검색해보게 되었다.
프로그래머스 최빈값 구하기[C언어]
주어진 배열 값 중에서 가장 많이 나온 값, 즉 가장 자주 나오는 값을 최빈값이라고 한다. 최빈값이 2개 이상이면 (EX) 2, 2, 3, 3 -1을 리턴한다. 정렬 알고리즘을 함께 생각해 보면 수월하다.
velog.io
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// array_len은 배열 array의 길이입니다.
int solution(int array[], size_t array_len) {
int answer = 0; //리턴 결과 값
int freq = 1; //배열 내 같은 값을 가진 원소가 있다면 1씩 증가하는 변수
int idx = 1; //최빈값 변수
if(array_len == 1) //만약 길이가 1일경우 나오는 값 고정
{
answer = array[0]; return answer;
}
for(int i = 0; i < array_len-1; i++) //i=0~n-1 까지
{
freq = 1;
for(int j = i+1; j < array_len; j++) //j=1~n까지
{
if(array[i]==array[j]) freq++; //i번째와 j번째가 같다면 freq를 1 늘린다.
if(freq>idx) //현재 발견한 최빈값의 빈도가 기존 최빈값보다 크다면
{
idx = freq; //이변에 발견한 최빈값의 빈도를 할당
answer = array[i]; //최빈값을 answer에 저장
}
else if(freq == idx && answer!=array[i])
//같은 빈도를 가지는 값이 2개 존재하고, answer에 아직 할당된게 없다면
answer = -1;
}
}
return answer;
}
내가 이해한 부분을 옆에 주석에 달아두었다.
이런식으로 루프를 사용할 수 있다는걸 깨달았다.
보는김에 다른 풀이과정도 한번 살펴보자.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// array_len은 배열 array의 길이입니다.
int solution(int array[], size_t array_len) {
int answer = 0;
int count = 0;
int check = 0;
for(int i = 0; i < array_len; i++){
for(int j = i; j < array_len; j++){ //이번엔 j=0부터 시작해서 끝까지 카운팅 하게 된다.
if (array[i] == array[j]) count++; //i=j부터 시작하므로 count는 무조건 한개 이상이 된다.
//윗줄에서 최빈값은 몇번 나오는지 계산됨.
}
if(count > check){ //최빈값이 1개만 나올때
answer = array[i]; //최빈값 i를 정답
check = count; //나온 최빈값 빈도수를 check에 할당
}
else if(count == check){ //최빈값 빈도수가 같은 경우
answer = -1;
}
count = 0; //초기화
}
return answer;
}
C#을 이용한 풀이도 있다.
using System;
using System.Linq;
public class Solution {
public int solution(int[] array) {
var list = array.GroupBy(x => x, g => g, (x, g) => new { n = x, cnt = g.Count() });
var max = list.Where(x => x.cnt == list.Max(o => o.cnt));
int answer = max.Count() == 1 ? max.First().n : -1;
return answer;
}
}
C#을 이용한 풀이에는 처음보는게 너무 많다.
팀원에게 물어보니 Linq라는게 있다고 한다.
오늘은 Linq를 공부해보고자 한다.
https://developer-talk.tistory.com/556
[C#]링크(LINQ)란?
LINQ란? LINQ(Language-INtegrated Query)의 약자인 LINQ는 데이터 질의(Query) 기능을 C#에서 사용할 수 있는 기술입니다. 쉽게 설명하자면 C#의 배열, 컬렉션, XML, DataSet 등... 에서 내가 원하는 데이터만 가져
developer-talk.tistory.com
LINQ란?
Language-Intergrated Query의 약자로 데이터 질의(Query) 기능을 C#에서 사용할 수 있는 기술이다.
예시를 들어보자
class Program
{
static void Main(string[] args)
{
string[] strArr = { "Apple", "Banana", "Car", "Angular", "Add", "Sum" };
var linqResult = from str in strArr
where str.StartsWith("A") && str.Length > 3 //3글자 이상, A로 시작함.
select str; //선택된 문자열을 반환
foreach (var str in linqResult)
Console.Write(str + " ");
}
}
반복문과 조건문 없이 LINQ에서 사용할 수 있는 문법을 사용하여 원하는 문자열을 추출하였다.
LINQ는 C# 및 VB.net에서만 사용할 수 있다.
LINQ의 주요 기능
- LINQ to objects - 배열, 컬렉션, 제네릭 컬렉션에서 LINQ를 사용하여 원하는 데이터를 추출할 수 있습니다.
- LINQ to XML - XML 문서에서 LINQ를 사용하여 원하는 데이터를 추출할 수 있습니다.
- LINQ to SQL - SQL 서버의 데이터베이스와 함께 동작할 수 있습니다.
- LINQ to DataSet - DataSet에 LINQ를 사용하여 원하는 데이터를 추출할 수 있습니다.
LINQ의 장점
- SQL과 유사하므로 SQL 사용이 익숙하다면, 쉽게 접근할 수 있습니다.
- LINQ는 컴파일 시간에 타입을 체크합니다. 따라서, 프로그램 실행 전에 문제가 되는 코드를 수정할 수 있습니다.
- 반복문, 조건문을 사용하는 것보다 코드가 단순해집니다.
- LINQ의 질의는 재사용할 수 있습니다.
LINQ의 단점
- RDBMS를 사용해보지 않은 개발자에게는 어려울 수 있습니다.
- SQL과 유사하지만, 복잡한 질의(Query)는 작성할 수 없습니다.
- 질의가 잘못된 경우 for, foreach와 같은 반복문을 사용하는 것보다 성능이 저하될 수 있습니다.
LINQ 기본 구조
- from - 어떤 데이터에서 원하는 값을 추출할 것인지
- where - 원하는 값을 추출하기 위한 조건
- select - 데이터에서 어떤 항목을 추출할 것인지
LINQ의 질의 구문은 from 키워드로 시작하여 select 키워드로 끝납니다.
라고 한다.
위에서 들은 예시를 통해 기본 구조를 살펴보자.
var linqResult = from str in strArr
- var은 뒤에 나오는 변수의 자료형을 자동으로 저장하는 것이다.
- var은 지역변수로 선언해야 한다.(매서드 내부에 선언된 변수)
- 선언과 동시에 초기화 작업이 필요하다.
- strArr이라는 데이터 배열의 각 요소를 LINQ절에서 str로 사용할 것이라고 명시한다.
where str.StartsWith("A") && str.Length > 3
- str은 배열의 요소이다. 위의 from절에서 말했다시피 strArr이라는 데이터의 각 요소이다.
- 첫 번째 문자가 "A"로 시작하고 문자열의 길이가 3보다 큰 값을 추출할 것이라고 조건을 작성했습니다.
- 첫 문자가 A로 시작하고 길이가 3보다 큰 값을 추출 할 것이라는 조건이다.
select str;
- select 절에는 추출하고 싶은 항목을 작성한다.
- 객체인 경우 특정 프로퍼티를 명시할 수 있습니다.
==이후는 나중에 추가 예정
오늘은 미니 프로젝트를 마무리 하고 발표하는 날이다.
다른 조들의 발표를 보았는데 우리조가 구현하지 못한 기능들을 구현한 조들이 있었다.
설정창을 구현한 조, 카드를 배분하는 애니메이션 등 시간상 못한 내용들이였다.
하지만 게임성을 보니 우리조가 꿀리지 않는다는 생각이 들었다.
https://www.notion.so/6-7-73afd15564a940c3a933c08895ede268
6조 - 7조
6조인데 왜 이름이 7조냐구요?
www.notion.so
예상대로 발표가 끝난 후, 튜터님들의 극찬을 들을 수 있었다.
하지만 아쉬운점 역시 들을 수 있었는데
미니게임으로 넣은 화살 피하기가 너무 비중이 큰 느낌이여서 본 게임이 묻힌다는 이야기였다.
이는 팀원들의 회의중에도 나왔던 내용이였다.
시작화면을 하나 더 만들어서 게임을 분리하자는 이야기가 나왔었지만 시간상 불발되었었는데
이럴줄 알았다면 만들껄 그랬다.
프로젝트가 마무리되고, 팀원들과 피드백을 마쳤다.
이번 프로젝트가 끝나고 배운점이 많다고 생각했다.
모르던 내용들에 대해 팀원들이 알려준 부분도 많았고
게임이 개발되면서 어떤 사건사고가 나는지 깨달은 것도 있었다.
특히 branch를 사용하면서 Merge할때 얼마나 많은 오류가 나는지도 알게 되었다.
그래도 끝나고나니 이렇게 보람차고 알찬 일이 없다고 생각한다.
팀 프로젝트는 폐기하지 않고 틈틈히 고쳐나갈 것이다.