3중 반복문을 사용하여 첫번째 별을 찍기 전의 공백과 두번째 별을 찍기 전의 공백을 구현하였습니다. 첫번째 공백은 개수가 1씩 감소하다가 증가하고 두번째 공백의 개수는 2씩 증가하다가 감소하는 알고리즘을 사용하였습니다.
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n;i++){
for(int j = 0; j < n-i-1; j++){
printf(" ");
}
printf("*");
for(int j = 0; j < i*2; j++){
printf(" ");
}
printf("*");
printf("\n");
}
for(int i = n; i > 0; i--){
for(int j = 0; j < n-i; j++){
printf(" ");
}
printf("*");
for(int j = 0; j < i*2-2; j++){
printf(" ");
}
printf("*");
printf("\n");
}
return 0;
}
정수 N의 범위가 1 <= N <= 100 이므로 100x100사이즈의 배열을 생성해주고 각 인덱스를 순서대로 초기화 해준 후 입력 받은 테두리의 값을 더해서 출력해주면 됩니다.
#include <stdio.h>
int main() {
int n, a=1, sum=0;
int arr[101][101]={ 0, };
scanf("%d", &n);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
arr[i][j] = a++;
}
}
for(int i = 0; i < n; i++){
for(int j = 0;j< n; j++){
if( (i == 0 || i == n-1) || (j == 0 || j == (n-1))){
sum += arr[i][j];
}
}
}
printf("%d", sum);
return 0;
}
조건문을 많이 사용하지 않고 풀 수 있을것이라 생각해서 계속해서 연구해보았습니다.
달팽이 모양으로 값을 저장할 때 찾아낸 알고리즘은 (x, y)인덱스에 값을 저장한다 했을 때
한줄을 저장시킬 때 x면 x, y면 y 한 곳만 움직인다는 것이고 한 줄씩 저장할 때마다 값을 저장하는 횟수가 1씩 줄어든다는 것이었습니다. 이에 반복문을 통해 인덱스 값을 움직이는 것보다 따로 지역변수로 row, col을 생성하여 x, y값을 저장하는 방식을 선택했습니다.
또, 달팽이의 한바퀴의 저장형식을 보았을 때 처음 세로는 y값이 1씩 감소, 가로는 x값이 1씩 증가, 두번째 세로는 y값이 1씩 증가, 가로는 x값이 1씩 감소 형식이기에 reverse변수를 첫 가로 표현 후 -1로 역전 시켜주었습니다.
위에서 말했듯이 한 줄을 저장할 때마다 한 줄을 저장하는 횟수가 1씩 줄어드므로 L 변수를 따로 사용하여 감소시켰습니다.
간단하게 정리하면 reverse 변수로 인덱스를 움직였고 L 변수로 저장하는 칸을 하나씩 줄여나갔습니다.
#include <stdio.h>
int main() {
int a[100][100]={ 0, };
int n, m, reverse = -1;
scanf("%d %d", &n, &m);
int col = 0, row=n;
int L = 0;
for (int count = 1; count <= n * m;) {
for (int i = 0; i < n - L; i++) {
row += reverse;
a[row][col] = count++;
}
reverse = -reverse;
for (int i = 0; i < m - L - 1; i++) {
col += reverse;
a[row][col] = count++;
}
L++;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++){
printf("%d", a[i][j]);
}
printf("\n");
}
return 0;
}
제귀 함수를 사용하여 2로 계속 나눈값을 제귀 시켜주었고 매개변수가 2보다 작을 때 값을 출력해주었습니다. 사람이 10진수를 2진수로 변환하는 과정을 코드를 통해 구현하였습니다.
#include <stdio.h>
void f(int n){
if(n < 2){
printf("%d", n);
} else{
f(n/2);
printf("%d", n%2);
}
}
int main() {
int n;
scanf("%d", &n);
f(n);
return 0;
}
'\n'전까지 문자열을 입력받아 저장한 후, string 헤더의 strstr함수를 사용하여 love의 개수를 새주었습니다. strstr의 반환값은 문자열을 찾으면 해단 위치의 포인터를 찾지 못하면 null을 반환하기 때문에 while문을 통해 NULL을 계속 확인해주며 love 단어의 개수를 카운트해주었습니다.
#include <stdio.h>
#include <string.h>
int main() {
int count = 0;
char str[101];
scanf("%[^\n]s", str);
char *ptr = strstr(str, "love");
while (ptr != NULL)
{
ptr = strstr(ptr + 1, "love");
count++;
}
printf("%d", count);
return 0;
}
출력을 a~z까지 사용된 알파벳 개수만 해주면 되므로 cnt배열을 사용하여 a~z를 0~26인덱스로 구현하여 카운트 해주었습니다. 소문자 a는 아스키코드 10진수로 97이므로 -97해주어 인덱스를 설정해주었습니다.
#include <stdio.h>
#include <string.h>
int main() {
int idx;
char str[101];
char c = 'a';
int cnt[27] = {0,};
scanf("%[^\n]s", str);
for(int i = 0; i < strlen(str); i++){
idx = str[i]-97;
if(idx >= 0 && idx < 27){
cnt[idx]++;
}
}
for(int i = 0; i < 26; i++){
printf("%c:%d\n", c+i, cnt[i]);
}
return 0;
}
높이 h의 지그재그를 r번 출력해주면 되기 때문에 공백이 1씩 증가한 후 공백의 수가 h-1이 되면 1씩 감소하는 알고리즘을 사용하였습니다.
#include <stdio.h>
#include <string.h>
int main() {
int h,r ;
scanf("%d %d", &h, &r);
for(int i = 0; i < r; i++){
for(int j = 0; j < h; j++){
for(int l = 0; l < j; l++){
printf(" ");
}
printf("*");
printf("\n");
}
for(int j = h-1; j > 0; j--){
for(int l = 0; l < j-1; l++){
printf(" ");
}
printf("*\n");
}
}
return 0;
}
알파벳 대소문자만 입력해주므로 대소문자구분 없이 a, z의 수를 새어주었습니다.
알파벳을 카운트할때는 대소문자를 구분하여 대문자면 65(A)를 빼준 값을 인덱스 번호로,
소문자면 97(a)를 빼준 값을 인덱스 번호로 카운트해었습니다.
그 후 가장 많이 나온 알파벳을 대문자로 출력해주었습니다.
#include <stdio.h>
#include <string.h>
int main() {
char s[1000001];
int ABC[26] = { 0, };
int max = 0;
int ch, m_i;
scanf("%s", s);
int N = strlen(s);
for (int i = 0; i < N; i++) {
if (s[i] < 97) {
ch = s[i] - 'A';
}
else {
ch = s[i] - 'a';
}
ABC[ch] += 1;
}
for (int i = 0; i < 26; i++) {
if (max == ABC[i]) {
ch++;
continue;
}
if (max < ABC[i]) {
max = ABC[i];
m_i = i;
ch = 0;
}
}
if (ch > 0) {
printf("?");
}
else {
printf("%c", m_i + 'A');
}
return 0;
}
처음 알파벳 인덱스 번호를 저장해줄 배열을 생성하고 모두 -1로 초기화 해줍니다.
문자열을 입력받고 반복문을 통해 각 알파벳의 위치를 배열에 저장시켜줍니다.
처음 등장한 위치를 출력해주어야 하므로 저장할 때 -1인지 검사해주었습니다.
알파벳 소문자만 입력되기 때문에 logical bug가 일어나지 않습니다.
#include <stdio.h>
int main() {
int ABC[26];
for (int i = 0; i < 26; i++) {
ABC[i] = -1;
}
char S[101];
scanf("%s", S);
int check;
int cnt = strlen(S);
for (int i = 0; i < cnt; i++) {
check = S[i] - 'a';
if (ABC[check] == -1) {
ABC[check] = i;
}
}
for (int j = 0; j < 26; j++) {
printf("%d ", ABC[j]);
}
return 0;
}
먼저, '\n' 전까지 문자열을 입력받았습니다.
원래, 단어의 개수는 (공백 수) +1이므로 단어의 개수를 새주었습니다.
문제에서 문자열 맨 앞, 뒤에 공백을 출력하므로 맨 앞, 뒤의 공백을 검사해서 띄어쓰기가 있다면 단어의 개수를 1감소 시켰습니다.
#include <stdio.h>
#include <string.h>
#define BUF_LEN 1000001
int main() {
char s[BUF_LEN];
int cnt = 1;
scanf("%[^\n]s", s);
for (int i = 0; i < strlen(s); i++) {
if (s[i] == ' ') {
cnt++;
}
}
if (s[0] == ' ') {
cnt--;
}
if (s[strlen(s) - 1] == ' ') {
cnt--;
}
printf("%d", cnt);
return 0;
}
OX를 입력 받음과 동시에 O가 입되면 cnt를 증가시키고 그 값을 sum에 더해주었습니다.
만약 X를 입력받았다면 cnt를 0으로 초기화 하여 문제에서 원하는 방식으로 점수를 구해주었습니다.
#include <stdio.h>
#include <string.h>
int main(void) {
int N;
scanf("%d", &N);
char arr[80];
for (int i = 0; i < N; i++) {
scanf("%s", arr);
int cnt = 0;
int sum = 0;
for (int j = 0; j < strlen(arr); j++) {
if (arr[j] == 'O') {
cnt++;
}
else {
cnt = 0;
}
sum += cnt;
}
printf("%d\n", sum);
}
return 0;
}
입력과 동시에 최댓값을 구해주고 세준이가 정의한 새로운 평균을 구하여 출력해주었습니다.
#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
double arr[N];
double max = 0;
for (int i = 0; i < N; i++) {
scanf("%lf", &arr[i]);
if (arr[i] > max) {
max = arr[i];
}
}
double sum = 0;
for (int i = 0; i < N; i++) {
sum = sum + ((arr[i] / max) * 100);
}
printf("%lf", (sum / N));
return 0;
입력받음과 동시에 모든 수의 곱을 구하고 이 곱을 sum이라고 할때 sum(mod 10)의 값을 배열로 카운트하여 숫자의 개수를 구할 수 있습니다.
#include <stdio.h>
int main() {
int cnt[10] = { 0, };
int sum = 1;
int idx;
for(int i = 0; i < 3; i++){
int N ;
scanf("%d", &N);
sum *= N;
}
while(sum > 0){
idx = sum % 10;
cnt[idx]++;
sum /= 10;
}
for(int i = 0; i < 10; i++){
printf("%d\n", cnt[i]);
}
return 0;
}
조금 어렵게 푼것 같지만 앞에서 입력받은 수를 기억해두었다가 두 수를 빼서 특정 값이 나오면 카운트하여 1~8까지 차례대로 연주하면 ascending, 8~1까지 차례대로 연주하면 descending을 출력해주었습니다.
#include <stdio.h>
int main() {
int n, b, u_c = 0, d_c= 0;
scanf("%d", &b);
for(int i = 0; i < 7; i++){
scanf("%d", &n);
if(b-n == -1){
u_c++;
}else if(b-n == 1){
d_c++;
}
b = n;
}
if(u_c == 7){
printf("ascending");
}else if(d_c == 7){
printf("descending");
}else{
printf("mixed");
}
return 0;
}
입력과 동시에 42로 나눈 값의 인덱스로 수를 카운트한수 반복문 통해 다른 나머지의 개수를 카운트한 후 출력해주면 된다.
#include <stdio.h>
int main() {
int arr[10] = { 0, };
for (int i = 0; i < 10; i++) {
int N;
scanf("%d", &N);
arr[i] = N % 42;
}
int cnt = 10;
for (int i = 0; i < 9; i++) {
int num = -1;
for (int j = (i + 1); j < 10; j++) {
if (num == arr[j]) {
cnt++;
}
if (arr[i] == arr[j]) {
num = arr[i];
cnt--;
}
}
}
printf("%d", cnt);
return 0;
}