최대상금 - SWEA

최대상금 - SWEA

문제

퀴즈 대회에 참가해서 우승을 하게 되면 보너스 상금을 획득할 수 있는 기회를 부여받는다.

우승자는 주어진 숫자판들 중에 두 개를 선택에서 정해진 횟수만큼 서로의 자리를 위치를 교환할 수 있다.

예를 들어, 다음 그림과 3, 2, 8, 8, 8 의 5개의 숫자판들이 주어지고 교환 횟수는 2회라고 하자.

처음에는 첫번째 숫자판의 3과 네 번째 숫자판의 8을 교환해서 8, 2, 8, 3, 8이 되었다.

다음으로, 두 번째 숫자판 2와 마지막에 있는 8을 교환해서 8, 8, 8, 3, 2이 되었다.

정해진 횟수만큼 교환이 끝나면 숫자판의 위치에 부여된 가중치에 의해 상금이 계산된다.

숫자판의 오른쪽 끝에서부터 1원이고 왼쪽으로 한자리씩 갈수록 10의 배수만큼 커진다.

위의 예에서와 같이 최종적으로 숫자판들이 8,8,8,3,2의 순서가 되면 88832원의 보너스 상금을 획득한다.

여기서 주의할 것은 반드시 횟수만큼 교환이 이루어져야 하고 동일한 위치의 교환이 중복되어도 된다.

다음과 같은 경우 1회의 교환 횟수가 주어졌을 때 반드시 1회 교환을 수행하므로 결과값은 49가 된다.

94의 경우 2회 교환하게 되면 원래의 94가 된다.

정해진 횟수만큼 숫자판을 교환했을 때 받을 수 있는 가장 큰 금액을 계산해보자.

[입력]

가장 첫 줄은 전체 테스트 케이스의 수이다.

최대 20개의 테스트 케이스가 표준 입력을 통하여 주어진다.

각 테스트 케이스에는 숫자판의 정보와 교환 횟수가 주어진다.

숫자판의 정보는 정수형 숫자로 주어지고 최대 자릿수는 6자리이며, 최대 교환 횟수는 10번이다.

[출력]

각 테스트 케이스마다, 첫 줄에는 “#C”를 출력해야 하는데 C는 케이스 번호이다.

같은 줄에 빈 칸을 하나 사이에 두고 교환 후 받을 수 있는 가장 큰 금액을 출력한다.

풀이

  • dfs를 이용해서 모든 경우의 수를 비교하였다.
  • 64321 1 의 테스트케이스 경우와 같이 계속 감소하는 값이 input으로 들어올 경우
    잘못된 값이 출력되는 경우가 있어, 해당 경우에 nums[-2]의 값과 nums[-1]의 값을 계속 swap해주는 로직을 추가해주었다.
def dfs(d, cnt):
    global ret
    if cnt == n:
        ret = max(int("".join(nums)), ret)
        return
    for i in range(d, l):
        for j in range(i + 1 , l):
            if nums[i] <= nums[j]:
                nums[i], nums[j] = nums[j], nums[i]
                dfs(i, cnt + 1)
                nums[i], nums[j] = nums[j], nums[i]

T = int(input())

for test_case in range(1, T + 1):
    nums, n = input().split()
    nums = list(nums)
    numbers = nums[:]
    n = int(n)
    l = len(nums)
    ret = 0
    flag = 0
    if len(nums) == 2 or nums == sorted(nums, reverse=True):
        cnt = 0
        while cnt != n:
            numbers[-1], numbers[-2] = numbers[-2], numbers[-1]
            cnt += 1
        flag = int("".join(numbers))
    cnt = 0
    dfs(0, cnt)
    if ret == 0:
        ret = flag
    print("#" + str(test_case) + " " + str(ret))

'코딩테스트 > SWEA' 카테고리의 다른 글

[SWEA] 무선 충전 (python)  (0) 2020.09.06

 

 

https://nuatmochoi.github.io/algopress/

 

Overview | Algorithm Note

 

nuatmochoi.github.io

위 주소의 깃 블로그에 알고리즘 풀이 작성하고 있습니다!

'코딩테스트' 카테고리의 다른 글

코딩인터뷰완전분석 - 알고리즘 설계의 5가지 접근법  (0) 2020.06.12
백트래킹, N Queen  (0) 2020.02.17
DFS, BFS  (0) 2020.01.23
DP  (0) 2020.01.17
코테 에러 분석  (0) 2020.01.07

