
일상생활에서 우리는 다양한 방법으로 다양한 것들을 정리하곤 한다. 그것이 서점의 책이던 주방의 식기들이던 이러한 것들을 다양한 방법으로 정리하여 정렬(저장)하는 것처럼 프로그램에서도 자료(데이터)들을 정리하여 보관하는 여러 가지 방법(구조)들이 존재한다. 조금 간단하게 이야기해서 데이터를 정리하여 보관하는 방법을 자료구조라고 한다. 자료구조는 크게 [스택, 큐, 리스트, 그래프, 트리] 총 5가지로 나눌 수 있다. 이 중에서 스택에 대해 이야기해보려 한다. 무엇인가를 쌓을 때 하나를 쌓고, 그 위로 계속해서 쌓는 것처럼 Stack은 사전적 정의로 '쌓다', 혹은 '더미'라는 의미를 담고 있다. 그렇다면 가장 처음 쌓은 것을 다시 꺼내기 위해서는 그 위에 쌓인 것들을 모두 꺼내고 난 후에 꺼낼 수가 있다...

배열에 서로 다른 인덱스에 저장된 값을 임의로 2개 뽑아 나올 수 있는 모든 값을 오름차순으로 정렬하여 반환하는 함수이다. 코드를 보며 설명하도록 하겠다. 배열에 저장된 값들 중에서의 모든 경우의 수를 따지기 위해 중첩 for 반복문을 이용하였는데, 이 문제는 ArrayList 객체를 사용하여 해결하였다. ArrayList 객체의 메서드 중 indexOf() 메서드를 사용하였다. indexOf() 메서드는 파라미터 안에 인자를 주어 해당 값이 ArrayList 객체 안에 존재하면 그 값이 저장되어있는 인덱스 번호를 리턴하고 그 값이 만약 없다면 -1을 리턴하게 된다. 반복문을 통해 모든 경우의 수를 따지면서 indexOf() 메서드를 사용하여 이미 존재하지 않는다면 즉, 그 값이 이미 ArrayList ..

이차원 배열 sizes를 받아 배열 안에 저장된 값들 중 모든 명함 크기를 수용할 수 있는 크기 중 가장 작은 크기를 계산하여 반환하는 함수이다. 코드를 보며 설명하도록 하겠다. 현재 기준 역대 level 1 프로그래머스 문제들 중 가장 긴 코드이다. 우선 어떻게 solution을 내려고 했는지에 대해서 코드의 큰 틀을 설명하도록 하겠다. 모든 경우의 수 즉, 모든 크기의 명함을 수용하기 위해서는 가장 큰 값을 구해야 한다. 그 이유는 문제의 설명에 명함을 눕히는 것이 가능하다고 되어있는데, 이점을 이용해 지갑의 크기를 줄일 수 있다. 이해를 돕기 위해 첫 번째 입출력 예를 통해 예시를 보이겠다. 첫 번째 입출력은 [[60, 50], [30, 70], [60, 30], [80, 40]]이고, 가장 큰 값..

int 타입 배열 arr에 저장되어있는 값들 중 연속된 값들은 제거하고 남은 수들을 반환하는 문제이다. 코드를 보며 설명하도록 하겠다. 코드에 대해 설명하면 먼저 인접해있는 두 인덱스에 저장된 값들을 비교하여 같으면 count 변수를 증감시키고 같지 않다면 다시 count를 0으로 초기화한다. 이때, reload 변수를 증감시킨다. reload 변수를 증감시키는 이유는 인접해있는 두 변수가 다른 상황이 몇 번 오는지를 확인하기 위해서이다. 하지만 여기서 주의해야 할 점은 마지막 인덱스 번호 뒤로는 더 이상 존재하는 인덱스가 없기 때문에 대조할 비교군이 없다. 그렇기 때문에 reload의 값을 하나 더 증가시켜야만 정확한 측정을 할 수 있다. 이해를 돕기 위해 하나의 예를 들겠다. 이렇게 배열의 크기를 몇..

int 타입 변수 n으로부터 입력받은 값을 가지고 1부터 n사이에 있는 자연수 사이에서 소수의 개수를 찾는 문제이다. 코드를 보며 설명하도록 하겠다. 우선 코드를 살펴보기 전 소수에 대해서 이야기를 하자면 소수는 자기 자신을 나누어 떨어지게 하는 숫자가 1과 자기 자신을 제외하고 존재하지 않는다면 그 숫자를 소수라고 한다. 이를 확인하기 위해 for 중첩 반복문을 사용하였다. i % j가 0이라면 나누어 떨어지는 것이기 때문에 반복을 통해 나누어 떨어지지 않는 수를 찾았다. 저 코드에서 만약 6, 9, 13번째 줄의 코드들이 존재하지 않는다면 이 코드에 문법적인 오류는 없지만 제대로 된 값을 반환받지는 못한다. 그 이유는 8번 줄의 if 조건문으로 인해 1과 자기 자신(i)을 제외한 사이의 숫자들 중 i..

int 타입 변수 n을 입력받아 나누었을 때 나머지가 1이 되도록 하는 자연수 x 중 가장 작은 x를 반환하는 문제이다. 코드를 보며 설명하도록 하겠다. 변수 n에 저장된 값은 3에서 1,000,000까지의 자연수 중 하나이다. 이 많은 수들 중 나머지가 1이 되도록 하는 x의 값은 1개일 수도 있지만 n에 저장된 값이 크면 클수록 그 x는 2개 이상일 것이다. 그들 중 가장 작은 x값을 구하기 위해서는 for 반복문을 이용하여 그 값을 구해야 한다. 우선 반복문의 범위는 1부터 n보다 작을 때까지로 하였다. 범위의 시작은 2부터 하여도 굳이 상관은 없으나(어차피 1은 n의 값이 무엇이던 무조건 나누어 떨어지게 하기 때문) 그냥 1로 하였고 n보다 작은 범위로 한 이유는 나머지가 1인 수를 보는 것인데 ..