[Flutter] S3 Presigned URL 발급받기 | AWS Lambda & API GatewayPresigned URL을 발급 반는 과정은 이전 게시글에서 확인할 수 있다. 이제 Presigned URL을 사용해서 최종적으로 S3 버킷에 이미지를 업로드해 보자! image_picker로 이미지 선택하기final ImagePicker picker = ImagePicker(); // ImagePicker 초기화XFile? image; // 사용자가 선택한 이미지String contentType = ''; // 이미지 파일의 타입bool isImageUpdated = false; // 이미지 업로드 여부Future getImage(ImageSource imageSource) async { final..
플러터에서 Amazon S3 버킷에 이미지 업로드하는 기능 구현하기현재 진행 중인 개인 프로젝트에서 BaaS로 슈퍼베이스를 사용하고 있는데 Storage의 경우에는 무료로 제공하는 용량이 너무 적었다. 그래서 요금이 비교적 저렴한 Amazon S3에 이미지를 업로드하고, 이미지 URL을 얻어서 슈퍼베이스의 데이터베이스에 저장하는 방법을 선택했다. 처음에는 Amazon S3 관련 플러터 패키지를 사용할 계획이었는데 관련 패키지들은 업데이트가 몇 년 전으로 너무 오래돼서 지금도 정상적으로 작동할지 걱정이 되었다. 그래서 검색하다가 알게 된 게 AWS Amplify였다. AWS Amplify도 파이어베이스나 슈퍼베이스 같이 Auth, Database, Storage 등의 풀스택 개발을 제공하는 서비스이다. 처..
문제과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.예를 들어, 다음과 같이 81개의 수가 주어지면 이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다. 입력첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다. 출력첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다. 예제 나의 풀이table = []max_num = 0max_row = 0for i in range(9): temp = list(m..
문제N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오. 입력첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다. 출력첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다. 예제 나의 풀이N, M = map(int, input().split())num_list = [[0 for _ in range(N)] for _ in range(N)] # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]for i i..
문제인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.A+4.5A04.0B+3.5B03.0C+2.5C02.0D+1.5D01.0F0.0 P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.과연 치훈이는 무사히 졸업할 수 있을까? 입력20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다. 출력치훈이의 전공평점을..
문제그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오. 입력첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다. 출력첫째 줄에 그룹 단어의 개수를 출력한다. 예제 나의 풀이N = int(input())count = Nfor i ..
API 호출 최적화에 대한 고민기존에는 탭에 들어갈 때마다 `initState()`에서 api를 호출해서 데이터를 가져오는 구조였다.그래서 탭에 들어갈 때마다 로딩스피너가 돌아가다가 데이터가 뜨는 것을 볼 수 있다. 그런데 교정일기 앱은 사용자가 데이터를 추가하는 경우가 아니면 데이터를 업데이트할 필요가 없기 때문에불필요한 api 호출을 줄이기 위해 리팩토링을 진행했다. 일단 `AutomaticKeepAliveClientMixin`을 적용해서 탭을 이동해도 상태가 그대로 유지되도록 했다.최초 1회만 데이터를 받으면 탭을 이동해도 상태가 그대로 유지되기 때문에 무한대로 api를 호출하던 횟수를 홈 탭 2회 + 타임라인 탭 1회 + 앨범 탭 1회, 총 4회로 줄일 수 있었다.[Flutter] 탭 이동해도 상..
문제예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.크로아티아 알파벳변경čc=ćc-dždz=đd-ljljnjnjšs=žz=예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다. 입력첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은..
구글플레이에서 개인 개발자가 앱을 출시하기 위해서 꼭 거쳐야 하는 비공개 테스트 앱 심사를 통과하고 정식 앱 출시 권한을 얻었다! 비공개 테스트 앱 출시비공개 테스트 앱을 출시하는 데도 심사가 필요한데 정식 앱 출시보다는 깐깐하지 않은지 나는 한 번에 통과됐다. 2024년 10월 24일 오전 1시에 검토 신청을 보내고,2024년 10월 26일 저녁 7시에 앱 게시가 완료되었다. 20명의 테스터를 모집하기 위해서는 개발자 품앗이 카페를 이용했다. 카페에 테스터 모집글을 올리면 댓글로 이메일을 교환해서 서로 테스터로 등록하고, 앱을 설치했다는 인증샷을 업로드한다. 나는 총 37명의 테스터를 모집했는데 제대로 카운트가 안 되는 것인지 아니면 테스터들이 앱을 설치 후 삭제했기 때문인지 14일 기간의 마지막 날..
문제알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다. 입력첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다. 출력첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다. 예제 나의 풀이word = input()count = {}for i in word: str = i.upper() count.setdefault(str, 0) count[str] += 1max_key = max(count, key=count.get)max_value =..