Ubuntu에 mysql 초기 세팅

  1. mysql 설치

    sudo apt-get install mysql-server
  2. 로그인

    mysql -u root -p

    비밀번호 입력후 mysql shell 접속

  3. 데이터 베이스 생성

    CREATE DATABASE [database이름] default CHARACTER SET UTF8;

    show databases; 로 데이터베이스가 생성되었음을 확인하고
    use [database이름];로 데이터베이스 변경

  1. 데이터베이스 사용자 추가

    외부 접속을 허용하기 위해서는 localhost 부분에 '%'를 써야한다.

      GRANT ALL PRIVILEGES ON [database이름].* TO '[유저이름]'@localhost IDENTIFIED BY '[비밀번호]';

    ex> GRANT ALL PRIVILEGES ON newdb.* TO 'newuser'@'%' IDENTIFIED BY 'passwd';

    grant 테이블을 reload하여 변경사항을 바로 적용

      FLUSH PRIVILEGES;

    exit로 shell 나감

  2. 외부 접속 허용

    localhost가 아닌 환경에서 외부 접속을 허용하기 위해서는 추가적인 설정을 해줘야 한다.

    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

    bind-address부분을 수정

    # bind-address            = 127.0.0.1   # Before
    bind-address            = 0.0.0.0       # After

    mysql 재시작

    sudo service mysql restart

    변경된 bind-address로 연결되어 있는지 확인

    sudo netstat -ntlp | grep mysqld

 

핵데이 지원

첫 해커톤을 '네이버 캠퍼스 핵데이'로 경험하게 되었다. 핵데이를 지원하던 시점의 나는 휴학 기간에 코로나19가 겹쳐 준비하고 있던 토익과 정처기 시험도 계속 연기되고 있어서 '뭐라도 해내야 한다'라는 압박감에 시달리던 때였다. 나는 평소에 페이스북 그룹 등을 통해 많은 정보를 얻는 편인데, 이번에도 페이스북 게시글을 보게 되었고 홀린 듯 지원서를 써서 제출했다.

 

핵데이 주제들. 지금 보니 알록달록한 태그들이 이쁘다

지원서에는 1개 혹은 2개의 주제를 선택해서 지원한 이유를 쓰게 되어있었고 12번 PWA 개발을 1순위로, 10번 공유경제 플랫폼을 2순위 주제로 선택했다. 아무래도 자신 있는 기술 스택(웹 프론트, Django 서버)과 겹치는 주제를 선택하게 되더라. 최종적으로는 12번 PWA 개발 주제로 선정되었다!

 

핵데이로 가기 위한 관문인 코딩 테스트는 프로그래머스로 진행되었다. 총 3개의 문제가 나왔었는데, 2솔을 하고 붙었다. 풀었던 2 문제는 비교적 쉬운 난이도였고, 마지막 문제였던 세 번째 문제는 굉장히 어려웠던 걸로 기억을 하고, 팀원들에게도 물어봤었는데 아무도 못 풀었다고 했다.

3주 간의 개발

다른 분들의 블로그 후기를 살펴보면, 원래 핵데이는 춘천에 위치한 네이버 커넥트 원이라는 곳에서 1박 2일로 진행하는 해커톤이다. 하지만 아쉽게도 이번에는 코로나19로 인해 3주간의 온라인 멘토링 + 끝나는 날에 1번의 Wrap-up 미팅의 형식으로 진행되었다. 

 

한 가지 더 아쉬웠던 점은 주제 특성상 우리 팀은 팀원 간의 협업 방식이 아닌 개인 개발로 진행되었다는 점이다. 물론 깃허브에서 팀원 및 멘토님과의 코드 리뷰도 진행되었고, 네이버 밴드를 통해 공통되는 이슈에 대한 토의도 있었지만..! 협업 프로젝트를 진행할 때마다 뭔가 나 혼자만의 역량보다 훨씬 뛰어난 결과물이 나왔었던 것 같아서 조금은 아쉬운 부분이었다.

 

PWA 개발 요구사항s

위의 요구 사항들을 개발하는 것에 있어서 적절한 주제를 선택해야 했고, 핵데이가 시작되기 1주일 전부터 고심해서 기획을 했던 것 같다. 경험으로부터 아이디어가 떠올랐는데, 나는 평소에 데이터가 250 MB로 제한된 낮은 요금제를 쓰고 있다. 목적지에 가기 위해 카카오 맵의 길찾기를 많이 사용하는데, 와이파이가 없는 공간에서 지도 어플을 사용하면 이미지 조각이 깨지는 문제가 생긴다. 

 

이러한 문제를 해결할 수 있는 것이 offline 상태를 대응할 수 있는 PWA라고 생각이 들었다. 또한 팀 내부적으로 Open API를 사용해야 하는 요구 사항이 있어서 지도와 결합할 수 있는 서울 열린데이터 광장의 공중 화장실 위치 API를 선택했다. 그렇게 주제를 오프라인 상태에서 작동하며, 가까운 공중 화장실을 지도에 표시해 주는 PWA 웹앱으로 결정하게 되었다.

 

오프라인 및 웹앱으로의 설치 기능을 쉽게 구현할 수 있도록 도와주는 라이브러리인 workbox를 이전에 사용해본 경험이 있어서, 빠르게 요구 사항들을 채워나갈 수 있었다. 선택 요구 사항 중 app-shell 구조는 구현하지 못했고, typescript 또한 단기간에 적용하기에는 러닝 커브가 존재할 것 같아 제외하고 구현하였다.

 

