리나의 개발로그

백준 알고리즘 no.2739 구구단

|

출처

문제출처 - 백준 알고리즘 3단계(for문) 中

문제

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

출력

출력형식과 같게 N _ 1부터 N _ 9까지 출력한다.

제출

import java.util.Scanner;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        for(int i = 1; i < 10; i++){
            System.out.println(n + " * " + i + " = " + n*i);
        }
        
        sc.close();
    }
}

숏코드

import java.util.*;
class Main{
    public static void main(String[] a){
        int n=new Scanner(System.in).nextInt();
        int i=0;
        while(i<9)
        System.out.println(n+" * "+ ++i+" = "+n*i);
    }
}

int n을 정의할 때 저렇게 연달아서 쓸 수 있다는 것을 알았다. 신기하다…! 그런데 이건 for문 유형의 문제인데 푸시는 것은 while 이용해서 푸셨구나…. 그래도 크게 문제가 될만한 것은 없는것 같다.

포인트

  • for문의 문법을 제대로 이해하고 있어야 한다.

백준 알고리즘 no.10817 세 수

|

출처

문제출처 - 백준 알고리즘 2단계(if문) 中

문제

세 정수 A, B, C가 주어진다. 이때, 두 번째로 큰 정수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)

출력

두 번째로 큰 정수를 출력한다.

제출

import java.util.*;

class If_10817{
	public static void main(String[] args){
		Scanner s=new Scanner(System.in);
		int arr[] = new int[3];

        for (int i = 0; i < arr.length; i++){
            arr[i] = new int[3];
        }

        for (int i = 0; i < arr.length; i++){
            for (int j = 0; j < arr.length; j++){
                if (arr[i] < arr[j]){
                    int imsi = arr[i];
                    arr[i] = arr[j];
                    arr[j] = imsi;
                }
            }
        }sc.close();
		
		System.out.print(arr[1]);
    }
}

숏코드

import java.util.*;
class Main{
	public static void main(String[] t){
		Scanner s=new Scanner(System.in);
		int[]a={s.nextInt(),s.nextInt(),s.nextInt()};
		Arrays.sort(a);
		System.out.print(a[1]);}}

열심히 선택정렬 방식으로 대소비교를 했는데, 숏코딩을 보니 java.util.sorts; 를 import해서 사용한 코드들이었다. Arrays.sort(arr) 클래스를 사용하면 배열이 오름차순으로 정렬 되는 것이었다…!! 유용하게 쓰일 것 같다.

포인트

  • 나와 같은 선택정렬 방식을 하면 아무래도 코드가 길어질 수 밖에 없는데, Arrays.sort를 쓰니 매우 간단!

백준 알고리즘 no.2884 알람 시계

|

출처

문제출처 - 백준 알고리즘 2단계(if문) 中

문제

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.

상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.

이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 “45분 일찍 알람 맞추기”이다.

이 방법은 단순하다. 원래 맞춰져있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 맞춰논 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 맞춰놓은 알람 시간 H시 M분을 의미한다.

입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.

출력

첫째 줄에 상근이가 창영이의 방법을 사용할 때, 맞춰야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)

제출

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int H = sc.nextInt();
		int M = sc.nextInt();
		
		int newH = H;
		int newM = M-45;
		if(newM < 0) {
			newM += 60;
			newH--;
			if(newH < 0)
				newH += 24;
		}
		System.out.println(newH + " " + newM);
		sc.close();
	}
}

숏코드

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int h = sc.nextInt();
		int m = sc.nextInt();

		m -= 45;
		if (m < 0) {
			h--;
			m += 60;
		}
		if (h < 0) {
			h = 23;
		}
		System.out.println(h + " " + m);
	}
}

이번엔 숏코딩과 내 코딩이 크게 차이나진 않는듯…!

포인트

  • 분, 시를 따로 생각하며 경우의 수에 따라 어떤 방식으로 처리할지를 알맞게 맞춰 주어야 한다.

코코아톡 클론 2주 챌린지 후기

|

코코아톡 클론 2주 챌린지 2기!

