solved.ac class 163

[백준 2164] 카드2 [C]

풀이 본래 Queue를 이용해 푸는 문제지만, 다음과 같은 규칙성이 존재해 간단하게 풀이했다. N이 1일때, 결과가 1이다. N >= 2 일때, N에서 N보다 작은 2의 제곱을 뺀 값에 2를 곱해준 값이 결과와 일치한다. 65~128까지의 N은 N보다 작은 2의 배수인 64를 뺀 값에 2배를 곱하여 출력할 것이다. 129 ~ 256의 N또한 마찬가지로 N보다 작은 2의 배수인 128를 뺀 값에 2배를 곱하여 출력할 것이다. 소스코드 #include int main(){ int N, sq = 1; scanf("%d", &N); for (; sq

[백준 10814] 나이순 정렬 [C]

풀이 나이와 이름을 등록할 수 있는 구조체를 만들어 사용하자. 나이가 같을 경우 등록된 순서대로 출력을 해주어야 하기 때문에 다음과 같은 방법을 생각해 볼 수 있다. 구조체 내부에 order변수를 선언해서 등록 순서를 입력 조금은 복잡하지만 구조체 배열의 인덱스를 활용하여 메모리를 절약 등록순서 1 2 3 4 5 6 7 " " 나이 20 21 20 23 21 20 23 " " 하지만, 나이를 고려하지 않을 경우 이미 등록 순서는 오름차순으로 정렬되있다, 때문에 추가로 정렬을 해주지 않고, 가장 적은 나이에서 가장 많은 나이까지 분류를 하여 출력해주는 방식으로 해결했다. 등록순서 1 3 6 나이 20 20 20 등록순서 2 5 나이 21 21 등록순서 4 7 나이 23 23 소스코드 #include #in..

[백준 10818] 최소, 최대 [C]

풀이 N개의 정수를 전부 저장할 필요 없이 입력받은 직후 최솟값인지, 최댓값인지 구분해 해결할 수 있다. 소스코드 #include int main() { int N, num, max, min; scanf("%d", &N); for (int i = 0; i max) max = num; } printf("%d %d", min, max); } 출처 10818번: 최소, 최대 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 ..

[백준 10809] 알파벳 찾기 [C]

풀이 모두 소문자만 입력된다는 점을 index로 이용하면 된다. str[i] 'a' 'b' " " 'y' 'z' str[i] - 'a' 0 1 " " 24 25 str[i] - 'a' 를 index로 활용하여, 각 알파벳에 맞는 배열의 값에 처음으로 등장하는 위치(값)을 입력해주면 된다. 단, 중복해서 값이 들어가는 것을 방지하기 위해 배열의 요소 값이 0(초기값)일 때만 입력하도록 한다. 소스코드 #include int main(){ char str[101], cnt[26] = { 0, }; scanf("%s", str); for (int i = 0; str[i] != '\0'; i++) if (!cnt[str[i] - 'a']) cnt[str[i] - 'a'] = i + 1; for (int i = ..

[백준 9498] 시험 성적 [C]

풀이 0~100 사이의 점수만 입력되는 친절한 문제이다. 입력된 점수를 10으로 나눈 값을 index로 활용하여 해결할 수 있다. 소스코드 #include int main(){ int grade; scanf("%d", &grade); putchar("FFFFFFDCBAA"[grade/10]); } 출처 9498번: 시험 성적 시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오. www.acmicpc.net

[백준 8958] OX퀴즈 [C]

풀이 입력받은 문자열에서 'O'이면 1 증가시킨 temp를 sum에 더해주고, 만약 'X'가 나오면 temp를 0으로 초기화해 다음 'O' 가 나올 때 다시 1부터 더해줄 수 있도록 하면 된다. C99로 컴파일하기 때문에 조건연산자 사용에 주의해야 한다. 소스코드 #include int main() { char str[80], N; scanf("%d", &N); while (N--) { int temp = 0, sum = 0; scanf("%s", &str); for (int i = 0; str[i] != '\0'; i++) (str[i] == 'O') ? sum += ++temp : (temp = 0); printf("%d\n", sum); } } 출처 8958번: OX퀴즈 "OOXXOXXOOO"와 같..

[백준 3052] 나머지 [C]

풀이 입력받은 값을 42로 나누었을 때의 나머지를 저장해두고 비교해서 서로 다른 수가 몇 개인지 찾아내는 문제이다. 최선의 경우에는 1개이지만, 최악의 경우에는 42개가 나올 수 있다. 수를 입력받고 배열의 마지막 인덱스까지 탐색 했는데 동일한 수가 없다면, 새로 등록을 해주는 형식이다. 소스코드 #include int main(){ int arr[42], num, idx = 1; for (int i = 0; i < 10; i++){ scanf("%d", &num); num %= 42; if (!i) arr[0] = num; else for (int j = 0; j < idx; j++) if (arr[j] != num && j == idx - 1){ arr[j+1] = num; idx++; }else i..

[백준 2920] 음계 [C]

풀이 항상 1부터 8까지 8개의 수가 입력되고, 오름차순 또는 내림차순으로 정렬되어있는지 아닌지를 확인하면 된다. 때문에, 반복문 내의 변수 i값의 증가를 이용해 확인할 수 있다. ascending 또는 descending라면 입력된 수들의 처음과 끝수의 합이 항상 9 이다. 1 ~ 4번째 수가 i + 1과 동일하다면, ascending이다. (5~8번째 수의 쌍은 위 조건에서 만족한다.) 처럼 풀이하는게 문제의 출제의도이나, 입력되는 수들을 하나의 문자열로 생각하면 쉽게 해결할 수 있다. ??? : 숫자가 주어진다 했지 문자열이 아니라고는 안했다. 하지만, 이 방법은 비교할 문자열을 직접 작성 또는 생성을 해야 하므로 간결하면서도 무식한 방법이라고 볼 수 있다. 만약 숫자가 1부터 100이라면? 소스코..