슈뢰딩거의 20학번 2회차

업데이트:

2회차 세부사항

모임 일자

  • 2020-07-02

모임 일시

  • 14:00 ~ 17:00 (3시간)

모임 장소

  • 각자 집

다과사진0

목표 사전 발표

  • 최민우: BOJ 골드3 이상 문제 3개 풀이
  • 노채은: 파이썬 12-13 강의 듣고 백준 2개 풀기
  • 송유찬: 백준 브4 15문제 + a 풀기
  • 임지은: 데이터타입, CGI활용, 제어문, boolean, 조건문 강의 듣고 정리 및 코딩실습하기
  • 최수빈: 컴프 4주차때 했던 연산자와 수식에 대한 복습, 해당 주차의 과제를 다시 하고 전에 했던 과제와 비교하기

공부사진0

회고

이름 클릭시 해당 회고록 블로그로 이동합니다

최민우

오늘 목표는 BOJ 골드 3 이상 문제 3개 풀이였지만

생각보다 오랫동안 문제풀이를 하지 않았고 난이도도 너무 높아서, 목표를 중간에 DP 문제 풀이로 변경하였습니다.

최민우0

가장 긴 감소하는 부분 수열
포도주 시식
연속합
계단 오르기

위 4개의 다이나믹 프로그래밍 4문제를 해결하였습니다.

오랜만에 하는 DP문제풀이인지라 어려운 부분이 많았습니다, 특히 포도주 시식부터 제가 일반적으로 풀던 DP문제들과는 다른 풀이를 요구해 해결하는데 힘들었습니다.

아래는 해결하는데 어려웠던 포도주 시식의 소스코드입니다

n = int(input())
a = [int(input()) for _ in range(n)]
dp = [0 for _ in range(n)]
dp[0] = a[0]

"""
진짜 너무 어려워서 구상하는데만 시간이 엄청 걸렸다
3잔을 연속으로 마실 수는 없다 <<< 어렵게 느껴진 부분
위의 조건에 따라 3가지의 경우의 수를 따라야 한다는것은 알았다
#1 이번에 안마시기          -> 1칸 앞의 최대 와인
#2 이번에 마시기 (처음)     -> 2칸 앞의 최대 와인 + 현재 마시는 와인의 값
#3 이번에 마시기 (마지막)    -> 3칸 앞의 최대 와인 + 현재 마시는 와인의 값 + 바로 전에 마신 와인의 값
3가지의 경우의 수중 가장 높은 값이 DP 배열에 들어간다.

인덱스가 0, 1 그리고 2일 때에는 #3의 -3을 할 수 없다. <<< 새로운 문제점
인덱스를 3부터 시작한다
예외: 3잔 이하 (최대 2잔)일경우 그냥 다 마신다
"""

if n <= 2:
    print(sum(a))
else:
    # n >= 3
    dp[1] = a[0] + a[1]
    dp[2] = max(dp[1], a[0] + a[2], a[1] + a[2])
    for index in range(3, n):
        case_1 = dp[index - 1]
        case_2 = dp[index - 2] + a[index]
        case_3 = dp[index - 3] + a[index] + a[index - 1]
        dp[index] = max(case_1, case_2, case_3)
    print(max(dp))

하지만 포도주 문제에서 어려운 부분을 해결하니 다른 어려웠던 문제들이 그나마 쉽게 풀려서 기분이 좋았습니다.

앞으로 DP 문제를 비롯하여 다양한 알고리즘의 문제들을 백준을 통해, 모각코에서 풀 예정입니다.

노채은

지난 01주차부터 들었던 인프런의 <파이썬 100분 핵심강의>를 수료했다.

노채은0

계산기 프로그램을 응용하여 핵심적인 부분만 설명하는 강의라서 뒤로 갈수록 이해하기 어려운 부분도 많았기 때문에, 앞으로도 지속적으로 복습할 것이다.

시간이 많이 남았던 관계로, 오늘은 원래 계획된 2문제보다 더욱 많은 문제를 해결하였다.

노채은1

평소에는 문제 순위별로 해결하였는데, 모각코 팀장의 조언으로 백준 알고리즘 내에 ‘슈뢰딩거의 20학번’이라는 그룹을 만들어 입출력 관련 문제들을 해결하였다.

알고리즘 공부에 있어서, 더욱 효율적인 방향성을 알 수 있어서 더욱 의미 있었다.

앞으로도 꾸준히 백준 알고리즘에서 문제를 해결하며 개발자에게 필요한 알고리즘 역량을 키우고 싶다.

또한, 다음 차시부터는 새로운 강의를 들으면서 빅데이터를 시각화하거나 간단한 IoT를 구현해보고 싶다.

송유찬

원래 목표는 15문제에 더 풀 계획이였는데 딱 15문제를 풀었다.

송유찬

확실히 브론즈 5 문제보다 계산문제가 많아지면서 코드 자체는 그렇게 어렵다고 느끼진 못했지만 시간이 더 오래걸렸다.

우선 아래는 계산을 하면서 까다롭다고 느꼈던 문제들의 코드이다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner a = new Scanner(System.in);

        int tv = a.nextInt();
        int h = a.nextInt();
        int w = a.nextInt();

        long tv1 = tv*tv;
        long h1 = h*h;
        long w1 = w*w;

        double x = (double)tv1/(double)(h1+w1);

        System.out.println((int)Math.sqrt(x*h1) + " " + (int)Math.sqrt(x*w1));
    }
}

우선 간단히 말하면 대각선의 길이와 가로 세로 비율을 통해 실제 높이와 너비를 알아내는 문제이다.

비율을 알아내어 이제 루트만 씌우면 되는데 루트를 씌우는 법을 몰라서 헤매다가 Math.sqrt라는 것을 알아내었다.

