1475번 - 방번호 #구현

esc247·2022년 7월 4일
0

Algorithm

목록 보기
3/11

1475번

간단한 문제인데 어렵게 생각해서 오래 걸렸다.

문제를 요약하면 주어진 수에서 중복되는 자리수를 구하는 것인데 이때 6이나 9인 경우는 뒤집어 쓸 수 있기에 한 번씩은 예외가 된다.

처음 생각한 풀이는,
string으로 입력을 받고,
for 문으로 i번째 인덱스에 해당하는 문자가
그 다음순서에 있는 확인해서 있으면,
6이나 9인지 확인 후에 맞다면 문자열의 사이즈나 따로 저장한 벡터의 사이즈를 확인해서 조건에 맞으면 ++,
아니면 넘어가고,
6이나 9가 아닌 경우는 무조건 ++.

        if (N.find(N[i], i + 1) != string::npos)
        {
            if (N[i] == '6' || N[i] == '9')
            {
                tmp.push_back(N[i] - '0');
                if (tmp.size() % 2 == 0)
                {
                    answer++;
                }
                else
                {
                    continue;
                }
            }
            else
            {
                answer++;
            }
        }
        else
        {
            continue;
        }

이렇게 했는데
마지막에 6이나 9가 있으면 체크하지 않고 넘어가서 문제가 생겼다.

정답은,
크기가 10인 배열을 선언해서 각 인덱스에 해당하는 수를
출현 횟수로 여기면 쉽게 풀 수 있다.

#include <iostream>
#include <vector>
#include <string>
#include <typeinfo>
#include <algorithm>
using namespace std;
int arr[10] = {
    0,
};
int main()
{
    string N;
    cin >> N;
    vector<char> vec;
    for (int i = 0; i < N.length(); i++)
    {
        int tmp = N[i] - '0';
        if (tmp == 9)
        {
            arr[6]++;
        }
        else
        {
            arr[tmp]++;
        }
    arr[6] = (arr[6] + 1) / 2;
    int *answer = max_element(arr, arr + 10);
    cout << *answer << '\n';
    return 0;
}

스트링을 하나씩 확인하며 해당 arr 인덱스 값을 1 씩 더해주는데,
이때 9일 경우는 6에 더한다.

2개마다 1세트를 더 쓰면되기에 (값이 1- 1개, 2- 1개, 3-2개, 4-2개 ...)
arr[6] 에 1을 더한 후 2로 나눈다.

그리고 배열의 최대값을 찾아 출력하면 끝.

아래는 문제를 풀며 찾은 함수, 메서드.

  • char를 int로 바꾸고 싶을떄
//문자로 받은 '1'을 int 1로 바꾸고 싶다면
int temp = '1' - '0';//이러면 temp에 int인 1이 저장된다.
  • 자료형 타입 확인
#include <typeinfo>
int a= 5;
cout<<typeid(a).name;
//출력 : "int"
  • 문자열 지우기
//erase(시작위치,길이)
string str="Erase string test";
str.erase(0,6);
cout<<str;
//출력 : string test
//
//char 지우기
string str="Erase string test";
str.erase(str.begin());
cout<<str;
//출력 : rase string test
  • 배열의 최대값
// max_element(시작 주소,끝 주소), 리턴값이 포인터!!
// 최소: min_element()
#include <algorithm>
int arr[4]={0,5,2,9};
int *answer = max_element(arr,arr+4);
cout<<*answer<<' |' << answer-arr; //값과 인덱스.
//출력 : 9 | 4
  • 문자열 찾기
//string.find(문자열) 리턴값: 시작위치.
string text = "abcd"
cout<<text.find("cd")<<'\n';
//출력 : 2 없을 경우 - string::nPos
profile
막상 하면 모르니까 일단 하자.

0개의 댓글