728x90

요약: 어떤 string 하나가 주어졌을 때, 이 스트링의 모든 substring들이 distinct하도록(중복이 없도록) 만들기 위해, 원본 스트링에서 삭제해야하는 문자의 최소 갯수를 구하는 문제입니다. 원본 스트링에서 중복되는 알파벳이 하나라도 있는 경우 substring들이 중복되는 것은 자명합니다. 따라서 알파벳 26개의 frequency를 저장해서, 특정 알파벳의 frequency가 1개 초과인 경우에는 1개를 제외한 나머지를 삭제하는 방식으로 풀었습니다.

 

#include <bits/stdc++.h> // 모든 표준 라이브러리 헤더들을 가져오는 전처리문
using namespace std; // std라는 namespace에서 사용하려고 한다. 그냥 암기하면 됨

/*
   어떤 string 하나가 주어졌을 때, 이 스트링의 모든 substring들이 distinct하도록(중복이 없도록) 만들기 위해, 
   원본 스트링에서 삭제해야하는 문자의 최소 갯수를 구하라

   0. 아이디어
      원본 스트링에서 중복되는 알파벳이 하나라도 있는 경우, substring들이 중복됨은 자명하다. 
      ex) 원본 스트링이 "aba"인 경우, substrings = { "a", "b", "a", "ab", "ba", "aba" }인데 여기서 substring "a"와 "a"가 중복된다.
      따라서, 입력으로 주어지는 string에서, 모든 알파벳 a~z가 1개 이하여야 한다.
   
   1. 알파벳 26개가 각각 몇 번씩 나왔는 지(frequency)를 카운팅하는 벡터 alphabet_cnt을 선언한다. 벡터의 크기는 26이고 초기값은 0
   2. 입력으로 주어지는 string을 문자 하나씩 sweeping하면서(순서대로 읽으면서),
      해당 문자가 'a'이면 alphabet_cnt[0]을 증가시켜주고,
      해당 문자가 'b'이면 alphabet_cnt[1]을 증가시켜주고,
      ...
      해당 문자가 'z'이면 alphabet_cnt[25]를 증가시켜준다.
   3. alphabet_cnt[0]부터 alphabet_cnt[25]까지 읽으면서 (즉, 'a'의 갯수, 'b'의 갯수, ..., 'z'의 갯수를 보면서)
      만약 특정 알파벳이 1개 초과(2개 이상)이면, 삭제해야하는 문자이므로
      결과값 result에다가 alphabet_cnt[i] - 1을 추가한다. (왜 -1이냐면 1개는 남겨놔도 되므로)      
*/

int getMinDeletions(string s) {
   int n = s.size(); // 스트링 s의 크기를 저장. ex) 스트링이 "abab"이면 n은 4
   vector<int> alphabet_cnt(26, 0); // 알파벳 26개의 frequency를 저장하는 벡터 alphabet_cnt를 선언하고, 초기값을 모두 0으로 지정
   for (int i=0; i<n; i++) { //i는 0부터 시작해서, n 미만일동안 i를 하나씩 증가시킨다. (즉, 입력으로 주어지는 string을 문자 하나씩 sweeping하는 것)
      /*
         ex) s가 "abac"이면
         s[0] = 'a'
         s[1] = 'b'
         s[2] = 'a'
         s[3] = 'c'이다.

         s[i]-'a'는 무엇을 의미하는가?
            'a'는 아스키코드 값으로 변환하면 97이고, 'z'는 아스키코드로 123이다.
            따라서 s[i]에서 'a'를 빼면, 알파벳 'a'~'z'를 0~25 사이의 숫자로 바꿀 수 있다.
            참고로 s[i]-'a' 대신 s[i]-97로 대체 가능하다.

         i=0인 경우, s[0]-'a'는 0  ->  alphabet_cnt[0]을 +1시킨다.  (alphabet_cnt[0]은 1이 됨)
         i=1인 경우, s[0]-'a'는 1  ->  alphabet_cnt[1]을 +1시킨다.  (alphabet_cnt[1]은 1이 됨)
         i=2인 경우, s[0]-'a'는 0  ->  alphabet_cnt[0]을 +1시킨다.  (alphabet_cnt[0]은 2가 됨)
         i=3인 경우, s[0]-'a'는 2  ->  alphabet_cnt[2]을 +1시킨다.  (alphabet_cnt[2]은 1이 됨)
      */
      ++alphabet_cnt[s[i]-'a'];
   }
   int result = 0; //결과값을 저장할 변수 (원본 스트링에서 삭제해야하는 문자의 갯수)
   for (int i=0; i<26; i++) { //alphabet_cnt[0]부터 alphabet_cnt[25]까지 읽으면서 (즉, 'a'의 갯수, 'b'의 갯수, ..., 'z'의 갯수를 보면서)
      if (alphabet_cnt[i] > 1) { // 현재 알파벳의 frequency가 1보다 크면, 삭제해야하는 문자이므로
         result += (alphabet_cnt[i] - 1); // 결과값 result에다가 alphabet_cnt[i] - 1을 추가한다
      }
   }
   return result; //결과값을 리턴
}

