boj 10814번 문제를 풀며 만나게된, VLA를 사용한 코드와, 이 코드의 문제점과 개선사항.
// Authored by : hgmhc
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/9e42012f919544dfa94544e08b2ee1fe
#include <bits/stdc++.h>
using namespace std;

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n; cin >> n;
  pair<int,string> x[n];
  for (auto& s : x) cin >> s.first >> s.second;
  stable_sort(x, x+n, [&](pair<int,string> a, pair<int,string> b) {
    return a.first < b.first;
  });
  for (auto p : x) cout << p.first << ' ' << p.second << '\n';
}
/*
13 to 15번째 줄의 코드가 낯설면 람다 함수 키워드로 구글링 추천
*/

이 코드를 접하게 되었고, 이때 지속적으로 pair<int,string> x[n]; 에서, x[n]에서 '식에 상수 값이 있어야 합니다' 오류를 발생하고 그리고 애초부터 그동안 pair<int,string> x[n]; 형태로 pair<int,string> 타입의 배열 x를 런타임중에 받은 n이라는 변수로 배열사이즈를 정해서 사용하는 문법을 처음 보았기 때문에 이에 대해서 검색해보았다. 

https://int-i.github.io/cpp/2020-05-10/vla/

 

C/C++ 가변 길이 배열(Variable-length Array): C언어 표준이었던 것 - 인하대학교 인트아이

일반적으로 C와 C++에서는 배열의 크기를 컴파일 시간에 결정한다. 따라서 배열의 크기는 일반 변수로 정할 수 없으며 컴파일 타임 상수가 되어야 한다. 그런데 C99 표준에...

int-i.github.io

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hirit808&logNo=221447722807 

 

[C/C++]동적할당 없이 배열 크기를 변수로 정하고 싶다면, VLA!

VLA란? VLA는 Variable Length Arrays의 약어로, 가변길이배열을 뜻한다. 보통 배열 크기는 상수...

blog.naver.com

 

결국 위의 문법은 가변 길이 배열(variable length array) 라고 하며, c99 표준에서는 허용되었지만 c++에서는 허용되지 않는다고 한다. 이것도 컴파일러마다 허용할수도 있고 아닐수도 있고 한것 같은데, 일단 이런 경우는 사용하지 않는것이 좋을것 같다. 지피티에 검색해보아도 vector를 이용하는 방법으로 변환해서 알려주는걸 보니 애초부터 익숙해지지말고, 이런 문법이 있다는것만 파악한뒤에 vector를 이용한 풀이로 코드를 작성해야겠다. 

 

그리고 위에 첨부한 풀이는 결국 람다 문법을 활용해서 함수 자체를 compare 함수를 넣는 위치에 그대로 삽입해서 작성한것으로 보여지고, 위에 따로 빼서 compare 함수를 만들면 결국 동일한 형태의 코드가 될것으로 보여진다. 

 

  Comments,     Trackbacks