BOJ 24304 : 영수증

Ok Haeeun·2022년 12월 16일
0

Go로 algorithm문풀

목록 보기
8/16

반복문 문제 카테고리가 진행중 상태길래 클릭해봤더니 영수증이라는 새로운 문제 하나때문에 완료가 안되어있어서 도전~

요놈은 사실 물건의 개수 및 금액을 받아서 합계를 구한 후 처음 입력한 값과 일치하는지를 구하는 간단한 문제였는데, 풀면서 배운 것 두가지...일단 문제 푼 것부터 공개하고 난 후, 다뤄보도록 하겠다.

빠르게 클리어

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main(){
	var total, n int
	//fmt.Scanf("%d\n%d", &total, &n) 성공
	_, err := fmt.Scan(&total, &n) //성공
	stdin := bufio.NewReader(os.Stdin)

	if err!=nil{
		fmt.Println(err)
		stdin.ReadString('\n')
	} else{
		var result int
		for i:=0;i<n;i++ {
			var a, b int
			_, err := fmt.Scan(&a, &b)
			result += a * b
			if err != nil {
				fmt.Println(err)
				stdin.ReadString('\n')
				return
			}
		}
		if total == result {
			fmt.Println("Yes")
		} else {
			fmt.Println("No")
		}
	}
}

점점 Golang과 가까워지고는 있지만 아무래도 책을 보면서 공부하는게 훨씬 더 많은 기본 메서드와 언어배경을 알 수 있는 방법이 될 듯..

그리고 내가 이 문제를 풀면서 찾아봤던 것들..

1) Go에서 return

이건 솔직히 별건 없다.
입력에 에러가 났을 경우, error메세지를 print한 후 끝나야 해서 return 을 그냥 썼더니 적용이 되길래 배웠다.

이참에 찾아보는 Golang에서의 return

출처는 이곳

golang에서는 리턴값이 없을수도 있고, 여러 개일 수도 있다. Named Return Parameter라는 리턴값을 원하는 이름으로 할당할 수 있는 기능도 제공한다(가독성 up).

함수에서 리턴값을 제공하는 경우

func sum(nums ...int) int {
	s:=0
    // _에 들어가는 것은 index값
    for _, n := range nums{
    s += n
    }
    return s
}

func (파라미터) "반환하는 값의 type"
을 적는 방식으로 명시한다.

복수개를 반환할 경우, func (파라미터) (int, int)
이런 식으로 적는다.

진짜 신기한거

func (파라미터) (count int, total int){}
같이 반환값을 명시할 때, 리턴 파라미터 명도 함께 명시할 수 있다....싱기방기

주의 : 아무 값을 리턴하지 않더라도(=return 뒤에 아무 변수명이 없더라도) return 값이 있는 경우에는 return 써줘야함.

2) Go에서의 scope

Golang에서의 렉시컬 스코프는 블록스코프면서 함수 호출이 아닌 선언을 할때 스코프가 결정되는 정적 스코프다...!

가장 작은 스코프 단위가 블록이기 때문에, if문 안에서 선언하면 당연히 바깥에서 이용 못한다.
블록스코프는 변수가 해당된 가장 가까운 블록의 스코프부터 접근하여 찾기 때문에(=스코프체이닝) 같은 이름이 있어도 다른 변수가 된다.

profile
貫徹

0개의 댓글