[Golang] 컬렉션 실습

이정훈·2023년 5월 26일
0

Golang

목록 보기
24/24
post-thumbnail

역행렬

  • 다차원 배열을 활용!

  • 배열보다는 동적 할당이 가능한 슬라이스가 많이 쓰인다.

  • 하지만 const용법을 사용한 상수를 꼭 선언해야하는 상황이 있는 것처럼, 배열을 사용해야 하는 경우가 있다!

  • 다차원 행렬을 선언하고 연산하는 프로그램은 선형대수에서 많이 사용된다.

  • 많은 공식들이 있지만 중/고등학교 시절 기초로 배웠던 2x2 행렬의 역행렬을 연산하고 출력해보자

  • 2x2 행령은 [{a,d}, {c.d}] 형식으로 사용, 1행 1열부터 2행 2열 까지지 순서대로 a, b, c, d로 표현

  • 2x2 정방행렬의 역행렬은 a*d-b*c가 0이 아닐 떄 존재!

실습

  • 행렬 A는 2x2 정방 행렬로서 1행에 {7, 3}, 2행에 {5, 2} 원소로 이루어져 있습니다. 이를 배열로 초기화합니다.
  • 변수 'd'에 행렬A의 역행렬 판별식을 초기화합니다. (판별식 = ad - bc)
  • 판별식(d)이 0이 아니면(역행렬이 존재할 때) 행렬 A를 역행렬로 만드는 연산을 수행합니다. 그리고 true와 연산 결과인 역행렬을 출력합니다.
  • 판별식(d)이 0이면(역행렬이 존재하지 않을 때) 아무 연산도 하지 않고 false만 출력합니다.

코드

package main

import "fmt"

func main() {

	var arr1 = [2][2]int{
		{7, 3},
		{5, 2},
	}

	var exist bool

	d := arr1[0][0]*arr1[1][1] - arr1[0][1]*arr1[1][0]

	if d != 0 {
		exist = true
		fmt.Println(exist)

		// 		arr2 := [2][2]int {
		// 			{arr1[1][1] / d, arr1[0][1] / d},
		// 			{arr1[1][0] / d, arr1[0][0] / d},
		// 		}
		// 		fmt.Println(arr2)

		fmt.Println(arr1[1][1]/d, -arr1[0][1]/d)
		fmt.Println(-arr1[1][0]/d, arr1[0][0]/d)
	} else {
		exist = false
		fmt.Println(false)
	}
}

출력

true
-2 3
5 -7

가잔 긴 이름

  • 슬라이스를 활용해 사용자가 입력을 중단할 때까지 계속해서 사람들의 이름들을 입력받고 가장 긴 이름과 글자 수를 출력
  • 입력 받는 수가 정해지지 않았기 때문에 슬라이스를 잘 사용!

실습

  • 슬라이스 변수 names를 make 함수를 이용해 선언합니다.
  • 사용자에게 입력받는 이름 변수 name을 string형으로 선언합니다.
  • 이름은 엔터(개행)로 제한 없이 입력 받고 1을 입력하면 입력을 종료합니다.
  • 같은 길이의 이름이면 가장 먼저 입력한 이름이 출력됩니다.
  • 가장 긴 이름과 그 길이가 결괏값으로 출력됩니다.

코드

package main

import "fmt"

func main() {

  // 슬라이스 `names`를 생성하고, 길이는 0, 용량은 3으로 초기화한다.
  names := make([]string, 0, 3)

  // 사용자의 이름을 저장할 변수 `name`을 선언한다.
  var name string

  // 사용자가 "1"을 입력할 때까지 반복한다.
  for i := 0; ; i++ {

    // 사용자의 이름을 읽는다.
    fmt.Scanf("%s\n", &name)

    // 사용자가 "1"을 입력했다면, 반복문을 종료한다.
    if name == "1" {
      break
    }

    // 이름을 슬라이스에 추가한다.
    names = append(names, name)
  }

  // `result` 변수를 슬라이스의 첫 번째 이름으로 초기화한다.
  result := names[0]

  // 슬라이스를 순회하며 가장 긴 이름을 찾는다.
  for i := 0; i < len(names); i++ {

    // 현재 이름이 `result`보다 길다면, `result`를 업데이트한다.
    if len(result) < len(names[i]) {
      result = names[i]
    }
  }

  // 가장 긴 이름과 그 길이를 출력한다.
  fmt.Println(result, len(result))
}

입력

kimles
leelala
najujuju
1

출력

najujuju 8

중간고사 평균 점수

  • 과목과 점수들을 입력하면 자동으로 평균이 출력되는 프로그램 실습

  • 시험과목은 학년과 학교에 따라 다르기 떄문에 입력 받는 과목의 수는 정해져 있지 않다.

  • 과목과 점수를 모두 입력 받으면 입력 받은 과목과 점수 그리고 평균값이 출력!!

  • 이 실습은 for range문을 활용!

실습

  • 중간고사 과목과 점수를 저장하는 map 컬렉션을 선언합니다.
  • 과목은 string, 점수는 int형으로 선언합니다.
  • 평균값을 저장하는 변수 avg를 float32형으로 선언합니다.
  • 과목과 점수를 제한없이 입력 받습니다. 그리고 0이 입력되면 입력을 종료합니다.
  • 점수들의 평균을 소수점 두 번째 자리까지 출력합니다.
    (map을 for range문으로 전체 출력하면 순서대로 출력되지 않습니다. 슬라이스와 배열과 같은 컬렉션은 인덱스가 0부터 순서대로 지정돼 연결되어 저장되고 순서가 중요하지만 map 컬렉션은 인덱스도 사용자 지정이라 순서가 따로 지정되지 않습니다. 따라서 range문을 이용한다고 해서 순서대로 출력되는것은 아닙니다.
    따라서 이번 실습 문제는 코드를 실행할 때마다 map의 출력 순서가 다르기 때문에 출력 결괏값이 예시와 다르다고 틀렸다고 생각하지 마시길 바랍니다.)

한 눈에 끝내는 고랭 기초 !!

profile
싱숭생숭늉

0개의 댓글