행렬

행렬

보통

지침

숫자로 이루어진 행렬을 나타내는 문자열이 주어지면, 그 행렬의 행과 열을 반환해요.

예를 들어, 다음과 같이 줄바꿈 문자가 들어 있는 문자열이 있다고 해요:

9 8 7
5 3 2
6 6 7

이 문자열은 다음 행렬을 나타내요:

    1  2  3
  |---------
1 | 9  8  7
2 | 5  3  2
3 | 6  6  7

이때 코드는 다음을 내놓을 수 있어야 해요:

  • 행 목록: 각 행을 왼쪽에서 오른쪽으로 읽으면서 위에서 아래로 이동해요.
  • 열 목록: 각 열을 위에서 아래로 읽으면서 왼쪽에서 오른쪽으로 이동해요.

예시 행렬의 행은 다음과 같아요:

  • 9, 8, 7
  • 5, 3, 2
  • 6, 6, 7

그리고 열은 다음과 같아요:

  • 9, 5, 6
  • 8, 3, 6
  • 7, 2, 7

새로운 AWK 개념

이 연습 문제는 풀이가 "main" 스크립트가 아닌 첫 번째 연습 문제예요. 목표는 다른 awk 프로그램에 포함시킬 함수 라이브러리를 작성하는 거예요. 이 연습 문제에는 살펴볼 만한 흥미로운 새 개념이 몇 가지 있어요.

"(gawk)" 태그가 붙은 다음 섹션들은 GNU awk 전용 확장 기능이에요.

파일에서 읽기

이 연습 문제에서는 주 입력 스트림이 아니라 파일에서 데이터를 읽어요. Gnu awk 매뉴얼에서 getline에 대한 내용을 읽어 봐요. 특히 Getline/File과 Getline/Variable/File 형식을 눈여겨보세요.

배열에 대해 더 알아보기

2차원 배열이 이 풀이를 구현하는 방법이 될 수도 있어요. GNU awk에서는 이를 표현하는 두 가지 방법이 있어요:

파일 포함하기 (gawk)

테스트 파일에 있는 @include 지시문을 눈여겨봐요.
이 지시문은 gawk가 지정한 파일을 읽고 평가하도록 해줘요.

네임스페이스 (gawk)

모든 awk 변수는 전역이에요 (함수 안에서만 지역인 함수 매개변수는 예외예요). 이름이 충돌할 가능성이 커요, 특히 서드파티 라이브러리를 포함할 때요. 네임스페이스는 변수가 저장되는 공간을 나누는 방법이에요. 연습 문제 파일에 있는 @namespace 지시문을 눈여겨봐요.

기본 네임스페이스의 이름은 "awk"예요. 기본 네임스페이스가 있으면 프로그래머가 다른 네임스페이스에 있는 함수 안에서 내장 awk 함수를 호출할 수 있어요.

함수 매개변수가 전달되는 방식

배열 매개변수는 참조로 전달돼요. 함수에서 배열을 바꾼 내용은 호출한 쪽에서도 보여요.

배열이 아닌 매개변수는 값으로 전달돼요.

타입이 지정되지 않은 매개변수는 함수가 그것으로 무엇을 하느냐에 따라 달라져요:

  • 함수가 이를 배열로 초기화하면 참조로 전달되는 매개변수가 돼요,
  • 함수가 이를 스칼라 값(숫자나 문자열)으로 초기화하면 참조가 아니에요.

자세한 내용은 매뉴얼의 값 또는 참조로 함수 인자 전달하기에 있어요.

지역 변수

함수 범위의 (지역) 변수는 "값으로 전달" 매개변수를 이용해 만들 수 있어요. 나열된 매개변수 개수보다 적은 값을 함수에 전달해도 오류가 아니에요; 남는 매개변수는 사용되기 전까지 "untyped"예요. 이러한 매개변수는 함수 안에서 스칼라 값을 할당받을 수 있고, 그 값은 전역 네임스페이스에 저장되지 않아요.

  • 매개변수에 스칼라 값을 할당하면 그것은 그 함수의 지역 값이에요.
  • 매개변수 목록에 이름이 없는 변수에 스칼라를 할당하면 그 변수는 전역이에요.

관례상 함수 시그니처에서는 예상 매개변수가 먼저 나오고, 그다음 공백이 몇 칸 온 뒤 지역 매개변수가 나와요. 예를 들어볼까요:

function add(a, b,    total) {
    # here, `typeof(total)` is "untyped"
    total = a + b
    # now, `typeof(total)` is "number"
    return total
}

BEGIN {
    sum = add(5, 10)
    print sum             # 15
    print typeof(total)   # untyped, meaning "total" is unused in this scope
}
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
AWK Exercism

행렬 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 AWK 트랙을 개념 3개연습 문제 92개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.