DY N DY

실력키우기 전화번호 속의 암호(C++) 본문

PARK/ALGORITHM

실력키우기 전화번호 속의 암호(C++)

손세지 2016. 8. 30. 11:03

1620 : 전화번호 속의 암호

제한시간: 1000 ms    메모리제한: 32 MB
해결횟수: 494 회    시도횟수: 2601 회   



자물쇠 사용자의 핸드폰 번호를 가지고 보다 기억하기 편하게 이를 암호로 만들려고 한다. 즉 자물쇠를 사면 처음에 숫자 두 개를 입력하는데 첫 번째 숫자는 각 자리에 더해질 숫자이고, 두 번째 숫자는 몇 번째 숫자 더미를 가지고 암호를 만들 것인가를 결정하는 것이다. 해당 더미 숫자에 각각 더해질 숫자를 더하면 이것이 암호가 된다. 자물쇠의 비밀번호를 만들어 내는 프로그램을 작성하라.

 

< 처리조건 > 
(1) 핸드폰 번호, 각 자리에 더해질 숫자, 숫자 더미의 위치를 입력받는다. 
(2) 입력된 핸드폰 번호에서, 각 숫자 더미사이의 구분은 하이픈(-)으로 하고, 번호는 0이상 9이하의 자연수만 들어온다. 
(3) 숫자 더미는 앞에서부터 자동적으로 1번부터 매겨지며, 그 수의 제한은 없다. 즉 반드시 abc-defg-hijk 형태의 3개의 숫자더미를 가지는 전화번호만이 있는 것은 아니다. 
(4) 원하는 숫자더미에서 각 자리의 숫자를 더한다. 이때 더한 값이 9를 넘을 경우에는 그 중 일의 자리 값만을 취한다. 
(5) 각 숫자더미는 4자리를 넘어서는 안된다. 
(6) 각 숫자 더미의 크기가 4자리가 안될 경우에는 전체를 4자리로 한 후, 앞에 그 비는 자리 수만큼 0을 붙인다.

 

전화번호를 기억할 스트링과(s, s는 100자 이내의 스트링), 각 자리에 더해질 숫자(p, p는 1부터 9까지의 수), 숫자 더미의 번호(m)를 공백문자로 구분하여 입력받는다.



위의 입력된 전화번호 중에서의 원하는 더미에, 원하는 숫자가 더해진 후의 값을 출력한다.
처리조건에 맞지 않는 경우는 "INPUT ERROR!"를 출력한다.


 [Copy]
111-2222-3412-5432 2 4
 [Copy]
7654



 [Copy]
11111-22-33 5 1
 [Copy]
INPUT ERROR!



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
/**************************************************************
    Problem: 1620
    User: a132034
    Language: C++
    Result: Success
    Time:0 ms
    Memory:1772 kb
****************************************************************/
 
 
#include    <iostream>
#include    <string>
#include    <sstream>
#include    <vector>
#include    <cstdio>
using namespace std;
 
int main()
{
    string s;
    int p, m;
    int num;
    vector<int> numbers;
    cin >> s;
    cin >> p >> m;
    stringstream ss(s);
    string number;
 
    while (getline(ss, number, '-'))
    {
        istringstream(number) >> num;
        if (num / 10000 > 0)
        {
            cout << "INPUT ERROR!" << endl;
            return 0;
        }
        numbers.push_back(num);
    }
 
    if (numbers.size() + 1 < m)
    {
        cout << "INPUT ERROR!" << endl;
        return 0;
    }
    int num1 = numbers[m - 1/ 1000;
    int num2 = numbers[m - 1] % 1000 / 100;
    int num3 = numbers[m - 1] % 100 / 10;
    int num4 = numbers[m - 1] % 10;
    cout << (num1 + p) % 10 << (num2 + p) % 10 << (num3 + p) % 10 << (num4 + p) % 10 << endl;
    return 0;
}
cs


단순 문자열 계산문제.

사실 문자열을 나누어 숫자로 변환만 할 수 있다면 어려울 것은 없다. 

1234-1234-1234... -로 이어진 문자열을 s로 받았고, stringstream으로 초기화해주었다. 

이것을 getline함수로 number라는 string에 -를 기준으로 하나씩 넣어주었고

istringstream으로 숫자로 변환하였다. 

'PARK > ALGORITHM' 카테고리의 다른 글

BOJ 2293 동전1(C++)  (0) 2016.08.30
BOJ 1717 집합의 표현(C++)  (0) 2016.08.30
알고리즘 & BOJ 2457 공주님의 정원(C++)  (0) 2016.08.26
BOJ 3649 로봇 프로젝트(C++)  (0) 2016.08.25
알고리즘 & BOJ 1725 히스토그램(C++)  (0) 2016.08.25