너무너무x100 기쁜 챌린지 완주! 매일매일 과제 제출을 100% 수행했다는 점이 정말 뿌듯하다.

너무나도 혜자스러운 노마드 강의들. 그런데 이제 강의 뿐만 아니라 노마드코더 챌린지 사이트도 따로 만들어 주시면서, 제공하는 몇몇 강의들에 대한 챌린지들을 릴레이로 진행해주신다. 각각의 챌린지를 완료할 때마다 해당 기술스택에 관련된 뱃지가 예쁘게 표시됨과 동시에 따로 이수했다는 수료증도 볼 수 있다. 이렇게 뱃지를 하나하나 모으는 재미까지 만들어 주셔서 그저 감사할 뿐. 항상 업그레이드해서 제공해주시는 혜자 강의들만 해도 어마어마한데 이런 챌린지 과정까지 만들어 주셔서 너무나도 고마운 마음이다.

노마드코더 챌린지란?

어드민 린님이 만들어주신 챌린지 관련 Q&A 위키 페이지를 보면 아마 대부분의 질문이 풀리겠지만. 간단히 정리하자면 아카데미에서 구매한 강의를 완강할 수 있도록 하기 위해 기간을 정하고 매일매일 미션을 수행하며 정해진 기간 내에 학습할 수 있도록 프로그램을 만들어 주신 것!

그런데 중요한 것은, 단순히 인강 진도만 나가는 것이 아니라, 해당 진도에 맞추어 퀴즈를 풀기도 하고 직접 과제에 맞춰 코드를 작성해서 제출해야 한다는 점이다! 그냥 인터넷 강의를 듣는 것과는 훨씬 다른 강의 소화 능력을 경험해 볼 수 있다는게 큰 장점인 것 같다. 강의를 활용해서 해당 과제를 해결하기 위해 어떤 코드를 써야 하는지 생각해 보아야 하고, 배우지 않은 개념이 필요하다면 직접 구글링해서 찾아 본 뒤에 사용해서 해결해 나가도록 유도한다. 이를 통해 직접 생각하고 검색해서 적용시키는 능력까지도 기를 수 있게 해주는 것이다. 게다가 내가 낸 코드들은 챌린지 졸업생에 한해서 니꼬쌤이 직접! 코드리뷰도 해주신다!

강의를 구매한 모든 수강생들 대상, 무료로 이런 프로그램을 제공해 주다니 - 정말 그저 갓… 갓갓 니꼬…! 갓갓 린….! 돈을 내고서라도 참여하고 싶은 프로그램인데 무료로 열어주시면 그저 감사할 뿐 ㅠㅠ

코코아톡 클론 2주 챌린지는 어땠는가

HTML, CSS. 프로그래밍 언어가 아니고, 어찌보면 가장 직관적으로 확인하며 코드를 짜낼 수 있는 점이 장점인 영역이라고도 볼 수 있는 부분인데- 내가 강의를 들으면서 그 코드를 그대로 작성하는 것과 과제를 제출하기 위해 직접 생각해서 작성하는 것에는 참 많은 차이가 있었다. 과제를 수행하다가 한 부분에서 막히게 되면 이를 해결하는 데에 많은 시간을 쏟게 되고, 알고 보면 간단한 문제일 때의 허탈함이란…!

물론 그 과정에서 확실히 배우는 점이 많고, 해결했을 때의 기쁨이 참 좋았지만 말이다. 과제가 어려울 때에는 챌린지 수강생들과 함께 슬랙에서 거의 밤을 지새우며 과제를 완성해 나갔다. 그래도 끝까지 함께 했던 슬랙의 수강생분들이 계셔서 서로 의지도 되고 나만 이런게 아니구나 약간의 위로도 느끼면서 ㅋㅋㅋㅋ 나름대로 동지애 느끼며 과제를 했기 때문에 끝까지 챌린지를 완료할 수 있었던 것 같다. 다시금 감사합니다ㅠㅠ