int main()
{
   string s; //스트링 s 선언
   cin >> s; //스트링 입력
   
   int answer = getMinDeletions(s); // getMinDelettion 함수 호출해서 결과값을 answer 변수에 저장
   cout << answer; // 출력해서 확인

   return 0; //정상 종료됨을 의미하는 return 0
}

 

주석 제거용

#include <bits/stdc++.h> 
using namespace std; 

int getMinDeletions(string s) {
   int n = s.size();
   vector<int> alphabet_cnt(26, 0); 
   for (int i=0; i<n; i++) { 
      ++alphabet_cnt[s[i]-'a'];
   }
   int result = 0; 
   for (int i=0; i<26; i++) {
      if (alphabet_cnt[i] > 1) {
         result += (alphabet_cnt[i] - 1); 
      }
   }
   return result; 
}

int main()
{
   string s;
   cin >> s; 
   
   int answer = getMinDeletions(s);
   cout << answer;

   return 0; 
}

'알고리즘' 카테고리의 다른 글

[2021 ICT 하반기] 5번 문제  (0) 2021.07.16
[2021 ICT 하반기] 4번 문제  (0) 2021.07.16
[2021 ICT 하반기] 3번 문제  (0) 2021.07.15
[2021 ICT 하반기] 1번 문제  (0) 2021.07.15
728x90

 

요약:  문제에서 주어진 tickets배열을 먼저 sort한 후 배열을 순서대로 읽으면서 바로 이전 원소와 비교해서 차가 0 또는 1 이면 같은 그룹으로 판단 하면서, 현재 그룹의 길이를 카운팅 해줍니다. 그리고 같은 그룹이 아닌 경우 그룹의 길이를 1로 초기화 시키고 모든 그룹의 길이중 가장 큰 값을 저장하여 리턴합니다. 

 

#include <bits/stdc++.h> // 모든 표준 라이브러리 헤더들을 가져오는 전처리문
using namespace std; // std라는 namespace에서 사용하려고 한다. 그냥 암기하면 됨

/*
   각 element의 타입이 int인 벡터(=배열) tickets를 매개변수로 받아서, 결과값(int타입)을 리턴하는 함수

   1. 벡터를 sort한다.
   2. 벡터의 각 원소를 차례대로 sweeping하면서(순서대로 읽으면서),
      바로 이전 원소와 비교해서 diff가 0 또는 1이면 같은 시퀀스(그룹)로 판단한다.
*/

int maxTickets(vector<int> tickets) {
   int n = tickets.size(); // int형 변수 n에다가 벡터 tickets의 길이를 대입
   sort(tickets.begin(), tickets.end()); // 벡터 tickets의 시작부터 끝을 정렬. (3번째 파라메터에 아무 것도 넣지 않으면 기본적으로 오름차순 정렬)

   int result = 0; // 결과값을 저장하는 변수 (모든 그룹의 길이들 중 최대값)
   int current_s_len = 0; // 현재 그룹 s의 길이.
   for (int i=0; i<n; i++) { //i를 0부터 시작해서, n 미만일 동안 i를 증가시킨다.
      if (i == 0 || tickets[i] - tickets[i-1] <= 1) { //i가 0이거나(처음 들어온 원소이거나), 현재 원소와 이전 원소의 차가 1 이하면
         ++current_s_len; //current_s_len을 증가시킨다. (즉, 그룹의 cnt를 늘린다.)
      }
      else { //아니라면. 즉 i번째 티켓과 i-1번째 티켓이 다른 그룹임을 의미
         if (result < current_s_len) { // result보다 i-1번째 티켓이 속하는 그룹의 길이가 크면
            result = current_s_len; // 갱신한다. (result는 모든 그룹의 길이들 중 최대값, 처음에는 0으로 세팅) 다시 말해, result는 여태까지 지나온 값을 말함
         }
         current_s_len = 1; // i번째 티켓부터 새로운 그룹이니까 current_s_len을 1로 바꾼다.
      }
   }
   if (result < current_s_len) { // 마지막 그룹의 크기가 가장 큰 경우, 갱신이 필요하다.
      result = current_s_len; //
   }
   return result; // result를 리턴
}

int main()
{
   int n; // 길이 n 선언
   cin >> n; // 길이 입력

   vector<int> tickets(n); // 크기가 n인 벡터 tickets 선언
   for (int i=0; i<n; i++) { // n개의 티켓 크기 입력
      cin >> tickets[i]; 
   }

   int answer = maxTickets(tickets); // maxTickets 함수를 호출해서 answer 변수에 저장
   cout << "\n" << "정답: "<< answer; // 출력해서 확인

   return 0; //정상 종료됨을 의미하는 return 0
}

 

 

주석 제거용

#include <bits/stdc++.h> 
using namespace std; 