다음은 split입니다. 문제는 ,로 나누어진 숫자들을 더하는 것이였는데 예를 들어

String[] arr = a.next().split(",");

1,1
2,3
3,6

을 입력하고 각 연산의 답인 각각 2,5,9를 출력하는 것이었다.

그 중 “,”로 나누어 숫자를 입력하는 것을 처음에는 String으로 “,”를 해결하려 했지만 컴파일 에러가 떠서 고민하다 웹서핑을 통해 split을 쓰면 “,”를 기준으로 나뉘는 것을 알게 되었다.

sc.hasNextInt();

마지막으로는 hasNextInt()이다.

사실 hasNextInt()는 nextInt()를 잘못 쳤을때 자주 나오곤 했는데 그 쓰임을 몰랐다.

그런데 코딩 활동을 하면서 hasNextInt()의 쓰임을 알게 되었다.

예를 들어 hasNextInt()=True라고 가정하고 숫자가 나오다가 문자가 나온다면 hasNextInt()는 False로 바뀌는 것을 알게 되었다.

그리고 이 조건을 while에 쓰면 편리하다는 것을 알게 되었다.

사실 위의 개념들을 제외하고는 거의 수를 계산하는 문제여서 생각보다 문제를 푸는 시간이 오래 걸렸다.

어떤 문제는 40분을 걸린 적도 있고 30분 걸린 문제도 있고 그랬는데 그래도 저번 시간에는 기본 다지기를 했다면 이번 시간에는 약점을 알고 모르는 개념도 알게된 시간이여서 알찼다고 생각한다.

또한 정말 모르는 코드가 있을때는 다른 사람들의 코드도 보았는데 나의 코드와 많이 달라 더 유심하게 보게되었다.

어떤 사람은 정말 간단하게 푼 사람도 있었고 전혀 생각지도 못한 방향으로 푼 사람도 있어서 나의 답이 맞다고 해도 다른 사람의 코드를 보며 해석하고 이해하느라 시간이 더 오래 걸렸다.

코딩을 하면 할수록 새로운 것들을 많이 배워 앞으로 코딩을 배울 나날들이 기대된다.

임지은

목표 : 데이터타입, CGI활용, 제어문, boolean, 조건문 강의 듣고 정리 및 코딩실습하기

임지은

이번 주차에 하려고 했던 목표치를 달성했고 저번 시간에 설치했던 프로그램 사용이 익숙해지고 있다.

1학년 1학기 때 배웠던 파이썬과 내용이 유사하여 복습하는 방향으로 수업을 학습하였다.

CGI는 처음 배우는 개념이라서 이해 하는 것에서 난관을 겪었지만 홈페이지를 내가 직접 구현할 수 있다는 것에 흥미를 느껴서 지루하지 않게 공부할 수 있었다.

이 활동이 다 끝나면 제대로 홈페이지 구현하는 방법을 학습해보고 싶다고 생각했다.

최수빈

목표 : 컴프 4주차때 했던 연산자와 수식에 대한 복습, 해당 주차의 과제를 다시 하고 전에 했던 과제와 비교하기

4주차 과제_1: 두 개의 정수를 입력 받고, 큰 수를 작은 수로 나눈 몫과 나머지 출력

import java.util.Scanner;

public class WEEK4 {
	public static void main(String[] args) {
		Scanner Num = new Scanner(System.in);
		
		System.out.print("큰 수를 입력하시오 : ");
		int x = Num.nextInt();
		
		System.out.print("작은 수를 입력하시오 : ");
		int y = Num.nextInt();
		
		int quot = x/y;
		int rem = x%y;
		
		System.out.println(x+"를 "+y+"로 나눈 몫은 "+quot+"이고 나머지는 "+rem+"입니다.");
	}
}

4주차 과제_2: 실수로 입력 받은 주행거리와 휘발유의 양으로 자동차 연비를 계산하는 프로그램 작성

import java.util.Scanner;

public class WEEK4 {
	public static void main(String[] args) {
		System.out.println("연비계산 프로그램");
		
		Scanner input = new Scanner(System.in);
		System.out.print("주행거리(km):");
		double x = input.nextDouble();
		
		System.out.print("사용한 휘발유 양(l):");
		double y = input.nextDouble();
		
		System.out.println("연비는 "+(x/y)+"km/l입니다.");
	}
}

4주차 과제_3: 빛이 태양에서 출발하여 지구에 도착하는데 몇 분 몇 초가 걸리는지 계산 후, 10분 이상 걸리는지 판별

public class WEEK4 {
	public static void main(String[] args) {
		int vel = 300000;
		int dis = 150000000;
		int min = (dis/vel)/60;
		int sec = (dis/vel)%60;
		boolean answer = min>10 ? true : false;
		
		System.out.println("빛이 태양에서 출발하여 지구까지 오는 시간 : "+min+"분 "+sec+"초");
		System.out.println("질문 : 태양에서 출발하여 지구까지 오는 시간은 10분이 넘는다");
		System.out.println("대답 : "+answer);
	}
}

학기 중에 해당 주차의 강의를 들을 때 과제에 사용되지 않는 연산자를 주의깊게 보지 못해서 이번에 복습할 때 ‘이런 것도 있었지’ 라는 생각이 들 때가 있어서 소홀했던 부분에 대해 반성할 수 있었다.

이번에는 학기 중에 제출했던 과제와 차이점이 조금 있어서 지난 회차와 다르게 코드의 비교가 가능했는데, 확실히 학기를 끝내고 복습을 한 이후에 다시 과제를 해보니 조금이지만 코드에서 예전과는 달라진 점이 보여서 재미를 느끼며 할 수 있지 않았나싶다.

카테고리:

업데이트: