문제

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행사가 되어 새로운 세계에 발을 내려 놓는 영광의 순간을 기다리고 있다.

그가 탑승하게 될 우주선은 Alpha Centauri라는 새로운 인류의 보금자리를 개척하기 위한 대규모 생활 유지 시스템을 탑재하고 있기 때문에, 그 크기와 질량이 엄청난 이유로 최신기술력을 총 동원하여 개발한 공간이동 장치를 탑재하였다. 하지만 이 공간이동 장치는 이동 거리를 급격하게 늘릴 경우 기계에 심각한 결함이 발생하는 단점이 있어서, 이전 작동시기에 k광년을 이동하였을 때는 k-1 , k 혹은 k+1 광년만을 다시 이동할 수 있다. 예를 들어, 이 장치를 처음 작동시킬 경우 -1 , 0 , 1 광년을 이론상 이동할 수 있으나 사실상 음수 혹은 0 거리만큼의 이동은 의미가 없으므로 1 광년을 이동할 수 있으며, 그 다음에는 0 , 1 , 2 광년을 이동할 수 있는 것이다. ( 여기서 다시 2광년을 이동한다면 다음 시기엔 1, 2, 3 광년을 이동할 수 있다. )

김우현은 공간이동 장치 작동시의 에너지 소모가 크다는 점을 잘 알고 있기 때문에 x지점에서 y지점을 향해 최소한의 작동 횟수로 이동하려 한다. 하지만 y지점에 도착해서도 공간 이동장치의 안전성을 위하여 y지점에 도착하기 바로 직전의 이동거리는 반드시 1광년으로 하려 한다.

김우현을 위해 x지점부터 정확히 y지점으로 이동하는데 필요한 공간 이동 장치 작동 횟수의 최솟값을 구하는 프로그램을 작성하라.

입력

입력의 첫 줄에는 테스트케이스의 개수 T가 주어진다. 각각의 테스트 케이스에 대해 현재 위치 x 와 목표 위치 y 가 정수로 주어지며, x는 항상 y보다 작은 값을 갖는다. (0 ≤ x < y < 231)

출력

각 테스트 케이스에 대해 x지점으로부터 y지점까지 정확히 도달하는데 필요한 최소한의 공간이동 장치 작동 회수를 출력한다.

 

문제 이해하는 것부터가 상당히 힘들었던 문제..

이동거리                작동횟수
1 = 1                     1
2 = 11                    2
3 = 111                  3
4 = 121                   3
5 = 1211                 4
6 = 1221                 4
7 = 12211               5
8 = 12221                5
9 = 12321                5
10 = 123211            6
11 = 123221            6
12 = 123321            6
13 = 1233211          7
14 = 1233221           7
15 = 1233321           7
16 = 1234321            7
17 = 12343211           8

 

규칙을 찾아야함.

이동거리의 제곱근과 제곱근의 반올림을 이용하여 알고리즘을 작성함.

 

 ex) 4의 제곱근은 2이며 제곱근의 반올림 또한 2이다 

제곱근과 반올림이 같으면 작동횟수는 2*제곱근 - 1 이 된다. 이동거리 4의 작동 횟수는 3

ex)3의 제곱근은 1.732.. 제곱근의 반올림은 2

제곱근의 반올림이 더 큰 경우 작동횟수는 2*제곱근의반올림 - 1 이 된다. 이동거리 3의 작동 횟수는 3

ex)5의 제곱근은 2.236.. 제곱근의 반올림은 2

제곱근이 더 큰 경우 작동 횟수는 2*제곱근의 반올림 이다. 이동거리 5의 작동 횟수는 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
class Program
{
    static void Main(string[] args)
    {
        int iNum = int.Parse(Console.ReadLine());
        int[] arrayMove = new int[iNum];
        for(int i = 0; i<iNum; i++)
        {
            string[] s = Console.ReadLine().Split();
            arrayMove[i] = int.Parse(s[1]) - int.Parse(s[0]);
        }
        
        for(int i = 0; i< iNum; i++)
        {
            double A = Math.Sqrt(arrayMove[i]);
            double B = Math.Round(A);
            if(A <= B) arrayMove[i] = 2* (int)B -1;
            else arrayMove[i] = 2 * (int)B;
            Console.WriteLine(arrayMove[i]);
        }
    }
}
cs

 

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

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행��

www.acmicpc.net

 

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다. (1 <= k <= 14, 1 <= n <= 14)

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

 

k와 n의 범위가 크지 않고 테스트 케이스의 수가 제한이 없으므로 거주자의 수를 모두 구한다음

해당하는 배열을 출력하는 방식으로 문제를 품.

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
using System;
 
class Program
{
    static void Main(string[] args)
    {
        int iNum = int.Parse(Console.ReadLine());
        int[,] arrayCase = new int[iNum, 2];
        for(int i = 0; i < iNum; i++)
        {
          for(int j = 0; j < 2; j++)
          {
             arrayCase[i, j] = int.Parse(Console.ReadLine());
          }
        }
        //배열 초기화 
        int[,] arrApt = new int[1515];
        for(int i = 0; i < 15; i++)
        {
          for(int j = 0; j < 15; j++)
          {
            if (i == 0) arrApt[i, j] = j + 1//0층은 j+1로 초기화 
            else arrApt[i, j] = 1//그외에는 일단 1로 초기화 한다.
          }
        }
        //아파트 거주민 수를 세팅
        for (int i = 1; i < 15; i++)
        {
           for(int j = 1; j< 15; j++)
           {
              arrApt[i, j] = arrApt[i - 1, j] + arrApt[i, j - 1];
           }
        }
            
        //답 출력
        for(int i = 0; i < iNum; i++)
        {
           Console.WriteLine(arrApt[arrayCase[i, 0], arrayCase[i, 1]-1]);
        }
        
    }
}
cs

 

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

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다. (1 <= k <= 14, 1 <= n <= 14)

www.acmicpc.net

 

문제

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

그림 1. H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). 

출력

프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.

 

방의 층수는 N % H 로 구할 수 있다. 단, N % H == 0 인경우 층수는 H이다.

방의 호수는 N / H + 1 로 구할 수 있다. 단, N % H == 0 인경우 -1을 해줘야 함.

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int iNum = int.Parse(Console.ReadLine());
        int[] iResult = new int[iNum];
        for(int i = 0; i < iNum; i++)
        {
            string s = Console.ReadLine();
            int[] iArray = s.Split().Select(n => int.Parse(n)).ToArray();
            int iFloor = iArray[2] % iArray[0];
            int iRoomNum = iArray[2/ iArray[0+ 1;
            if(iFloor == 0)
            {
                iFloor = iArray[0];
                iRoomNum--;
            }
            iResult[i] = iFloor * 100 + iRoomNum;
        }
        
        for(int i = 0; i < iNum; i++)
        {
            Console.WriteLine(iResult[i]);
        }
    }
}
cs

 

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

 

10250번: ACM 호텔

문제 ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은

www.acmicpc.net

 

 

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

 

등차수열을 이용하여 풀이하였다.

an = a1 + (n-1)d 이 식에서 n을 구해야한다. n을 빼고 다 이항시키면

(an - a1) / d + 1 = n 이 되며 해당 문제에 맞게 수정한다면

(V - A) / (A - B) + 1 = n 이 될 것 이다. 이렇게 구한 수식으로 코드를 짜면 된다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Linq;
class Program
{
     static void Main(string[] args)
     {
         string s = Console.ReadLine();
         int[] iValue = s.Split().Select(a => int.Parse(a)).ToArray();
//소수가 나왔을때 올림 처리를 해줘야한다.
         int n = (int)(Math.Ceiling((double)(iValue[2- iValue[0]) / (double)(iValue[0- iValue[1])) + 1);
 
         Console.WriteLine(n);
     }
}
cs

 

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

 

2869번: 달팽이는 올라가고 싶다

문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 ��

www.acmicpc.net

 

문제

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1

이와 같이 나열된 분수들을 1/1 -> 1/2 -> 2/1 -> 3/1 -> 2/2 -> … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.

X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

출력

첫째 줄에 분수를 출력한다.

 

분모 분자중 하나가 1이 되면 진행 방향이 바뀌는걸 이용하여 알고리즘을 만들었다.

 

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
using System;
 
class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine());
        bool bXup = false;
        int x = 1;
        int y = 1;
        
        for(int i = 0; i < n-1; i++)
        {
            if(bXup)
            {
                x++;
                if(y!=1) y--;
                else bXup = false;
            }
            else
            {
                y++;
                if(x!=1) x--;
                else bXup = true;
            }
        }
        Console.WriteLine(x+"/"+y);
    }
}
cs

 

 

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

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

 

 

입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

 

 

다음 단계 방이 6개씩 늘어나는걸 이용하여 최대 값을 구하고 입력한 수가 그 값보다 작다면 현재 방의 단계가 나온다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
 
class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine());
        int iMax = 1;
        int iResult = 0;
        
        for(int i = 0; i < n; i++)
        {
            iMax += 6 * i;
            if(iMax >= n)
            {
                iResult = i + 1;
                break;
            }
        }
        Console.WriteLine(iResult);
    }
}
cs

 

 

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

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌��

www.acmicpc.net

 

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

 

 

 

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
using System;
 