int maxTickets(vector<int> tickets) {
   int n = tickets.size(); 
   sort(tickets.begin(), tickets.end());

   int result = 0; 
   int current_s_len = 0; 
   for (int i=0; i<n; i++) { 
      if (i == 0 || tickets[i] - tickets[i-1] <= 1) { 
         ++current_s_len;
      }
      else { 
         if (result < current_s_len) { 
            result = current_s_len; 
         }
         current_s_len = 1; 
      }
   }
   if (result < current_s_len) {
      result = current_s_len; 
   }
   return result; 
}

int main()
{
   int n; 
   cin >> n; 

   vector<int> tickets(n); 
   for (int i=0; i<n; i++) { 
      cin >> tickets[i]; 
   }

   int answer = maxTickets(tickets); 
   cout << "\n" << "정답: "<< answer; 

   return 0; 
}

 

'알고리즘' 카테고리의 다른 글

[2021 ICT 하반기] 5번 문제  (0) 2021.07.16
[2021 ICT 하반기] 4번 문제  (0) 2021.07.16
[2021 ICT 하반기] 3번 문제  (0) 2021.07.15
[2021 ICT 하반기] 2번 문제  (0) 2021.07.15
728x90
module.exports = {
    name: 'wordrelay-setting', // 그냥 이름
    mode: 'development', // 실 서비스에서는: production
    devtool: 'eval',  // 빠르게 하겠다는 의미
    resolve: {
        extensions: ['.js', '.jsx']
    },
    
    entry: {
        app: ['./client'],
    }, // 입력
    
    module: {
       rules: [{
          test: /\.jsx$/,  // 정규표현식이다. 의미는 js랑 jsx파일에 rule을 적용하겠다.
           loader: 'babel-loader', // js,jsx에 바벨을 적용해서 최신이나 실험적인 문법을 옛날브라우저에서도 
                                   // 호환되는 문법으로 바꿔주겠다는 의미
           options: {
             presets: ['@babel/preset-env', '@babel/preset-react'], // 아까 설치한 preset 모듈들을 주면 된다.
             plugins: ['@babel/plugin-proposal-class-properties'],
           },
       }],
    }, // @babel/preset-env등을 설치 후 이것을 추가해주는데, 이것의 역할은 "entry 라는 
       // 파일을 읽고 거기에 모듈을 적용한 후 output에 뺀다"는 의미이다.
    
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'app.js'
    }, // 출력

    // client.jsx, WordRelay.jsx를 app.js에 합쳐줘야 하는데, 
    // client.jsx에서 이미 WordRelay.jsx를 불러오고 있어서 client.jsx만 불러오면 app.js에 합쳐진다.

    // 📎 resolve에 확장자를 추가해주면 entry에 확장자를 적어줄 
    //    필요가 없이 웹팩에서 알아서 resolve에 리스트 되어있는 확장자 범위 안에서 찾아준다.

    // 실행 방법: npx webpack 을 해주면 dist/app.js에 코드가 합쳐진다.
};

※ module에 options에 presets의 또다른 표현법

module: {
      rules: [{
          ...
              presets: [
                  ['@babel/preset-env', {
                    targets:{
                  🔈   browsers: ['last 2 chrome versions'], // 최신 브라우저만 지원할 수 있게 한다.
                    },
                  }],
                  '@babel/preset-react'],
              plugins: ['@babel/plugin-proposal-class-properties'],
          }
      }],
    },
    
 // @babel/preset-env는 자동으로 옛날브라우저들을 호환시켜주는 것인데 이것을 이렇게 조금 더 구체적으로 설정해줄 수 있다.

🔈 밑에와 같은 옵션들이 들어갈 수 있다.

  • > 5%: browsers versions selected by global usage statistics. >=, < and <= work too.
  • > 5% in US: uses USA usage statistics. It accepts two-letter country code.
  • > 5% in alt-AS: uses Asia region usage statistics. List of all region codes can be found at caniuse-lite/data/regions.
  • > 5% in my stats: uses custom usage data.
  • > 5% in browserslist-config-mycompany stats: uses custom usage data from browserslist-config-mycompany/browserslist-stats.json.

https://github.com/browserslist/browserslist#queries


※ 추가적으로 뭔가 하고싶은 것들이 있다면 plugins을 붙인다. (확장프로그램 개념)

module: {
      rules: [{
          test: /\.jsx$/,
          loader: '...',
          options: {
              presets: ['...']
              plugins: ['...'],
          },
      }],
    },
  🔈plugins: [
        new webpack.LoaderOptionsPlugin({ debug: true }),
    ],
    output: {
        path: ...,
        filename: '...'
    },

 

 

 

@babel/preset-env 

브라우저에 맞게 알아서 최신문법을 옛날문법으로 바꿔준다.

 

@babel/preset-react

js를 지원하게 해준다.

 

babel-loader

바벨이랑 웹팩을 연결해준다.

'프레임워크 > React' 카테고리의 다른 글

[React] map 다른 파일로 빼기  (0) 2021.07.22
[React] Map 사용법  (0) 2021.07.22
[React] 라우트 파라메터  (0) 2021.06.30
[React] gravatar  (0) 2021.06.28
[React] 쿠키  (0) 2021.06.27

+ Recent posts