레이블이 algorithm인 게시물을 표시합니다. 모든 게시물 표시
레이블이 algorithm인 게시물을 표시합니다. 모든 게시물 표시

2018년 10월 21일 일요일

백준1003: 피보나치 함수(동적 계획법 풀이)

문제 링크
https://www.acmicpc.net/problem/1003

/*
https://www.acmicpc.net/problem/1003
*/
 
#include <stdio.h>
#include <vector>
#include <utility>
#pragma warning  (disable: 4996)
 
using namespace std;
 
 
int main(void)
{
 
    // 점화식
    // f(n) = f(n - 1) + f(n - 2)
 
 
 
    int testCaseNum = 0;
    scanf("%d"&testCaseNum);
 
    
 
    // index: f(N)에서 n을 index로 사용한다.
    // first: 0이 출력된 횟수, second: 1이 출력된 횟수
 
    vector< pair<intint> > v;
    v.push_back(pair<intint>(10));
    v.push_back(pair<intint>(01));
 
    for (int tcLoop = 0; tcLoop < testCaseNum; tcLoop++)
    {
        size_t testCase = 0;
        scanf("%d"&testCase);
 
        // 아직 계산되지 않은 영역이라면, 계산해서 넣어준다.
        while (testCase >= v.size())
        {
            size_t nowSize = v.size();
            int first = v[nowSize - 1].first + v[nowSize - 2].first;
            int second = v[nowSize - 1].second + v[nowSize - 2].second;
 
            v.push_back(pair<intint>(first, second));
        }
 
 
        printf("%d %d\n", v[testCase].first, v[testCase].second);
    }
 
 
    return 0;
}
cs

2018년 8월 5일 일요일

백준 10039: 평균 점수 풀이

문제 링크
https://www.acmicpc.net/problem/10039

풀이할 것도 없지만....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
/*
    상현이가 가르치는 아이폰 앱 개발 수업의 수강생은 원섭, 세희, 상근, 숭, 강수이다.
    어제 이 수업의 기말고사가 있었고, 상현이는 지금 학생들의 기말고사 시험지를 채점하고 있다. 기말고사 점수가 40점 이상인 학생들은 그 점수 그대로 자신의 성적이 된다. 
    하지만, 40점 미만인 학생들은 보충학습을 듣는 조건을 수락하면 40점을 받게 된다. 보충학습은 거부할 수 없기 때문에, 40점 미만인 학생들은 항상 40점을 받게 된다.
    학생 5명의 점수가 주어졌을 때, 평균 점수를 구하는 프로그램을 작성하시오.
    입력은 총 5줄로 이루어져 있고, 원섭이의 점수, 세희의 점수, 상근이의 점수, 숭이의 점수, 강수의 점수가 순서대로 주어진다.
    입력: 점수는 모두 0점 이상, 100점 이하인 5의 배수이다. 따라서, 평균 점수는 항상 정수이다. 
    출력: 첫째 줄에 학생 5명의 평균 점수를 출력한다.
*/
 
 
int main() 
{
    int input = 0;
    int total = 0;
    for(int loopCount = 0; loopCount < 5; loopCount++)
    {
        scanf("%d"&input);
        input = input < 40 ? 40 : input;
        
        total += input;
    }
    
    printf("%d", total/5);
    
    return 0;
}
cs

백준 1157: 단어 공부 풀이

https://www.acmicpc.net/problem/1157

파이썬을 공부해보는 중인데, 알고리즘을 이번엔 파이썬 코드로 작성해보았다.

# 우선 모두 대문자로 변경한다.
inputData = (input()).upper()
 
# 배열 선언 및 초기화
outputList = [0* 26
 
# 문자열 순회
for loopCount in range(len(inputData)):
    outputList[ord(inputData[loopCount]) - 65+= 1
 
# 그리고 outputList중 제일 큰 수를 얻어온다.
maxValue = max(outputList)
# maxValue값을 가진 인덱스가 몇 개 있는지 확인한다.
maxCount = outputList.count(maxValue)
 
# index 함수는 배열 중에 특정 값을 가진 인덱스 번호를 반환해준다.
if maxCount == 1:
    print(chr(outputList.index(maxValue)+65))
else:
    print('?')
cs

백준 2675: 문자열 반복 풀이

https://www.acmicpc.net/problem/2675

#include <stdio.h>
#include <stdlib.h> // for atoi
#include <string.h> // for strlen
 
int main() 
{
    int inputTestCaseNum = 0;
    scanf("%d"&inputTestCaseNum);
    
    for(int tcLoop = 0; tcLoop < inputTestCaseNum; tcLoop++)
    {    
        char tc[22= {0,};
        
        // 스페이스를 포함해서 입력받기 위해 %[^\n]을 사용.
        // % 앞에 한 칸 띄운 것은 앞에서 입력받은 \n이 입력버퍼에 남아있기 때문에.
        // fflush(stdin)은 표준이 아니기 떄문에, getchar()를 사용해서 \n를 버려도 된다.
        getchar();
        scanf("%[^\n]", tc);
        
        // 반복횟수와 반복될 문자열을 별도로 분리하지 않고 그냥 진행.
        // [2]번째 인덱스부터 반복될 문자열이니까, 길이값 측정도 [2]를 기준으로 한다. 
        // 시작 인덱스가 2이므로 +2를 해준다.
        
        // 반복 횟수는 [0]번째에 문자로 들어가있으므로 atoi를 통해 변환.
        for(size_t strLoop = 2; strLoop < strlen(&tc[2]) + 2; strLoop++)
        {
            for(int repeatLoop = 0; repeatLoop < atoi(&tc[0]); repeatLoop++)
            {
                printf("%c", tc[strLoop]);    
            }
        }
        printf("\n");
    }
    
    return 0;
}
cs

백준 10809: 알파벳 찾기 풀이

https://blog.naver.com/cutup9999/221332914062

#include <stdio.h>
#include <string.h> 
 
 
/*
풀이:
일단 입력된 문자열에서 각 알파벳이 처음으로 나온 위치를 기억해야되니까, 알파벳 개수만큼의 배열을 만들었다.
입력된 문자열에 해당 알파벳이 없는 경우는 -1을 출력해야하므로, -1로 초기화를 한다.
a는 아스키코드 10진수로 97의 값을 가지므로 입력된 문자열 값에 -97을 해서 알파벳 배열의 인덱스로 접근하게 했다.
해당 인덱스의 값이 -1이 아니라면, 입력 문자열에서 처음으로 출력된 문자열이 아니므로 패스!
*/
 
int main() 
{
 
    char input[100= {0, };
    char output[26];
    memset(output, -126);
 
    scanf("%s", input);
 
    for(size_t loopCount = 0; loopCount < strlen(input); loopCount++)
    {
        if(-1 == output[input[loopCount] - 97])
        {
            output[input[loopCount] - 97= loopCount;
        }
    }
 
    
    for(int loopCount = 0; loopCount < 26; loopCount++)
    {
        printf("%d ", output[loopCount]);
    }
 
    
 
    return 0;
}
cs

2018년 8월 4일 토요일

백준 2920: 음계 풀이

문제 풀이
https://www.acmicpc.net/problem/2920

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <string.h> 
using namespace std;
 
/*
다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다.
1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다.
연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.
입력: 첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다.
출력: 첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.
*/
 
enum OUTPUT_CASE
{
    ASCENDING,
    DESCENDING,
    MIXED
};
 
string OutputString[] =
{
    "ascending",
    "descending",
    "mixed"
};
 
int main() 
{
    string input = "";
    getline(cin, input);
    
    OUTPUT_CASE output = OUTPUT_CASE::MIXED;
    for(int loopCount = 0; loopCount < 7*2; loopCount += 2)
    {
        if(0 == loopCount)
        {
            // '1' == 49
            if(49 == input.at(loopCount))
                output = OUTPUT_CASE::ASCENDING;
            else if(56 == input.at(loopCount))
                output = OUTPUT_CASE::DESCENDING;
            else
                break;
        }
        
        if(output == OUTPUT_CASE::ASCENDING)
        {
            if(input.at(loopCount) + 1 != input.at(loopCount+2))
            {
                output = OUTPUT_CASE::MIXED;
                break;
            }
        }
        else if(output == OUTPUT_CASE::DESCENDING)
        {
            if(input.at(loopCount) - 1 != input.at(loopCount+2))
            {
                output = OUTPUT_CASE::MIXED;
                break;
            }
        }
    }
    
    cout << OutputString[output] << endl;
    return 0;
}
cs

2018년 8월 2일 목요일

백준 8958: OX퀴즈 풀이

문제 링크
https://www.acmicpc.net/problem/8958


string, cout, cin 등을 사용하고 있는데, 채점시 메모리나 속도 문제를 따지자면string 변수 타입을 쓰지 않고, cin, cout도 쓰지 않는게 더 잘 나온다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <string> 
using namespace std;
/*
    "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
    "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
    
    입력: 첫째 줄 테스트 케이스 수
    테스트 케이스 수만큼의 테스트 케이스 문자열이 입력된다.
    
    출력: 각 테스트 케이스마다의 점수를 출력한다
    
    입력이 대문자로만 오는지 소문자로만 오는지 정확하지 않아서 대문자 변경 처리를 추가했다.
*/
int main() 
{
    int inputTestCaseNum = 0;
    cin >> inputTestCaseNum;
    
    // input Test case
    string *pTcArray = new string[inputTestCaseNum];
    for(int loopCount = 0; loopCount < inputTestCaseNum; loopCount++)
    {
        cin >> pTcArray[loopCount];
        
        // 다 대문자로 변경.
        for(auto & c : pTcArray[loopCount])
            c = toupper(c);
    }
    
    // calculate score for each test case.
    for(int loopCount =0; loopCount < inputTestCaseNum; loopCount++)
    {
        int score     = 0;
        int sequence  = 0;
        for(int strLoop = 0; strLoop < pTcArray[loopCount].length(); strLoop++)
        {
            if('O' == pTcArray[loopCount].at(strLoop))
            {
                sequence++;
                score += sequence;
            }
            else
            {
                sequence = 0;
            }
        }
        cout << score << endl;
    }
    
    delete[] pTcArray;
    return 0;
}
cs
메모리 동적할당하는게 싫어서 벡터로 만든 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string> 
#include <vector>
using namespace std;
 
/*
    "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
    "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
    
    입력: 첫째 줄 테스트 케이스 수
    테스트 케이스 수만큼의 테스트 케이스 문자열이 입력된다.
    
    출력: 각 테스트 케이스마다의 점수를 출력한다
*/
 
int main() 
{
    int inputTestCaseNum = 0;
    cin >> inputTestCaseNum;
    
    // input Test case
    vector<string> vString(inputTestCaseNum);
    
    // calculate score for each test case.
    for(int loopCount =0; loopCount < inputTestCaseNum; loopCount++)
    {
        cin >> vString[loopCount];
        
        int score     = 0;
        int sequence  = 0;
        for(int strLoop = 0; strLoop < vString[loopCount].length(); strLoop++)
        {
            if('O' == vString[loopCount].at(strLoop))
            {
                sequence++;
                score += sequence;
            }
            else
            {
                sequence = 0;
            }
        }
        cout << score << endl;
    }
    
    return 0;
}
cs

백준 2577: 숫자의 개수 풀이

문제 링크
https://www.acmicpc.net/problem/2577

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <stdio.h>  // for sprintf
#include <string.h> // for strlen
using namespace std;
 
/*
    100 <= input < 1000 인 3개 값을 입력받아서 각각의 값을 곱한 수를 구한다.
    그리고 그 수에서 0 - 9까지의 숫자가 각각 몇 번 나왔는지를 확인하면 된다.
    
    최대값인 999 가 세 번 나와서 곱하는 경우에도 값은 997,002,999 이므로
    4 byte int의 값의 범위인 -2,147,483,648 ~ 2,147,483,647 (21억) 범위를 넘어서지 않는다.
    그러니까 그냥 int 사용.
    
    각 자리수가 0 - 9 중 어느 숫자인지를 확인해야되는데,
    생각한 방법은 곱한수를 문자열로 바꿔서 확인하거나
    아니면 나머지 연산 방식으로 각각의 자리수를 구하는 방식이었다.
*/
 
int main() 
{    
    // 입력 받을 변수
    int input[3= {0, };
    
    cin >> input[0];
    cin >> input[1];
    cin >> input[2];
    
    int multi = 1;
    for(size_t loopCount = 0; loopCount < sizeof(input)/sizeof(int); loopCount++)
    {
        multi *= input[loopCount];
    }
    
    // 곱한 값을 문자열로 저장한다. 문자열로 변환하는 것은 곱한 결과값이 몇 자리수인지를 확인하기 위함.
    char buffer[10= {0, };
    sprintf(buffer, "%d", multi);
    
    // 각 숫자가 몇 번 나왔는지 저장할 변수. 최대 자리수는 9자리이므로 하나의 숫자가 많이 나와도 최대 9다.
    // 그러니까 char로 메모리 사용량을 줄여본다.
    // ex) [0] = 0이 몇 번 나왔는지를 기록한다.
    int output[10= {0, };
    
    for(size_t loopCount = 0; loopCount < strlen(buffer); loopCount++)
    {
        output[multi%10+= 1;
        multi /= 10;
    }
    
    // print
    for(size_t loopCount = 0; loopCount < sizeof(output)/sizeof(int); loopCount++)
    {
        cout << output[loopCount] << endl;
    }
    
    return 0;
}
cs

A*, JPS 길찾기 알고리즘 시뮬레이션 사이트

https://qiao.github.io/PathFinding.js/visual/ 길 찾기 알고리즘 시행 과정을 보여주는 사이트다. 링크 메모..