전체 글293 정렬알고리즘_버블정렬 [2/8] [ 버블 정렬이란? ] 기준값과 다음값을 비교해서 작은 값을 앞으로 가져옴 이 과정을 계속 반복해서 마지막까지 가면 정렬 완료 코드는 간단하지만 O(n^2)의 시간 복잡도를 가지는만큼 매우 비효율적인 정렬 방식 수행횟수 : 9 + 8 + 7 + ... + 1 = 9(9+1)/2 = n(n+1)/2 선택정렬보다 값을 교체(Swap)하는 수행 횟수가 많으므로 더 비효율적이고 느림 arr[0] > arr[1] 이면 두 값을 바꿔줌 arr[1] > arr[2] 이면 두 값을 바꿔줌 ...반복... arr[8] > arr[9] 이면 두 값을 바꿔줌 (한 사이클 완료) arr[0] > arr[1] 이면 두 값을 바꿔줌 ...반복... arr[7] > arr[8] 이면 두 값을 바꿔줌 (한 사이클 완료) ...반복... ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 정렬알고리즘_선택정렬 [1/8] [ 선택정렬이란? ] 전체 데이터를 모두 검색하는 과정을 반복해서 특정 기준으로 정렬하는 방법 쉽게 사용할 수 있으나, O(n^2)의 시간 복잡도를 가지는만큼 매우 비효율적인 정렬 방식 수행횟수 : 9 + 8 + 7 + ... + 1 = 9(9+1)/2 = n(n+1)/2 [ 오름차순 vs 내림차순 ] 왜 항상 헷갈리는 걸까요.. 내림차순 : 큰 것 → 작은 것 (높은 고도(500)에서 내려간다 (1)) 오름차순 : 작은 것 → 큰 것 (낮은 고도(1)에서 올라간다(500)) arr[0] ~ arr[9] 중 가장 작은 값을 찾아 "arr[0]"과 바꿔줌 arr[1] ~ arr[9] 중 가장 작은 값을 찾아 "arr[1]"과 바꿔줌 arr[2] ~ arr[9] 중 가장 작은 값을 찾아 "arr[2]"와 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 재귀함수_팩토리얼 예제 [1/1] 저는 개인적으로 시작할 때 들었던 악명 높은 포인터도 어렵다고 느껴본적이 없는데.. 오히려 재귀함수가 제일 어려웠던 것 같습니다. 물론 원리를 알고 나니 그리 어렵지만은 않지만요. 재귀함수는 잘못하면 무한루프가 돌기 쉬우니 조심하셔야 합니다. [ 재귀함수란? ] 말 그대로 함수 안에 자기 자신의 함수가 다시 있는 것을 뜻 함 (Recursion) 특정 조건을 만족시킬때까지 함수실행-함수실행-함수실행 형태로 같은 함수 반복 수행 아래는 재귀함수에서 제일 흔한 예제인 팩토리얼 구현입니다. 5! = 5 * 4 * 3 * 2 * 1 == 120 3! = 3 * 2 * 1 == 6 아래 예제만 보면 굳이 재귀함수를 사용할 필요 없이 일반 반복문을 사용하면 충분해 보입니다만.. 같은 기능을 다른 범위나 다른 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 큐 구조_미로찾기 (최종 ver) [3/3] 만들다보니 갑자기 욕심이 생겨서 조금 더 기능을 추가하게 됐습니다. 중요한거만 얼른 하고 넘어가야 하는데 계속 딴길로 새서 문제네요.. 최단 거리를 찾기 위해 고민하다가 결국 모든 길을 다 돌아다녀봐야한다는 점에 착안해서 만들어봤습니다. 동서남북방향을 동시에 다 가보고 제일 먼저 도착하는 길을 찾는 방식입니다. 이전 버전을 만들고 나서 좀 미흡해보였던 부분들을 수정하고, 추가로 필요한 기능들을 넣어서 다시 만들어 보았습니다. 분기점이 나올 때마다 새로운 길이 생김 몇 개의 길이 발생할지 모르니 일반 배열을 사용하기가 어려움. 연결리스트 사용 왔던 길을 되돌아가는 구조가 아니라서 스택구조와는 크게 관계가 없는 자료구조가 됨 아래와 같이, 출발점을 기준으로 갈 수 있는 길이 나오면 다시 그 길을 기준으로.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_미로찾기 (애니메이션 ver) [2/3] 애니메이션 형태로 만들기는 간단하네요. 내친 김에 직접 움직여서 탈출하는 게임으로도 만들어볼까 했지만.. 콘솔로 게임 만들기는 좀 찾아보다보니 로직이나 알고리즘 전개의 문제라기보단 윈도우 제어 함수를 다루는 것에 더 중점이 있는 것 같아서 굳이 거기까지 공부할 필요는 없단 생각이 듭니다. 하면 좋기야 하겠지만 빨리 공부하고 JAVA로 넘어가는 편이 더 나을 것 같네요. 애니메이션 형태로 출력하기 위해 두 가지를 수정했습니다. [ gotoxy() 함수 추가 - 출력 위치 지정 ] 기본 함수가 아니라 직접 만들어줘야함 (인터넷에 아주 많음) 유명한 함수 이름이 gotoxy()인데, 사실 이름은 마음대로 지정해서 쓰면 됨 windows.h 헤더파일에 있는 커서 위치 정보 변환 함수를 써서 만들어줌 시간이 나면.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_미로 찾기 [1/3] 이번 과제는 미로 찾기입니다. 두 달 가까이 열심히 공부했더니 이제 이정도는 꽤 순조롭게 짤 수 있게 됐네요. 왕기초 과제이지만 왕초보인 저는 아직은 이정도만해도 뿌듯.. 뭔가 애니메이션같이 진행되는 모습을 보고 싶은데 방법이 없나 내일 한 번 찾아봐야겠어요. 과정마다 하나씩 프린트할 수는 있지만 영 맘에 들진 않네요..ㅎㅎ 해당 과제는 유투브 '권오흠'님의 자료구조 강의를 참조하였습니다. [ main() ] 사실 이번 건 코딩보다 미로 그리는게 더 어려웠던 것 같음.. 미로크기는 언제든 변경할 수 있게 매크로를 사용 배열 내용이 낭비없는 구성이라 포인터 변수 배열 대신 일반 배열을 사용함 이동할 수 있는 최대값인 MAX는 ROW * ROW * 2 로 설정 #include #include #define .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_후위표기식_수식 계산하기(수정/기능추가) [3/3] 강의는 저랑 완전 다른 방식으로 풀어내네요. 여러가지 방면에서 다르지만 가장 큰 차이점은 괄호도 연산자와 마찬가지로 취급하여 처리한다는 점입니다. 그 외에는 함수를 어떤 방식으로 구성해서 사용했는가 정도의 차이 같습니다. 강의에는 나오지 않았지만 굳이 후위표현식으로 변환하지 않고 연산자가 나오면 바로바로 계산해도 될 것 같습니다. 강의에서 진행한 방식과 제 방식을 섞어서 다시 최종 버전을 만들어봤습니다. 그리고 다시 하는김에 조금 더 완벽하게 만들어보기 위해 이것저것 기능을 더 추가해봤습니다. 강의에 풀이가 없는 기능들이라.. 얼마나 잘 짰는지는 알 수가 없네요. 일단 기능은 다 잘 됩니다. ㅎㅎ 대략 아래와 같은 방식입니다. [수정사항] 괄호와 연산자를 하나의 스택(배열)을 사용해서 연산 순서 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_후위표기식_수식 계산하기(괄호 포함 수식) [2/3] 괄호를 어떻게 해결할지 한참 고민했네요. "괄호가 시작되면 별도의 수식으로 생각한다." 라는 점을 두고 한참 고민하다 답을 찾긴 했습니다. 맞는진 모르겠지만..ㅎㅎ 기본 개념도는 아래와 같습니다. 괄호가 시작될 때마다 새로운 배열로 만들어주고, 괄호가 닫히면 괄호안의 값을 계산해서 앞 수식의 뒤에 붙여주는 방식으로 괄호가 없는 최종 수식을 만들어내면 되네요. 괄호만 잘 골라내주면 어제 만든 계산 수식을 이용해 간단히 짤 수 있었습니다. [ main() ] 수식이 길어져서 소스파일을 나눔 #include "Header.h" int main() { /* 중위표기식 원본 문자열*/ char form[] = "10+21*(2*(15-10)/2)-3"; int result = calculation_all(fo.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_후위표기식_수식 계산하기(괄호 없는 수식) [1/3] [구현 목표] 수식 내 우선순위에 따른 계산 결과 도출 ex) "2 + ((35+65) / 25) * 7" 과 같은 형태의 수식 계산 (엑셀과 비슷) 강의 보기 전에 미리 해보고 있는데 생각보다 엄청 복잡하네요.. 공부 하면서 가장 많이 느끼는 점은 간단해보이는 프로그램들이 실제로는 간단하지 않다는거.. 존경해요 MS.. 괄호까지 한번에 해결하려고 했는데 제 머리로는 답이 안나오네요. 일단 괄호가 없는 식을 계산하는 함수를 만들고, 괄호가 나오면 함수를 통해 괄호가 없는 것처럼 따로따로 계산하는 방식을 사용하기로 했습니다. [ main() ] 입력받을 수식을 저장하는 공간, 후위표기식으로 변환 저장할 공간, 결과값 공간 생성 #include #include #include void postfix(ch.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_괄호 수식 검증 [1/1] 해당 과제는 유투브 '권오흠'님의 자료구조 강의를 참조하였습니다. 닫힌 괄호는 가장 마지막에 나온 열린 괄호와 같은 유형이어야 한다라는 점만 유의하면 간단하게 작성할 수 있습니다. 어차피 스택과 같은 후입선출 개념을 사용할 수밖에 없습니다. 열린 괄호가 나오면 해당 유형 번호를 배열에 순서대로 저장 닫힌 괄호가 나오면 가장 마지막에 나온 열린 괄호와 유형이 같은지 확인 후, 해당 배열값을 제거 해당 순서의 열린괄호와 다른 유형의 닫힌 괄호가 나오면 에러값 반환 짝이 맞지 않아 배열의 값이 남거나 또는 모자랄 경우 에러값 반환 실제 엑셀과 같은 괄호 계산 식의 구현은 다음글들을 참조하시면 됩니다. 2019/12/09 - [C언어/알고리즘 및 자료구조] - 스택구조_후위표기식_수식 계산하기(괄호 없는 수식).. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 연결리스트_일반 배열 vs 연결리스트 [3/3] 일반 배열과 연결리스트는 비슷한 개념이지만, 사용 여부는 '순서'에 따라 달라질 것 같습니다. 일반 배열 : 들어온 순서대로 데이터가 쌓일 때 유리 연결리스트 : 들어온 순서가 관계 없이 특정 기준으로 데이터가 항상 정렬되어야 할 때 유리 [일반배열] 데이터 순서를 변경할 때 해당 순서 뒤의 데이터를 모두 복사-붙여넣기 해줘야함 중간에 데이터가 들어오거나 삭제될 때마다 뒷 순서의 배열을 모두 옮겨주는 작업이 발생 데이터 변경이 많을 수록 비효율적인 구조가 됨 배열의 크기는 미리 정해놔야하기 때문에, 빈 메모리 공간이 발생하여 비효율 초래 배열이 꽉 차 새로 메모리를 할당할 경우, 모든 데이터를 복사하는 작업 발생 ※ Point 따라서 데이터의 순서변경이 잦거나, 쌓이는 데이터의 수량을 적절히 파악하기 힘.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 연결리스트_다항식_코드 상세 [2/3] 워낙 간단한 수준이라 주요 포인트만 짚어보겠습니다. 해당 과제는 유투브 '권오흠'님의 자료구조 강의를 참조하였습니다. [ 메인 함수 ] 각 다항식을 차수별로 정렬하기 위해 구조체의 연결리스트 방식을 사용 read_line 함수에서 명령어를 읽어서 처리하며, 입력 글자가 없으면 continue #define INPUT 50 #define LIST 10 /* 다항식 각 요소 저장 연결리스트 */ typedef struct Inside { int coef;// 지수 int expo;// 계수 struct Inside* next; }Inside; /* 변수 이름 및 다항식 head 위치 */ typedef struct { char* name; // 변수 이름 Inside* head; // 다항식(연결리스트)의 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 5. 연결리스트_다항식_구현목표 및 전체코드 [1/3] [ 구현 목표 ] 다항식 차수별로 내림차순으로 저장 'printf 변수' 출력 시 해당 형식에 맞게 출력 (존재하지 않는 변수의 경우 경고메세지 출력) '='이 두 개 이상 포함 시 경고 메세지 출력 기존 존재하는 변수에 식을 넣으면 덮어쓰기 기존 변수를 활용한 더하기 기능 명령어 입력 시 띄워쓰기 무시 'calc (변수) (x값) 입력 시 계산결과 출력 및 해당하는 변수가 없을 경우 경고 메세지 출력 'exit' 입력 시 프로그램 종료 [ 전체 코드 ] * 다음 글 코드 상세 참조 #include #include #include #include #define INPUT 50 #define LIST 10 /* 다항식 각 요소 저장 연결리스트 */ typedef struct Inside { int coef.. ▸C언어/알고리즘 및 자료구조 2019. 12. 5. 조건문(if)과 증감연산자(i++) 사용시 주의사항 후위 또는 전위 증감연산자 ++이나 --는 코드를 읽고 지나가기만 하면 작동됩니다. 쓰임은 다들 아실테지만 조건문에 잘 못 넣어서 의도와 다르게 작동할 때가 종종 있습니다. 아래 코드의 결과는 3입니다. 조건절에 하나도 걸린게 없음에도 i의 값이 3 증가되었습니다. if문의 조건을 세 번 통과하면서 ++i 가 작동했기 때문입니다. 만약 조건에 맞았을 때 i가 증가하도록 의도했다면 오작동하게 됩니다. 따라서 의도한 바가 아니라면 if문의 조건식 안에는 증감연산자를 넣지 않는 것이 좋습니다. #include int main() { int i = 0; if (++i == 12) puts("ㅇ.ㅇ"); else if (++i == 12) puts("ㅇ.ㅇ"); else if (++i == 12) puts(".. ▸C언어/개발 TIP 2019. 12. 5. 삼항연산자(3항연산자) 사용법 (if문 대체) 가끔 if문이 길어지면 보기가 불편할 때가 있습니다. 간단한 if문을 대체할 수 있는 삼항연산자의 사용법입니다. [ 문법 ] 조건 ? 참일경우 실행할 내용 : 거짓일경우 실행할 내용; int main() { int a = 200; int b = 100; a > b ? printf("a가 크네") : printf("b가 크네"); } 위와 같이 문법은 매우 간단합니다. 다시 응용을 좀 해보자면 아래와 같이 쓸 수도 있습니다. 1. 실행할 내용이 변수에 값을 넣어줄 때 (변수가 하나) 연산자 우선순위로 인해, c = (a > b ? 1 : 0); 방식으로 실행됨 삼항 연산자부터 실행해서 값을 가져온 뒤, c에다가 넣어줌 int main() { int a = 200; int b = 100; int c = .. ▸C언어/개발 TIP 2019. 12. 5. 이전 1 ··· 16 17 18 19 20 다음 💲 추천 글 반응형