indexOf와 splice 모두 시간 복잡도가 O(n)으로입력 데이터의 수가 커지면 그만큼 시간이 오래 걸린다.이를 해결해야한다.이번에는 sort로 두 배열을 정렬해서 가장 앞 부분만 비교를 하고자 한다.sort는 시간 복잡도가 O(nlog(n))이다.가장 앞만 비교
프로그래머스. 코딩테스트 고득점 Kit.해시. 1단계
프로그래머스. 코딩테스트 고득점 Kit.스택/큐. 1단계전형적인 스택 구조를 활용한 풀이이다.가장 직관적이고, 머리 속으로 상상 가능한 풀이라고 생각된다.이 풀이는 쇼킹해서 가져와봤다.filter를 사용하는 것은 생각해볼 수 있는데, 이렇게 간단하게 사용될 것이라고는
프로그래머스. 코딩테스트 고득점 Kit.정렬. 1단계
프로그래머스. 코딩테스트 고득점 Kit.완전탐색. 1단계처음부터 접근을 이상하게 해서 결국 다른 분의 풀이를 참고했다.아예 문제 처음부터 명함의 긴 부분을 가로로 만들고,짧은 부분을 세로로 만들었다.긴 부분은 긴 부분끼리 비교하고, 짧은 부분은 짧은 부분끼리 비교를 하
프로그래머스. 코딩테스트 고득점 Kit.탐욕법(Greedy). 1단계어떤 케이스에서 틀렸는지 알 수가 없어서 다른 분 풀이를 가져왔다.내가 처음 썼던 풀이와 다른 점은 sort를 진행했다는 것과filter를 통해 연산하지 않아도 되는 케이스를 제거했다는 것,앞뒤 학생을
Date 객체에서 getDay를 사용하면 간단하게 특정 날짜의 요일을 구할 수 있다.getDay는 0 ~ 6의 숫자를 반환하며, 일 ~ 토요일을 의미한다.주의할 점은 Date 객체를 사용할 때, "year-month-day"의 형태로 문자열을 입력해줘야한다는 것이다.D
직관적으로 풀었다.문자열의 길이를 파악해서 홀수인지 짝수인지 판별하고,짝수라면 길이 / 2번 인덱스와 그 앞 글자를 이어서 출력한다.홀수라면 길이 / 2가 정수가 아니므로, Math.floor를 통해 정수로 변환 후 사용한다.
arr의 원소가 divisor로 나누어 떨어지면 ans에 넣는다ans는 오름차순 정렬을 해서 출력한다.만약 ans에 아무것도 들어가지 않았다면 -1을 넣어준다.filter를 통해 나머지가 0인 것만 남겨놓는다.그렇게 생성된 배열의 길이가 0이라면 -1을 리턴하고,0이
처음 문제 조건을 봤을 때 숫자의 범위가 매우 클 가능성이 있어서, for문 사용을 주저했었는데,그렇다고 정수 합을 구하는데 reduce나 forEach, map을 사용하기에는해당 범위의 정수값을 가지는 배열을 먼저 만드는 것이 필요해서 시간이 더 걸릴 것 같았다.등차
2차원 배열의 정렬처럼 풀었다.단, a의 n번째 문자와 b의 n번째 문자가 같은 경우에는 사전 순서로 정렬해야하므로다시 한번 정렬을 입력해줬다.
이 분은 모두 대문자로 바꾸고, P, Y를 기준으로 자른 배열의 길이가 같은 경우나 둘 다 0인 경우에 true,다른 경우에는 false를 반환하게 하셨다.
sort 메서드는 아스키 코드로 변환해서 정렬을 하는데알파벳 대문자가 알파벳 소문자보다 숫자가 작기 때문에그냥 내림차순 정렬을 해주는 것만으로도 조건을 만족할 수 있다.
문자열이 섞여있으면 NaN을 반환하는 Number를 써보려고했으나"0x11" 등과 같은 입력값이 들오면 다른 진수로 계산해서 출력하기 때문에 제대로 판단이 되지않았다.또한, "0000" 같은 경우에는 0으로 출력되므로 false로 인식되어서 주의할 필요도 있었다.그래서
너무 간단해서...주석 한 줄로 모든 설명이 끝나버렸다.
solution
solution
놀랍게도 이렇게만 해도 정답이다.이유를 살펴보자.Number()는 맨 앞에 0이 오면 자동적으로 0을 지우는데,문제 조건에는 0이 맨 앞에 오지않는다고 했으므로 고려하지 않아도 된다.필자가 걱정했던 것은 "12+3-44" 이런 식으로 숫자 사이사이에 기호가 들어가 있는
주어진 문자열의 원소들을 아스키 코드 번호로 변환해서 분기 처리를 해줬다.대문자는 대문자, 소문자는 소문자끼리 순환하므로각각 90, 122가 넘어가면 알파벳 개수인 26을 빼줘서 처음부터 시작하는 것처럼 만들어줘야한다.
단순하다.주어진 숫자 n을 1부터 n까지 증가하는 i로 나눈다.나누어 떨어진다면, 그 때의 i와 몫이 약수이므로 ans 배열에 넣는다.여기서 고려해야할 것은 중복되는 값들이 생긴다는 것이다.예를들어 n이 12라고 하면 3과 4가 ans에 들어간 후, 4와 3이 또 an
크게 어려울 것은 없는 문제였다.처음에는 공백을 기준으로 단어들을 나눠준다.그리고 단어 하나하나를 알파벳 단위로 쪼개서 인덱스의 홀짝에 맞춰 대,소문자로 변환한다.새롭게 변환된 단어를 ans 배열에 넣고공백을 넣어서 다시 하나의 문자열로 만들어 반환한다.
이번 문제는 number 타입을 string으로 바꾼 뒤 쪼개는 것이 관건이라고 생각한다.물론, 자릿수를 뽑아내는 연산을 할 수도 있겠지만, 코드가 길어질 것 같다.
너무나도 간단한 문제였다.이전 문제와 동일하게 입력된 숫자를 string 타입으로 바꿔서 쪼갠 뒤배열로 만들고, map을 통해 number 타입으로 바꾼다.그 다음 배열을 뒤집으면 끝!
이전 문제와 같은듯 다른 문제다.number 타입 입력값을 string으로 바꿔서, 쪼갠 뒤, 배열로 만들고내림차순 정렬을 위해 number 타입으로 바꾼 뒤 정렬을 진행한다.여기서 그냥 join만 해서 반환하면 문자형으로 반환되기 때문에Number()를 사용해서 nu
Math.sqrt()는 음수가 들어가면 NaN을 반환하는데,문제 조건이 1 이상의 숫자가 들어오므로, 이는 신경쓰지 않아도 된다.예를들어, n이 3이라면 num은 1.xxxx가 되는데이를 1로 나누면 0.xxxx가 남으므로 num이 정수가 아니라는 것을 알 수 있다.이
문제의 두 번째 조건인최솟값이 여러 개가 나올 수 없다는 것을 간접적으로 알려준다.값이 중복되지 않으면 최솟값은 하나일 수 밖에 없기 때문이다.그래서 indexOf를 사용해도 문제가 없었다.
너무 쉬워서 설명을 생략..
solution 유클리드 호제법을 사용하여 최대공약수를 구한다. 최소공배수는 두 자연수의 곱을 최대공약수로 나눠서 얻을 수 있다. 유클리드 호제법을 사용한 백준 문제를 몇 가지 풀었었는데, 여기에 가면 필자의 풀이가 있다.
이번 문제는 문제만 이해하면 그대로 코드로 옮겨주기만 하면 된다.분기처리를 신경 써주는 것이 관건인 것 같고, 분기 처리의 순서를 잘 짜는 것도 주요 포인트라고 생각한다.
reduce 메서드를 사용해서 배열의 총 합을 구한 뒤배열의 길이로 나눠서 평균값을 구했다.
계속 비슷한 문제들이 나오고 있다.입력 데이터 x를 배열로 만들어서 각 자릿수 합을 구하고그 것으로 x를 나눠서 나누어 떨어지면 true,아니면 false를 반환한다.
이번 문제는 복잡하게 풀려고하면 충분히 복잡해질 것 같다.다만 문자열의 길이가 20까지밖에 나오지않으므로, 충분히 for문으로 시간 초과없이 풀 수 있을 것으로 생각됐다.끝에서 4번째 자리까지만 원래 번호를 유지하면 되므로,나머지 부분을 전부 \* 기호로 바꿔주면 된다
2차원 배열을 풀기 위해서 1차원 배열씩 나눠서 풀어줬다.개인적으로 느낀 것인데 시간이 좀 걸리는 방법같다.그렇다고 다른 분들 풀이 중 필자가 이해할 수 있는 획기적인 방법이 없었다.다들 좀..천재적으로 푸셔서 코드만 봐서는 이해할 수가 없었다..
x의 범위가 음수도 포함된다는 것에 유의하면서 진행하자.0으로 초기화해놓은 num에 x를 더해가면서 ans 배열에 push를 한다.ans 배열의 길이가 n이 되면 그 땐 연산을 종료하고 ans 배열을 반환한다.
for문을 사용할까 했지만, 하나의 테스트 케이스에 대해서 출력하는 것이므로repeat를 사용해서 간단하게 표현해봤다.
세 숫자의 합을 구현하는 것과 소수 판별을 위한 배열을 만드는 것이 관건이다.둘 중 하나라도 못하면 못 푼다.세 숫자의 합을 구하는 것은 for문을 여러번 사용해서 쉽게 구현할 수 있다.여기서 구한 합은 sums 배열에 넣어놓는다.에라토스테네스의 체 방식을 사용하여 소
최대한 많은 부서에 예산을 주는 것 = 가장 적은 예산이 필요한 곳부터 제거해 나가는 것이 것을 이해하면 굉장히 쉽게 풀 수 있다.d를 오름차순 정렬해서 앞쪽에 나오는 원소가 가장 적은 예산을 필요로 하는 부서가 되게 만들어준다.예산에서 요구 예산을 빼나가면서남은 예산
이 문제는 문제 예시에 그림과 10진수 2진수 변환이 없었다면 못 풀었을지도 모르겠다는 생각이 든다.방법은 간단하다.주어진 배열의 각 배열값인 10진수들을 2진수로 변환한다.n x n의 정사각형이므로 남는 자리는 padStart를 사용해서 0으로 채워줘야한다.그렇게 하
문제를 어떻게 풀어낼지 고민하는데 10분이 넘게 걸린 것 같다. 총 40분 가량 작성했다.전부 작성하고 보니...코드가 너무 길다.너무 세세하게 분기 처리를 한 것인가 싶기도 하고, 알고리즘 지식을 활용한 것 같지도 않다.지금보니 tmp, comp 배열은 stack 구
수포자 번호에 따라 배열을 하나씩 만드는 방법은 for문 내부에서 사용하기 어려워서하나의 객체에 모든 수포자의 정보를 넣어놨다.answers와 수포자의 답안을 비교하기 위해서 수포자의 답안을 answers의 길이보다 크게 만들어줬는데,아마 이 부분에서 시간 소요가 꽤
음...굉장히 길어졌다. 40분정도 푼 것 같은데...실패율을 내림차순 정렬하는게 아니라, 스테이지를 실패율에 따라 내림차순하는 것이기 때문에그냥 배열에 넣어서 정렬하는 것으로는 코드가 꼬여버렸다.객체의 key - value를 활용해서 스테이지 번호와 실패율을 한번에
40분 정도 걸려서 풀었다.문제 예시부터가 스택 구조를 이용하라는 강한 뉘앙스를 풍긴다.이건 주석을 따라 읽어나가면 이해가 편할 것이다.다른 분 풀이 중 가장 유명했던 것이, 2차원 배열의 열과 행을 바꿔서 어찌저찌 푸는 것이었는데,도저히 이해가 안되서 가져오는 것은
2차원 배열로 풀어보려고도 했고, 그냥 input만 가지고 풀어보려고도 했지만예외 처리에서 상당히 애를 먹어서결국 키패드를 좌표로 변환해서 푸는 방법을 선택했다.좌표로 표현하는 순간부터 굉장히 문제가 쉬워진다.주의할 것은 distanceL, distanceR을 구할 때
모든 경우의 수에 대한 연산을 진행하고중복되는 값들은 Set 객체를 통해 지워줬다.주의할 점은 Set 객체는 배열이 아니기 때문에,Array.from()을 통해서 배열의 형태로 전환해서 사용해야한다.
숫자를 배열로 만들어서 뒤집고,뒤집은 배열을 다시 하나의 문자열로 만든 것을parseInt를 적절하게 사용해서 10진수로 만들어준다.parseInt를 알고있다면 쉽게 풀 수 있는 문제였다.
정말 간단한 문제다.문제 예시에서 이미 답을 알려준 수준으로 풀이법을 줬기 때문에 쉽게 풀이가 가능했다.reduce()를 사용해서 누적합을 구하셨다.이 것 또한 상당히 깔끔한 방법이라고 생각한다.필자의 풀이와 비교해보자면acc은 sum,curr은 ai,idx는 bi를
정말 단순하게 풀었다.문제 예시에서 주어진 단계별 풀이법을 그대로 코드로 표현했다.특수 문자 처리의 편의성을 위해서 스택 구조를 활용했는데,중간에 shift()를 사용하는 바람에 사실..큰 의미가 있나..싶은 풀이다.사실상 데크 구조가 되어버렸다.1시간을 걸려 내 코드
true, false를 이용하여 사칙연산을 분기처리하면 된다.forEach나 reduce를 사용하는 방법도 가능할 것으로 보인다.다만, 시간복잡도가 O(n)으로 for보다 느릴 수 있다.참고로 for가 1.4배정도 빠르다고한다.
0이 최대한으로 활용될 수 있는 경우와, 최소한으로 활용될 수 있는 경우를 생각할 수 있으면생각보다 간단하게 풀어낼 수 있는 문제다.코드와 함께 주석을 보면 이해가 빠르다.minCount는 당첨된 숫자를 제외하고, 전부 틀렸을 경우즉, 0이 아무것도 맞춰주지 않았을 경
굉장히..길다.소수로 나눠나가면서 같은 소수가 사용된 횟수를 적립하고,그 것을 배열에 넣어놨다가,하나의 숫자의 약수의 개수를 구하는데 사용한다.그렇게 구한 약수의 개수가 홀수인지 짝수인지에 따라빼거나 더하거나를 구분해서 최종 연산을 진행한다.제곱근이 정수라면 약수의 개
어렵지않은 문제였다.s로 주어진 입력 데이터를 쪼개서 string 타입 원소를 가지는 배열로 변환하고,숫자가 input으로 들어오면 그대로 ans에 넣으며,문자가 들어오면 str에 넣어준다.str을 지속적으로 체크해서 "one", "two", ...처럼 주어진 문자열로
간단한 문제였다.1부터 count까지 증가시키면서 N번 사용할 때까지의 총 사용료를 구한다.내가 가진 돈인 money와 총 사용료 toUse를 빼서0 이상이면 이용하는데 문제가 없으므로 0,0보다 작으면 이용하는데 문제가 있으므로 차액만큼 반환한다.여기서 차액은 음수로
굉장히 간단하다..주석 한 줄로 모든 설명이 끝났다.nubmers와 forEach를 사용해도 되는데 for가 더 빠르다고 알고 있기에 for를 사용했다.다른 분들의 풀이도 비슷하다.numberArr를 직접 선언하는게 아니라 0부터 9까지 증가시키는 for문으로만 구현하
아마 많은 분들이 이렇게 푸셨을 것 같다. 필자도 그렇다.물론, 경우의 수에 따라 기하급수적으로 시간 소요가 늘어날 가능성이 있다.실제로 하나의 테스트 케이스에서 다른 케이스보다 몇 십배가 더 걸린 것을 확인할 수 있었다.
시간 초과 + 틀림 얘가 그나마..빠름 시간 초과 + 틀림 시간 초과 + 틀림
객체를 사용한 것은 좋았으나,마지막에, 점수에 따른 성향 선택 부분에서 if문을 남발해서코드가 깨끗해보이지는 않는다.최대 1000개까지의 데이터가 들어올 경우 for문에서 test 객체의 값들을 조정한 뒤,객체의 key 값들로만 비교를 하기 때문에시간 초과 문제는 없었
af
예전에 최빈값 문제를 풀 때 사용했던 Map 객체를 활용해서 풀어봤다.사실 그 때는 최빈값을 풀 때 Map 객체가 가장 편하다 라는 말을 듣고 그냥 썼었는데,실행 시간을 보니 생각보다 긴 시간이 걸려서 놀랐다.다른 분들 풀이를 보니, Map 객체를 사용하신 분들도 많이
최소공배수를 활용하는 문제였다.따라서, 유클리드 호제법을 사용하였다.예를들어,10명이 1판에 6조각을 주는 피자를 모두 동일한 개수로 나눠 먹으려면총 30조각이 필요하다. 인당 3조각이 가야지 모두 동일하게 먹을 수 있기 때문이다.여기서 30은 어떻게 나온걸까?10과
굉장히 간단한 문제다.평균값을 구하기 위해서 모든 수의 합을 구해야하는데,필자는 for나 reduce가 떠올랐다.위 코드를 reduce로 바꿔보겠다.테스트 케이스가 적어서 그런건지는 모르겠지만시간 차이가 눈에 띄게 나지는 않았다.
이 간단한 문제를 왜 기록까지 하는가에 대해 적어보려고 한다.바로 / 연산 때문이다.JS에서 / 연산은 소수점까지 계산이 되서 나온다.참고 이미지이렇게 말이다.따라서 문제에서 요구하는 정수로 딱 떨어지는 값들을 계산하려면,소수점 부분은 완전히 버려야한다.(사과 2.33
문자열을 하나하나 빼서 조건문 판별을 했다.간단한 문제인데도 코드가 굉장히 길어지는데,더 간단히 표현하는 방법이 있다.테스트 케이스가 얼마 없어서 정확한 확인은 못하지만,두 코드 사이에 소요 시간은 거의 차이가 없다.내 풀이는 모든 케이스에서 일정한 시간이 걸린 반면,
딱 고전적인 풀이 그 자체로 풀었다.짝수의 합을 구하는 공식이 있을 것 같아서,다른 분 풀이도 찾아보았다.예를들어, n이 6이면half는 3이 되고, 3\*4 = 12가 반환된다.앞으로 짝수의 합을 구할 때 참고해야겠다.
약간...하드 코딩을 한 느낌이다.사실 문제에서 사용될 문자들의 개수가 적어서, 상관없다고 생각하지만허용 문자열이 더 늘어날 경우를 생각하면, ASCII 코드로 문제를 푸는 것도 좋을 것 같다.ASCII 코드를 활용하는 방법으로 풀어보았다.전체적인 구조는 똑같고, 활용
구현해야하는 기능을 하나하나 나눠서 구현한 느낌이 든다.코드 자체는 이해가 빨리 되지만, 문제에 비해서 너무 긴 코드를 갖게 된게 아닌가 싶었다.다른 분들은 어떻게 풀었을까?엄청 간단하게 해결하셨다.원리는 이렇다.원본 배열을 복사해서 내림차순 정렬한다.원본 배열의 값들
약수를 구하는 방법이 비효율적으로 보인다.입력값이 커지면 그만큼 반복 횟수가 기하급수적으로 늘어나기 때문이다.실제로 4.77ms가 걸리는 테스트 케이스가 있었다.약수를 구하는 방법을 효율적으로 바꿀 필요가 있다.예시를 몇 개 찾아서 규칙을 찾아봤더니,입력값의 절반까지만
n으로 주어지는 1차원 배열의 크기를 이용하여 반복문을 돌린다.따라서 하나의 덩어리가 될 길이만큼 i가 이동한다.slice를 사용하여 원본 배열에는 영향이 없도록 하였고,slice(i, i +n)은 i번 인덱스부터 i + n - 1번 인덱스까지 복사하므로n의 길이를 가
인덱스가 2씩 증가하는 것을 활용한 풀이이다.k가 1 증가할 때마다 ansIndex는 2씩 증가하는 것으로 그를 구현했다.만약 ansIndex가 numbers 배열의 길이보다 길어지면, numbers의 길이만큼을 빼서 인덱스가 초과하는 것을 방지한다.마지막까지 연산이
간단하다.right가 나오면 오른쪽으로 한 칸씩 가야하므로, 맨 끝에 있는 원소만 앞으로 옮기고left가 나오면 왼쪽으로 한 칸씩 가야하므로, 맨 앞에 있는 원소만 뒤로 옮기면 된다.상당히 불편해보이는 방법이다.같은 방법을 구현하는데 pop(), shift()를 활용할
이 문제는 사실...BigInt 때문에 많은 분들이 헤매셨을거라고 생각한다.필자도 이유를 몰라서 한참을 헤맸다.아무래도 입력값으로 일반적인 number 타입을 넘어서는 값이 들어오는 케이스가 있는 모양이다.참고로, BigInt 타입은 BigInt 타입끼리만 연산이 가능
굉장히 직관적으로 작성한 코드다. 문제를 그대로 코드로 옮긴 느낌..?measure는 약수를 넣어놓는 배열이다.n이 1씩 증가할 때마다 해당 숫자에 대하여 약수 판별을 시작하고,measure 배열의 길이가 3 이상이 되는 숫자는 ans 배열에 넣는다.합성수의 개수를 구
정규식을 활용했다.my_string의 문자가 0 ~ 9까지의 숫자에 해당하는지 체크하고,맞다면 ans 배열에 넣는다.주의할 점은 number 타입으로 변환해서 넣어야 정답 조건에 맞는다는 것!최종적으로 ans 배열을 오름차순 정렬해주면 끝이다.이 분도 마찬가지로 정규식
숫자만을 판단하는 정규식을 사용했다.match() 메소드를 사용해서, 정규식 조건을 만족하는 것들만 배열화하였고,이 때, string 타입으로 배열화되기 때문에 모두 number 타입으로 변환해주었다.그 뒤로는, reduce()를 사용해 누적합을 구해주었다.
일반적인 소인수 분해를 사용했다.new Set()을 통해 중복되는 값들을 하나로 만들어줬고,오름차순 정렬하여 반환해줬다.
Set 객체를 활용하여 중복되는 값들을 제거했다.중복되는게 있다고 해서 전부 제거되는게 아니라 가장 앞에 있는 값을 남겨둔 채로 지우기 때문에,의도한대로 동작하게 되는 것이다.
만약, 두 수의 차이가 중복되는 경우가 없다면 굉장히 쉽게 끝나는 문제지만,두 수의 차가 같은 경우가 존재할 수 있다.그럴 경우 값의 차를 저장해놓은 배열 ans에서 인덱스가 다르게 나올 것이며,이 때, 가장 앞의 인덱스와 가장 뒤의 인덱스를 각각 저장하여두 값을 비교
이 문제는 풀긴 풀었는데, 푸는데 꽤 시간이 걸렸다.Z라는 문자가 연속으로 나오는 경우가 어떤 의미인지 파악하지 못했던 것이 그 원인이다.만약라는 입력값이 주어지면, 이는을 의미한다.이는 스택 구조를 이용해서 쉽게 구현 할 수 있다.Z가 입력되면 스택에 들어있던 값을
후보로 주어진 문자열들을 하드 코딩했다.zero의 인덱스는 0, one의 인덱스는 1... 이 점을 활용하여split()과 join()을 활용해서 문자열을 계속해서 분리하고 합치기를 반복했다.즉, 아래와 같은 구조로 코드가 돌아가는 것이다.
splice()를 활용하여 특정 인덱스의 원소를 하나 지우고, 그 자리에 변환된 원소를 넣는 방식으로 문제를 해결했다.혹시나 다른 분들은 어떻게 풀었나해서 찾아보니...이렇게 단순하게 풀수도 있다는 것을 알았다.시간 차이는 거의 없지만, 이해하기 쉬우면서도 간결한 코드
굉장히...꼬아서 푼 것 같다는 느낌이 든다.우선 중복을 제거한 것의 길이가 원본의 길이와 같으면, 중복되는 문자가 없는 것이므로 그대로 원본을 반환한다.길이가 다르면 중복이 존재하는 것이므로, 연산을 진행한다.원본 배열을 특정 문자열로 split()하고 다시 join
흔한 약수 구하기 문제였다.그런데..for를 웬만하면 사용하지않으려고 노력하고 있기에 다른 방법을 고민해봤다.n + 1의 길이를 가지는 배열(0 ~ n까지의 인덱스를 가짐)을 생성하고 index를 활용하는 방법으로 forEach()를 사용했다.
forEach()의 콜백으로 item, index를 적절하게 사용해서 최대값을 갱신해나가며요구되는 형태로 ans를 만들었다.
단순한 해결방법이다.공백을 기준으로 split()한 배열을 순회하며,\+, - 연산자가 나오면 그 다음에 나오는 숫자를 알맞게 연산한다.
s1, s2 중 한쪽만 완전 순회하면서 확인하면 되므로 간단한 문제가 된다.필자는 s1을 기준으로 순회하며 s2에 겹치는 것이 있는지 확인했다.
시간 초과를 해결한다고 별의별 방법을 다 써봤는데,결국 몇 번 실패했던 스택 구조를 몇 번 수정해서야 통과했다.아마 시간 초과로 고생하신 많은 분들이 위 풀이가 본인이 해봤던 방법과 정말 한 끗 차이라는 것을 느끼실거다.중요한 포인트는 스택의 길이가 4 이상인 경우부터
문제 해결을 굉장히 직관적으로 써내려간 풀이이다.이 풀이의 문제점은 인덱스를 정확하게 적어주며 풀었다는 것이라고 생각한다.만약, 다른 케이스가 더 추가됐더라면 이 풀이는 좋지않다.유동적으로 적용하기가 힘들기 때문이다.다른 분의 풀이 중 좋은 것이 있어서 가져와봤다.이해
간단한 문제인데, Math.sqrt()를 활용하는 문제가 많이 없어서 적어놓고자한다.Math.sqrt()는 소수점의 제곱수까지도 판별하기 때문에1로 나눈 나머지가 0인 것만이 정수임을 알 수 있다.
배열 원소 하나에 대하여 쪼갠 뒤, 7이 들어있는지를 검사하는 방법이다.forEach()가 이중으로 사용되었으므로, 좋은 방법은 아닌 것 같다.충격적. 왜 이 생각을 못한거지..?배열 전체를 하나의 문자열로 합친 뒤, "7"로 나눈다.나눠진 갯수는 7의 개수 + 1이므
splice()가 원본 배열에 영향을 준다는 점을 활용하여 while로 반복문을 돌렸다.배열화한 my_str에서 n개 만큼 잘라낸 문자를 join()하여,ans 배열에 push()했다.
하나의 기준을 잡고, 다른 값들을 움직여가며 최대값을 갱신해나가는 풀이이다.for를 2중으로 사용한다는 것 외에는 이해하기 좋은 코드라고 생각된다..
쉽다고 생각하고 풀었으나, 예외 상황이 있었다.어떤 좌표가 어디에 들어있는지는 정해지지 않았다는 것이다.입력값은 어떻게든 마구잡이로 나올 수 있다는 것을 유념해야했다.현재 필자가 구현한 sort()는 1차원 배열의 인덱스가 0인 부분을 비교해서 정렬한다.따라서 x축 값
이 문제는 많은 분들이 케이스 8을 통과하지 못해 애를 먹으셨으리라 생각된다.필자도 그랬다...ㅋ..이거 레벨 0 맞나..?정말 간단한 문제였다.가장 바깥쪽으로 갔을 때, 다시 안쪽으로 들어가는 연산이 들어온다면그 연산을 처리해줘야하는데...가장 바깥쪽까지 가면 모든
코드가 길긴한데,직관적이고 이해가 쉽게 짰다고 생각한다...아마 몇몇 테이스트 케이스에서 통과가 안되신 분들은 문제 조건 중계수 1은 생략한다를 처리하지 않으셨기 때문이라고 생각한다.x가 존재하는 경우에 대해서 처리를 해주시면, 모든 케이스가 통과될 것이다.return
음...정말 직관적인 풀이법이다.예시 입출력값으로 주어진 것을 보고 그대로 코드로 작성하면 된다.연산 부분을 더 줄이면 이렇게 된다.결과적으로 입력값으로 주어진 배열에서 (더 작은 값 \* 2) - 1이 답이라는 것이다.그래서 극한으로 줄이면 이렇게 된다.아무래도 수학
dic 배열의 원소 하나에 대하여 spell을 검사한다.만약, spell의 원소가 포함되어 있다면 count를 증가시킨다.하나의 dic 배열 원소에 대한 연산이 끝날 때, count가 spell 배열의 길이와 같다면spell 내의 모든 원소가 존재한다는 것이므로, is
solution 주어진 문자열을 쪼갠 뒤 하나하나 확인하는 방법이다. Number()를 사용했을 때, NaN이 아니라면 숫자이므로, 이를 stack에 저장한다. 뒤에 이어서 오는 문자열이 숫자가 아니라 일반 문자라면, stack에 들어있는 숫자를 ans에 더하고 s
이 문제의 관건은 연속적인 처리라고 생각한다.3이 들어간 숫자, 3의 배수인 숫자는 모두 허용되지않는다.따라서, 두 조건 중 하나를 만족해서 1이 증가된 숫자가 또 다시 조건을 만족하게 되는 경우를 생각해야한다.이로 인해서 단순 if문을 나열하는 것으로는 문제가 해결되
시간 초과로 인해 오답 처리되었다.map 내부에서 for가 동작하기 때문에 시간 소모가 크다.getDivisor에서 number까지 전부 연산을 하기 때문에 시간 소모가 크다.기능을 쪼개는 것에 집중한 나머지함수 하나하나에서 시간 소모가 심한 반복문이 작성된 것도 한몫
뭔가...더 깔끔한 풀이가 있을 것 같다.상황을 세세하게 분류하는건 좋은데, 중복되는 코드가 있어서 보기가 안좋다.리팩토링을 해보자.오, 훨씬 깔끔해졌다. 그런데...걸리는 시간은 solution 1이 훨씬 짧다.아무래도 solution 2는 sort를 계속해서 진행한
원리는 간단하다. 오름차순 정렬을 한 뒤에 가장 뒤에서부터 m개씩 한 박스를 만든다.그러면 가장 비싼 과일부터 포장이 되어가기 때문에 최대의 이익을 낼 수 있다.오름차순 정렬이 되어있다는 점을 활용해서Math.min()을 사용하지않고 인덱스를 사용하는 것도 가능하다.다
사실...이 문제는 뭔가를 고민하고 풀었다기보다는 입출력 예시로 주어진 것을 보고 풀었다.주의할 점은 b가 1로 고정된 값이 아니라는 것이다.예시에서는 전부 1로 주어져서 아무 생각 없이 1개를 교환 받는걸로 대입하면 안된다는 것이다필자가 그랬다..ㅠㅠ그 외에는 예시를
스택을 활용하는 문제이다.( 문자와 )로 감싸져야만 올바른 문자이다.만약, 주어진 문자가 )로 시작하면 이는 어떻게 해도 올바르지 않으므로 예외 처리한다.또한, 주어진 문자가 (로 끝나면 어떻게 해도 올바르지 않으므로 예외 처리한다.stack에 ( 문자가 들어온 뒤 )
큐 구조를 이용한 직관적인 풀이이다.(사실 큐 구조의 특성을 이용하지는 않았지만)우선 distributes라는 배포까지의 시간을 나타내는 배열을 구한다.queue에 아무것도 들어있지않다면 우선 queue에 값을 넣어준다.그렇다면 queue 가장 앞에 있는 값이 배포 단
처음에는 1부터 n까지 숫자 하나하나에 대하여 팩토리얼을 구해나가면서, 팩토리얼 값이 n 이상이 될 경우 해당 팩토리얼을 반환할 생각이었다.그러나, 모든 수에 대하여 팩토리얼을 진행하면 연산이 길어질 것 같다고 판단하였고,n까지의 숫자를 하나씩 곱해나가면서 그 때마다
my_string을 하나씩 검사하는 방법이다.모음으로 주어진 데이터에 my_string의 문자가 포함되어있다면 continue,포함되어있지 않다면 ans 배열에 넣는다.최종적으로 ans 배열을 join()하면 정답이 된다.정규식을 활용하셨다.모음으로 주어진 데이터를 정
풀리긴한다. 단, 시간은 최대 1744.49ms, 메모리는 최대 217MB까지 잡아먹게 되는 방법이다.시간을 줄일 수 있는 방법은...X, Y에서 겹치는 숫자를 뽑는 방법을 다르게 해보면 될 것 같다.현재는 한번 연산이 진행된 숫자는 stack에 넣어서 다음 연산에서
방법은 다음과 같다.스택에 문자를 넣는다. 스택 가장 아래에 있는 문자가 기준이 될 것이다.filter()를 통해서 기준 글자와 같은 배열, 같지 않은 배열을 생성한다.이 둘의 길이가 같다면, 문제 조건에 부합하므로 count를 1 증가시킨다.다음 케이스를 판별하기 위
방법은 다음과 같다.스택이 있고, 그 곳에는 문자열이 하나씩 들어갈 것이다.우선 스택을 확인한다. 현재 넣으려는 문자열이 존재하지 않는다면 -1을 ans에 넣는다.그리고 스택에 그 문자열을 넣어준다.그 뒤에 있는 코드가 실행되지 않도록 continue 처리도 해준다.스
방법은 다음과 같다.말할 수 있는 단어를 가지고 있는 배열 can의 원소가 2번 이상 반복된다면 발음할 수 없으므로break를 통해 다음 단어로 넘어간다.여기서 2번 이상 반복인데 왜 repeat(2)로만 처리되는지 의문이 생길 수 있다.아래 예시를 보자.3번 반복되는
방법은 이렇다.문자열 t에서는 비교를 위해서 문자열 p의 길이만큼씩 덩어리를 생성해나간다.필요한 부분의 인덱스를 복사해서 새로운 상수에 저장하고,각 원소를 합쳐서 number 타입으로 전환한다.이를 number 타입으로 변환한 p와 비교하여 연산을 진행한다.
방법은 이렇다.오늘 날짜는 .을 기준으로 합쳐서 하나의 숫자로 만들어준다.그리고나서, 약관에 따른 유효 기간을 key-value로 만들어 객체 형태로 보관한다.다음으로, 주어진 데이터의 수집 일자와 약관 종류를 활용하여 연산을 진행한다.수집 일자와 약관 종류를 각각 다
굉장히 쉬운 문제였다. 레벨 2 라는게 믿기지 않을 정도...공백을 기준으로 문자열을 나눈 뒤, 숫자의 크기로 정렬하기 위해 number 타입으로 변환한다.그리고 오름차순 정렬을 한다.이렇게 되면 0번 인덱스는 최솟값, 가장 끝 인덱스는 최댓값이 된다.이를 문자열로 만
약간 막무가내로 작성한 코드이다.우선, 공백을 확인한다.공백은 이어져서 등장할 수도 있다는 점을 주의하며,Number()로 바꿨을 때 0이 된다는 점도 주의해야한다.따라서, 가장 먼저 처리하며, 그대로 stack에 넣는다.다음으로는, 숫자 문자열에 관한 처리이다.만약,
간단한 원리로 해결하는 방법이다. 소제목에도 적어놨지만 효율성 테스트는 하나도 통과하지 못한다.다만, 효율성 통과를 위해 작성해야할 코드의 기본적인 흐름을 파악하기 좋았다고 생각한다.A 배열의 가장 작은 값과 B 배열의 가장 큰 값을 곱해서 더해나가면,결국 누적합은 가
0이 아닌 값만 남기도록 newS를 만든다.이 때, 생략되는 0의 개수를 누적합 해준다.newS의 길이를 2진수로 변환한 것을 새로운 s로 할당한다.다음 연산을 진행하기 전 반복 횟수를 누적합 해준다.s의 길이가 1보다 작아지면 1만 남은 것이므로 연산이 종료된다.반복
반드시 연속적인 자연수의 합만으로 n을 만드는 것이 허용되므로, for문을 사용했다.i를 통해 시작하는 자연수를 지정해준다.i부터 n까지 증가하는 j를 누적합하면서n보다 커져버리는 경우 i를 증가시켜서 시작 자연수를 변경한다.누적합이 n과 일치하면 정답이므로 count
재귀를 사용했다. 그러나 런타임 오류까지 발생했다.알아보니 숫자가 너무 커서 int 타입으로는 해결이 안되는 모양이다.그러면...BigInt를 써야하는걸까?맞긴한데...좀 더 찾아보니 문제가 이상하다는 말이 있었다.적혀있는 문제대로라면...n번째 피보나치 수를 1234
방법은 다음과 같다.toString(2)을 통해 2진수로 변환한 후, 이를 배열화한다.1의 개수가 일치하는 것이 관건이므로, 0인 것을 제외한 배열의 길이를 구한다.n으로 주어진 숫자가 판별의 기준이 되고,조건을 만족하는 가장 작은 숫자를 구하기 위해서는 1씩 증가시키
두 방법 모두 같은 방식을 사용했다.스택 구조를 활용하여,스택의 가장 위에 있는 값과 넣으려고 하는 값이 같으면 스택에서 제거하고,그렇지 않다면 스택에 넣는 것이다.문자열을 순차적으로 사용하여 스택에 넣기 때문에,2개가 이어진 문자열을 앞에서부터 차례대로 제거해나간다.
우선 기본적으로 아무 일도 없을 때 반환될 초기값 \[0,0]을 ans에 할당한다.스택에 단어들을 넣으면서 탈락자를 확인할 것이다.스택에 들어간 단어의 가장 위에 있는 단어와 현재 단어를 비교하는 것이 핵심이다.스택에 들어간 단어의 가장 위에 있는 단어가 pre이고,p
필자는 함수를 만들어서 풀었다. 함수를 설명하자면 다음과 같다.목표 문장에서 하나의 카드(ex. cards1)에 들어있는 애들만 쭉 뽑아낸다.이는 문제 조건에 cards1, cards2가 다른 단어로만 이루어져있다고 명시되어 있기 때문에 가능하다.뽑아낸 배열에서 해야할
매우 쉬운 문제였다.사람과 추억 점수를 각각 매칭하는 것, 즉, 객체화하는 것이 핵심인 것 같다.이후 2차원 배열을 순회하면서 추억 점수가 존재하는 사람만 연산을 진행해주면 된다!
이 문제는 문자열을 다루는 문제이고, 키가 눌릴 때마다 다음 문자열이 나온다는 점에서 Trie 구조가 생각났다.최소한의 횟수로 문자열을 완성하기 위해서는 몇 번 눌렀는지를 아는 것이 중요했고,이는 Trie에서 level을 활용하는 것으로 구현할 수 있겠다고 판단했다.따
접두어를 이용하는 문제였기 때문에 Trie를 떠올렸다.문제 분류는 Hash로 되어있었지만, 개인적으로 Hash는 접두어 문제에 사용하기 까다롭다고 생각하여Trie로 문제를 해결하고자 했다.원리는 다음과 같다.phone_book에 담겨있는 모든 번호를 Trie에 넣어준다
이 문제는 경우의 수를 따지는 문제이다.따라서, 모든 경우의 수를 구하기만 하면 되기 때문에, 어떤 옷을 입는지는 관심사가 아니다.단, 어떤 종류의 옷을 입는지에만 집중해주면 된다.따라서, 옷의 종류를 key로 가지면서, 그 종류의 옷의 개수를 value로 가지도록 H
이 문제는 처음 주어진 priorities에서 location 인덱스에 해당하는 프로세스가 언제 처리되는지 구하는 것이 목표이다.여기서 어떤 점을 신경 써야하는지 적어보자면...프로세스를 다루는 큐는 언제든지 길이가 변할 수 있다.1번으로 인해 인덱스 또한 프로세스 처
CAR_RENTAL_COMPANY_CAR라는 테이블에서 = FROM CAR_RENTAL_COMPANY_CARCAR_TYPE이 SUV인 데이터 중 = WHERE CAR_TYPE = "SUV"DAILY_FEE 열 값의 평균값을 얻고 = AVG(DAILY_FEE)그 값을 소
DOCTOR 테이블에서MCDP_CD가 CS 혹은 GS인 것들 중DR_NAME, DR_ID, MCDP_CD, HIRE_YMD를 추출하고HIRE_YMD의 경우 yyyy-mm-dd의 포맷을 가지도록 한다.또한 HIRE_YMD을 내림차순 정렬하고HIRE_YMD가 같은 경우 D
FIRST_HALF 테이블의 PK인 FLAVOR와ICECREAM_INFO 테이블의 FK인 FLAVOR가 같은 것들을 JOIN한다.FIRST_HALF 테이블에서TOTAL_ORDER가 3000 이상이면서,ICECREAM_INFO 테이블에서INGREDIENT_TYPE이 fr
USED_GOODS_BOARD 테이블과 USED_GOODS_REPLY 테이블을 JOIN 한다.2022년 10월에 생성된 USED_GOODS_BOARD 테이블의 데이터 중필요한 데이터들을 추출한다.USED_GOODS_REPLY 테이블의 CREATED_DATE를 기준으로
FIRST_HALF 테이블에서FLAVOR 열의 데이터를 추출한다.TOTAL_ORDER를 기준으로 내림차순 정렬을 하고,만약 같은 데이터가 있다면 SHIPMENT_ID를 기준으로 오름차순 정렬을 한다.
FOOD_FACTORY 테이블에서ADDRESS가 강원도로 시작하는 것들 중필요한 데이터를 추출한다.이 때, FACTORY_ID를 기준으로 오름차순 정렬한다.
PATIENT 테이블에서AGE가 12 이하, GEND_CD가 W인 데이터 중필요한 데이터를 추출하라.이 때, TLNO에 값이 없다면 NONE을 출력하도록 한다.또한, AGE를 기준으로 내림차순하고, 값이 같은 경우 PT_NAME을 기준으로 오름차순 정렬한다.
BOOK 테이블에서CATEGORY가 "인문"이면서 PUBLISHED_DATE가 2021년도인 것들 중BOOK_ID와 PUBLISHED_DATE를 추출하고이 때, PUBLISHED_DATE는 YYYY-MM-DD 형태로 보이게 한다.또한, PUBLISHED_DATE를 기준
ANIMAL_INS 테이블에서모든 정보를 가져온다.이 때, ANIMAL_ID를 기준으로 오름차순 정렬을 한다.
ANIMAL_INS 테이블에서NAME과 DATETIME 열의 데이터를 얻는다.이 때, ANIMAL_ID를 기준으로 내림차순 정렬한다.
ANIMAL_INS 테이블에서INTAKE_CONDITION이 Sick인 것들의 데이터 중ANIMAL_ID와 NAME을 추출한다.이 때, ANIMAL_ID를 기준으로 오름차순 정렬한다.
ANIMAL_INS 테이블에서INTAKE_CONDITION이 Aged가 아닌 데이터 중ANIMAL_ID와 NAME 열을 추출한다.이 때, ANIMAL_ID를 기준으로 오름차순 정렬한다.
ANIMAL_INS 테이블에서ANIMAL_ID와 NAME 열을 추출한다.이 때, ANIMAL_ID을 기준으로 오름차순 정렬한다.
ANIMAL_INS 테이블에서ANIMAL_ID와 NAME, DATETIME 열을 추출한다.이 때, NAME을 기준으로 오름차순 정렬한다.만약, NAME이 같으면 DATETIME을 기준으로 내림차순 정렬한다.
ANIMAL_INS 테이블에서NAME열을 추출한다.이 때, DATETIME을 기준으로 오름차순 정렬하고,맨 앞의 데이터 1개만 추출한다.이를 통해, DATETIME이 가장 빠른 것을 얻을 수 있다.
USER_INFO 테이블에서JOINED가 2021년인 데이터이면서,AGE가 20 이상, 29 이하인 것들의개수를 구한다.
혹은DEVELOPER_INFOS 테이블에서SKILL_1 혹은 SKILL_2 혹은 SKILL_3가 Python인 것들의 데이터를 추출한다.이 때, ID를 기준으로 오름차순 정렬한다.
FISH_INFO 테이블에서LENGTH가 NULL인 것들을 추출한다.이 때, 데이터의 개수(COUNT())를 얻고그 데이터의 컬럼명을 FISH_COUNT로 한다.
FISH_INFO 테이블에서LENGTH를 기준으로 내림차순 정렬하고,만약 그 값이 같은 경우 ID를 기준으로 오름차순 정렬한다.그 후, 앞에서부터 10개까지의 데이터만 추출한다.이를 통해, LENGTH가 긴 순서대로 10개의 데이터를 얻을 수 있다.
ECOLI_DATA 테이블에서ID의 개수(COUNT())를 COUNT라는 컬럼명으로 추출한다.GENOTYPE은 10진수로,이를 2진수로 변경했을 때 자릿수를 n번 형질이라고 정의한다.예를 들면 다음과 같이 표현 가능하다.이런 연산을 진행하기 위해서 비트 연산자를 사용하
PRODUCT 테이블에서PRICE가 가장 큰(MAX())인 것을 MAX_PRICE라는 컬럼명으로 추출한다.
ANIMAL_INS 테이블에서DATETIME의 값이 가장 큰(MAX())인 것을 추출한다.즉, 가장 최신의 시간을 가진 데이터를 추출한다.
FISH_INFO 테이블에서LENGTH 중 가장 큰(MAX()) 데이터를cm라는 문자열을 뒤에 이어서 추출한다.이 때, 컬럼명은 MAX_LENGTH라고 한다.
FOOD_WAREHOUSE 테이블에서ADDRESS가 경기도로 시작하는 것들 중필요한 데이터를 추출한다.이 때, WAREHOUSE_ID를 기준으로 오름차순 정렬한다.
ANIMAL_INS 테이블에서NAME이 NULL인 것들 중ANIMAL_ID를 추출한다.이 때, ANIMAL_ID를 기준으로 오름차순 정렬한다.
ANIMAL_INS 테이블에서NAME이 NULL이 아닌 것들 중ANIMAL_ID를 추출한다.이 때, ANIMAL_ID를 기준으로 오름차순 정렬한다.
USER_INFO 테이블에서AGE가 NULL인 데이터의개수(COUNT())를 USERS라는 컬럼명으로 추출한다.
FISH_INFO 테이블에서LENGTH의 평균(AVG)을 구하는데,만약 LENGTH가 NULL이라면 10으로 처리한다(IFNULL(\_, 10)).평균값은 소숫점 2자리로 반올림(ROUND(\_, 2))하고,컬럼명은 AVERAGE_LENGTH로 한다.
CAR_RENTAL_COMPANY_CAR 테이블에서OPTIONS에 네이게이션이라는 문자열이 포함된 것들을 전부 추출한다.이 때, CAR_ID를 기준으로 내림차순 정렬한다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서START_DATE가 2022년 9월에 포함된 것들 중필요한 데이터를 추출하며,HISTORY_ID를 기준으로 내림차순 정렬한다.만약, END_DATE와 START_DATE의 차가 30일 이상이면 장기
FISH_INFO 테이블에서TIME이 2021년에 해당하는 데이터들의 개수(COUNT())를FISH_COUNT라는 컬럼명으로 추출한다.
MEMBER_PROFILE 테이블에서DATE_OF_BIRTH가 3월이면서, GENDER가 W이며, TLNO가 NULL이 아닌 데이터들 중필요한 정보를 추출한다.이 때, MEMBER_ID를 기준으로 오름차순 정렬한다.
ONLINE_SALE 테이블에서USER_ID와 PRODUCT_ID로 그룹화 하여 동일한 값이 나오는 것들끼리 하나로 묶는다.즉, 같은 유저가 어떤 상품을 구매했는지 파악할 수 있게 한다.이 때, PRODUCT_ID가 2개 이상인 것들의 USER_ID와 PRODUCT_I