마지막 한 주 동안 멘토님께서 개인별로 빠르게 요구 사항을 수정하며 던져주시면서 현업의 분위기? 를 살짝이나마 경험시켜주신 것이 기억에 남는다. 마지막 날에 진행된 랩업 미팅에서도 그것은 계속되었고, 멘토님은 빠르게 주어지는 요구 사항에 대해 접근 및 해결하는 방식과 의사소통 방식을 중요하게 보셨던 것 같다.

 

그렇게, 불태웠던🔥 3주간의 개발이 끝났다. 

우수참가자 선정, 그리고 면접

오오..

랩업 미팅 때 약간은 아쉬운 모습을 보인 것 같아 별다른 기대를 안 하고 있었는데, 우수 참가자로 선정이 되었다!

 

핵데이에 뽑혀서 좋은 멘토님과 팀원들을 만나 3주 동안 다양한 내용에 대해서 많이 배운 것만으로도 정말 감사했는데, 우수 참가자로 선정되어 이렇게 소중한 면접 기회도 얻게 되어 멘토님께 정말 감사한 마음뿐입니다. 감사합니다!

 

파이어베이스 사용자분석(firebase analytics)

  • 앱의 사용량과 행동 데이터 수집

  • 이벤트 (사용자가 광고를 클릭할 때 등), 사용자 속성(연령, 성별, 휴대기기 등)에 대한 로깅을 SDK 설정을 통해 별도 코드 없이 이용 가능

    사용자 속성

    이벤트

안드로이드

Google 애널리틱스 시작하기(안드로이드)

  1. Firebase 홈페이지에서 새로운 Firebase 프로젝트를 시작하고, Google 애널리틱스를 사용함으로 설정한다.

  2. 앱에 애널리틱스 SDK 추가

    1. App/build.gradle 에 Google 애널리틱스의 dependency 추가

      implementation 'com.google.firebase:firebase-analytics:17.4.1'
    2. com.google.firebase.analytics.FirebaseAnalytics 객체를 선언

      private FirebaseAnalytics mFirebaseAnalytics;
    3. onCreate() 메소드에서 초기화

      mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
  3. 이벤트 로깅 시작

    • FirebaseAnalytics 인스턴스를 만든 후 logEvent() 메서드로 이벤트에 대한 로깅을 할 수 있다.

      Bundle bundle = new Bundle();
      bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id);
      bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
      bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image");
      mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);

iOS

Google 애널리틱스 시작하기(iOS)

  1. Firebase 홈페이지에서 새로운 Firebase 프로젝트를 시작하고, Google 애널리틱스를 사용함으로 설정한다. (안드로이드와 같은 프로젝트 사용)

  2. 앱에 애널리틱스 SDK 추가

    1. Firebase에 대한 dependency을 Podfile에 추가

      pod 'Firebase/Analytics'
    2. pod install 이후, .xcworkspace 파일을 연다

    3. UIApplicationDelegate에서 파이어베이스 모듈을 import

      import Firebase
    4. FirebaseApp 인스턴스 구성

      FirebaseApp.configure()
  3. 이벤트 로깅 시작

    • FirebaseeApp 인스턴스를 만든 후, logEvnet() 메소드를 이용해 이벤트에 대해 로깅을 사용할 수 있음

      Analytics.logEvent(AnalyticsEventSelectContent, parameters: [
        AnalyticsParameterItemID: "id-\(title!)",
        AnalyticsParameterItemName: title!,
        AnalyticsParameterContentType: "cont"
        ])

'Android' 카테고리의 다른 글

안드로이드 액티비티 생명주기  (0) 2020.07.22

쿠키, 로컬 스토리지, 세션 스토리지

쿠키

  • 만료 기한이 있는 key-value 저장소
  • 4KB 용량 제한이 있고, 매 서버 요청마다 서버로 쿠키가 같이 전송된다.
  • HTTP request는 stateless이기 때문에 요청 자체만으로는 요청이 어디서 오는지 알 수 없다. 쿠키가 요청자에 대한 정보를 담아 서버로 보냄으로써 클라리언트를 파악한다.

로컬 스토리지

  • 사용자가 지우지 않는 이상 브라우저에 계속 남아있다. 영구적.
  • key-value 저장소. key, value는 문자열로 변환된다.
  • HTML5 에 도입되었다.

세션 스토리지

  • 로컬 스토리지와 다르게 데이터가 영구적으로 보관되지 않는다. 브라우저를 껐다가 키면 사라지는 저장소.
  • HTML5 에 도입되었다.

'Web' 카테고리의 다른 글

HTTP 프로토콜  (0) 2020.06.10
Webpack  (0) 2020.02.22

+ Recent posts