코드 샌드박스를 이용해서 과제 제출이 이루어졌는데, 위의 사진은 내가 제출했던 과제 중 한 가지다. 제시된 과제를 조건에 맞추어 수행해 내는 것인데, 오른쪽 화면을 보면서 제대로 구현하고 있는지 확인해가며 코드를 작성해 제출했었다. 챌린지 막판쯤 되어서는 완벽히 완성해서 제출하는 것에 기본적으로 5시간 이상씩은 걸렸던 것 같다. 물론 이것은 아직 너무나도 초보자인 내 기준이었기 때문에 다른 분들은 훨씬 적게 걸리시는 분들도 많았다.

강의 100% 완주를 위한 프로그램이지만 역설적이게도 지치지 않고 챌린지 프로그램을 끝내기 위해서는 예습이 권장된다. 그런데 그도 그럴 것이 새로운 개념을 익히는 것 뿐만 아니라 이를 활용해서 코드를 작성해야 하기 때문에 한 번만에 졸업을 하려 한다면 사전 지식이 많은 상태가 아닌 이상 정말 어려울 수 있다. 적어도 어느 정도의 개념이 머리에 있는 상태에서 참여하는 것이 조금 더 수월하기 때문에(물론 시간을 많이 투자할 수 있다면 상관 없겠지만!) 예습을 추천한다.

특히나 3주 뒤에 2기가 시작되는 유튜브 클론 코딩 챌린지의 경우 6주 과정인데, 초급자를 위한 풀스택 코스이기는 하지만 서버 배포까지도 다루는 등 방대한 양이라서 무! 조! 건! 예습을 해야 한다고 슬랙에서 많은 분들이 강조해 주셨다. 학원이랑 병행할 수 있을지 걱정되긴 하지만 최선을 다해 봐야지….!

최종

졸업생 명단에 있게 된 날, 바로 블로그에 글을 남기고 싶었는데, 학원 수업에 치이며 지내다 보니 이제서야 후기를 남기게 되었다. 곧 코드 리뷰 동영상도 받을 수 있을 텐데, 후기를 작성하며 다시금 제출했던 과제 코드들을 보니 아쉬운 부분들이 눈에 띄는 것도 있긴 하지만, 2주간 열심히 했다는 것이 내 Dashboard에 나타나서 기쁘기도 하다.

어드민 린님과 너무나도 좋은 선생님인 니꼬, 수강생분들, 많은 고수분들의 도움 덕에 무사히 2주간의 챌린지를 마칠 수 있었다. 앞으로 노마드코더의 다른 수업들과 챌린지도 쭉- 참여하면서 실력을 열심히 향상시켜야겠다.

선택정렬(Selection Sort) JAVA

|

어제 과제에 나온 선택정렬 방식이 계속 안 되어서 고생했었기 때문에 잊기 전에 정리해 보는 개념.

선택 정렬(Selection Sort)

선택 정렬은 정렬되어져 있지 않은 자료를 정렬하는 방식 중 하나로 주어진 데이터값을 모두 비교해 최솟값의 위치를 기억해뒀다가 앞의 위치로 교환하는 정렬 방식이다. 즉, 데이터 전체에서 가장 작은 데이터를 찾아 가장 앞의 데이터와 교환하는 방식으로 특정 배열의 값을 정리한다.

예시 코드

for (int i = 0; i < num.length - 1; i++){
	for (int j = i + 1; j < num.length; j++){
		if (num[i] > num[j]){
			int temp = num[j];
			num[j] = num[i];
			num[i] = temp;
		}
	}
}

이 방식은 배열에서 i와 j를 비교했을 때 숫자가 더 큰 것을 계속 뒤로 보내는 방법이다.
중요한 것은 temp와 같은 임시 int 값을 만들어서 숫자를 임시적으로 담아주어야 두 개의 숫자를 온전히 바꿀 수 있다는 것이다.

모든 인자를 서로 다 비교하기 때문에 시간이 오래 걸려 효율성이 좋다고 보기는 어렵지만 간단하면서도 쉬운 방식이라 알고리즘에서도 많이 사용된다.

참고

Selection_Array_Fork_Dance 정말 어마어마한 선택 정렬 포크 댄스 ㅋㅋㅋ 한 번 보면 확실하게 이해를 시켜 주는 포크 댄스다!