class Program
{
    static void Main(string[] args)
    {
        int iSugar = int.Parse(Console.ReadLine());
        
        int iResult = -1;
        int A = 3;
        int B = 5;
        int bResult = 0;
        int aResult = 0;
        bResult = iSugar % B;
        aResult = bResult % A;
        if (aResult == 0)
        {
          iResult = iSugar / B;
          iResult += bResult / A;
        }
        else
        {
           for(int i= 1; i <= iSugar / B; i++)
           {
               bResult = bResult + B;
               aResult = bResult % A;
               if(aResult == 0)
               {
                  iResult = iSugar / B - i;
                  iResult += bResult / A;
                  break;
               }    
            }
         }
        
      Console.WriteLine(iResult);
    }
}
cs

 

 

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

 

2839번: 설탕 배달

문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬�

www.acmicpc.net

 

문제

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 21억 이하의 자연수이다.

출력

첫 번째 줄에 손익분기점 즉 최초로 이익이 발생하는 판매량을 출력한다. 손익분기점이 존재하지 않으면 -1을 출력한다.

 

손익분기점을 구하는 공식은 고정비 / 매출이익률이다.

A / (1 - B / C) = 손익분기점 이며 해당 공식을 이용하여 값을 구했다.

느리지만 더욱 정확한 계산을 위해 decimal 자료형을 사용함.

 

*Math.Ceiling 은 올림을 해주는 함수.

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        string sValue = Console.ReadLine();
        int[] iValue = sValue.Split().Select(n => Convert.ToInt32(n)).ToArray();
        
        decimal A = iValue[0];
        decimal B = iValue[1];
        decimal C = iValue[2];
        
        int iResult = -1;
        
        if(B != C && C != 0)
        {
          decimal fBEP = Math.Ceiling(A / (1 - B / C));
          if(fBEP > 0)
          {
            iResult = (int)(fBEP / C + 1);
          }
        }
        Console.WriteLine(iResult);
    }
}
cs

 

 

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

 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와

www.acmicpc.net

 

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

 

자세한 설명은 주석으로

 

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
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int inputNum = int.Parse(Console.ReadLine());
        string[] sWord = new string[inputNum];
        int[] arrCount = Enumerable.Repeat<int>(0,26).ToArray<int>();
        int iCount = 0;
        
        for(int i = 0; i < inputNum; i++)
        {
            sWord[i] = Console.ReadLine();
        }
        
        for(int i = 0; i < inputNum; i++)
        {
            for(int j = 0 ; j < sWord[i].Length; j++)
            {
                if(arrCount[sWord[i][j] - 'a'== 0//처음 나오는 알파벳은 count
                {
                    arrCount[sWord[i][j]- 'a']++;
                }
                else //처음 나오는 알파벳이 아니라면 바로 이전 알파벳과 비교한다.
                {
                    if(sWord[i][j] == sWord[i][j-1])
                    {
                        continue//맞으면 계속
                    }
                    else
                    {   //이전 알파벳과 다르다면 해당 알파벳 배열에 -1을 넣어준다.
                        arrCount[sWord[i][j] -'a'= -1;
                        break;
                    }
                }    
            }
            if(arrCount.Min() >= 0// 배열에 가장 작은 값이 0보다 같거나 크다면 해당 알파벳은 그룹문자
            {
                iCount++;
            }
            arrCount = Enumerable.Repeat<int>(0,26).ToArray<int>();
        }
        Console.WriteLine(iCount);
    }
}
cs

 

 

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

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때�

www.acmicpc.net

 

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

 

 

크로아티아 알파벳을 string 배열에 저장하고 입력받은 문자열과 배열에 저장한 문자열을 비교하여 체크했다.

 

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
using System;
class Program
{
    static void Main(string[] args)
    {
        string s = Console.ReadLine();
        string[] arrayS = { "c=","c-","dz=","d-","lj","nj","s=","z="};
        int iCount = 0;
        
        for(int i = 0; i < s.Length;)
        {
            for(int j = 0; j < arrayS.Length; j++)
            {
                int temp = i;
                bool bCheck = false;
                for(int k = 0; k < arrayS[j].Length; k++)
                {
                    if (s[temp] == arrayS[j][k])
                    {
//입력받은 문자열과 배열의 문자열과 같은 경우
                       if (k == arrayS[j].Length - 1)
                       {
                          iCount++;
                          i = i + arrayS[j].Length;
                          bCheck = true; //크로아티아 문자열을 찾은 경우 아래에서 카운트를 하지 않게 체크하는 부울 변수
                       }
                       else
                       {
                          if(temp == s.Length-1break;
                          temp++;
                       }
                    }
                    else break;
                }
                if (bCheck) break;
                
                if (j == arrayS.Length - 1)
                {
                   i++;
                   iCount++;
                }
            }
        }
        Console.WriteLine(iCount);
    }
}
cs
 
 
 

 

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

 

2941번: 크로아티아 알파벳

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s=

www.acmicpc.net

 

+ Recent posts