알고리즘 3개 풀이
2018, Apr 23
코딩 연습 할 겸 백준(https://www.acmicpc.net/)에서 문제를 찾아 풀기 시작했다. 목표는 일주일에 3개!! Slack과 블로그에 코딩한 것과 코멘트를 올릴 생각이다.
문제 1
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N 번째 줄에는 N개의 별을 찍는 문제
#include <stdio.h>
/// 매개변수 만큼의 라인의 별을 찍는다
void printStar(int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<i+1; j++)
{
/// n번째 라인에 n개의 별을 찍는다
printf("*");
}
printf("\n");
}
}
int main()
{
int n = 0;
/// 키보드 입력을 받는다.
scanf("%d", &n);
printStar(n);
}
문제 2
#include <stdio.h>
/// 거리가 1 만큼 멀어질 때마다 거리*6 의 벌집이 생긴다
/// n번째 거리의 벌집수 = 1 + 1*6 + 2*6 + 3*6 + ... + (n-1)*6
void printNumberOfRoom(int n)
{
/// 거리에서 가장 높은 인덱스를 저장(인덱스 == 방 number)
int maxNum = 1;
/// 거리 = resCnt
int resCnt = 1;
/// 가장 높은 인덱스가
/// 찾고자 하는 인덱스 보다 크면 반복문 종료
while (maxNum < n)
{
maxNum += 6*resCnt;
resCnt++;
}
printf("%d",resCnt);
}
int main()
{
int n = 0;
scanf("%d", &n);
printNumberOfRoom(n);
return 0;
}
문제 3
1/1 | 1/2 | 1/3 | 1/4 | 1/5 | ... |
2/1 | 2/2 | 2/3 | 2/4 | 2/5 | ... |
3/1 | 3/2 | 3/3 | 3/4 | 3/5 | ... |
... | ... | ... | ... | ... | ... |
이와 같이 나열된 분수들을 1/1 -> 1/2 -> 2/1 -> 3/1 -> 2/2 -> … 과 같은 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
#include <stdio.h>
/// 행렬을 대각선 부터 지그재그로 돌면서
/// 분수를 프린트하는 함수
/// n 번째 라인에는 n개의 요소가 있음.
void printBunsu(int n)
{
/// 순회한 모든 요소의 갯수.
int indexCnt = 0;
/// 몇 번째 라인인지 저장.
int incrementNum = 0;
/// 순회한 요소가 찾으려는 인덱스보다 많으면
/// 반복문 종료.
while (indexCnt < n)
{
incrementNum++;
indexCnt += incrementNum;
}
/// indexCnt는 라인의 끝을 가리키고 있음.
/// 찾으려는 요소와 얼마나 떨어져 있는지 저장.
int moveCnt = indexCnt - n;
/// 요소가 있는 라인이 홀수인지 짝수인지에 따라
/// 분모와 분자를 반대로 설정.
int mo = incrementNum;
int ja = 1;
if (incrementNum % 2 == 0)
{
mo = 1;
ja = incrementNum;
}
/// 짝수번째 이면 분모에 찾으려는 인덱스와 떨어진 만큼
/// 더하고 분자는 뺀다.
/// 홀수번째 이면 반대.
if (incrementNum % 2 == 0)
{
mo += moveCnt;
ja -= moveCnt;
}
else
{
mo -= moveCnt;
ja += moveCnt;
}
printf("%d/%d", ja, mo);
}
int main()
{
int n = 0;
scanf("%d", &n);
printBunsu(n);
return 0;
}