반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

등차수열 문제였다.

 

 

** Java

 

 

1)

이건 내 첫번째 풀이였다.

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for (int i = 0; i < n; i++) {
            answer[i] = Long.valueOf(x) + Long.valueOf(x) * Long.valueOf(i);
        }
        return answer;
    }
}

 

 

위 소스를 보면 자료형 때문에 Long.valueOf 을 쓴 걸 볼 수 있는데

 

애초에 input 을 long 으로 받으면 될 문제였다.

 

2)

그래서 수정한 풀이는 이렇게 되었다.

class Solution {
    public long[] solution(long x, int n) {
        long[] answer = new long[n];
        for (int i = 0; i < n; i++) {
            answer[i] = x + x * i;
        }
        return answer;
    }
}

 

 

 

다른 사람들의 더 좋은 풀이를 보고 고치자면

 

answer[i]의 값은 사실 x 에 x * i 를 더하는 게 아니라 anwer[i - 1] 값에 x를 더하는 것이다.

 

그래야 문제 제목 그대로 x만큼의 간격이 있는 숫자가 된다.

 

따라서 문제 의도에 맞게 소스를 수정한다면

 

class Solution {
    public long[] solution(long x, int n) {
        long[] answer = new long[n];
        answer[0] = x;
        for (int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] + x;
        }
        return answer;
    }
}

 

위와 같이 된다.

 

 

 

 

** Javascript

 

 

나는 정말 간단하게 풀었다.

function solution(x, n) {
    var answer = [];
    for (var i = 0; i < n; i++) {
        answer.push(x + (x * i));   
    }
    return answer;
}

 

 

javascript 의 경우 워낙 기능이 많아서 그런지 기상천외한 풀이들을 볼 수 있다.

 

특히 한 줄로만 끝나는 것들

 

예를 들어

 

function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v);
}

 

Array(n) : length 가 n인 배열을 만들어준 뒤

.fill(x) :  배열 안의 값을 모두 x로 채우고

.map 을 이용하여 배열 안의 값들을 x + x * index 값으로 가공한다.

 

 

 

다른 풀이로 이렇게도 가능하다.

 

function solution(x, n) {
    return  Array.from({ length: n }, (v, index) => (index + 1) * x);
}

 

Array.from() 으로 length 가 n 인 배열을 만들어 안의 값들은 x + x * index 값으로 가공하여 넣어준다.

 

 

 

function solution(x, n) {
    return (n === 1) ? [x] : [ ...solution(x, n - 1), (x * n)];
}

 

재귀함수의 달인이 되면 위와 같은 식도 가능하다.

 

 

 

코드 한 줄로 위와 같이 멋지게 작성할 수 있지만 속도를 따지면 for문이 가장 빠르다고 한다!

 

 

 

 

** Python

 

def solution(n, m):
    return [n + n * i for i in range(m)]

 

등차수열이 떠오르지 않는가!

반응형
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

** Java

 

Java로는 다음과 같이 작성하였다.

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        for (int i = 0; i < b; i++) {
            for (int j = 0; j < a; j++) {
                System.out.printf("*");
            }
            System.out.println();
        }
    }
}

 

대략 1800명이 같은 풀이로 통과하였다.

 

다른 풀이 중 추천을 가장 많이 받은 풀이를 보면

 

import java.util.Scanner;
import java.util.stream.IntStream;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        StringBuilder sb = new StringBuilder();
        IntStream.range(0, a).forEach(s -> sb.append("*"));
        IntStream.range(0, b).forEach(s -> System.out.println(sb.toString()));
    }
}

 

* StringBuilder

 

일반적으로 String 은 immutable(불변) 의 특성을 가지고 있어서 문자열을 인스턴스를 한 번 생성하고 나면 문자열 값을 변경하지 못한다.

따라서 편집이 필요할 경우 기존 값을 버리고 새로운 변수에 값을 할당해야 하는데 이 경우 능률성이 매우 낮아진다.

 

StringBuilder와 StringBuffer 는 이를 보완하기 위해 만들어진 클래스 중 하나라고 한다.

 

StringBuilder 생성 목적에 맞게 같은 인스턴스 안의 문자열에 필드 값을 추가하거나 변경이 가능하다고 한다.

 

String 클래스의 메소드는 물론 문자열 추가 혹은 변경을 위한 추가 메소드를 가지고 있다.

 

그 중 append() 는 문자열을 뒤로 추가해 나가는 메소드이다.

 

 

참고:

https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

 

StringBuilder (Java Platform SE 7 )

Inserts the string into this character sequence. The characters of the String argument are inserted, in order, into this sequence at the indicated offset, moving up any characters originally above that position and increasing the length of this sequence by

docs.oracle.com

 

 

 

* IntStream

 

IntStream 의 경우 primitive Data인 int를 스트림으로 다루는 것을 가능케 한다고 한다.

 

IntStream.of(1, 2, 3, 4);

IntStream.range(1, 5);

는  똑같이 1, 2, 3, 4 에 대한 int 스트림을 생성한다.

 

 

 

반면

IntStream.of(1, 2, 3, 4, 5);

IntStream.rangeClose(1, 5);

는 1, 2, 3, 4, 5 에 대한 int 스트림을 생성한다.

 

 

range 와 rangeClose 를 잘 구별하자.

 

 

이렇게 생성된 값들은 stream 메소드들을 사용할 수 있다. iterator, anyMatch, noneMatch, filter 등이 가능하다.

 

 

 

 

 

참고:

https://blog.daum.net/oraclejava/15874666

 

[자바8강좌,int스트림]JAVA8, IntStream, of, range, rangeClosed, filter

[자바8강좌,int스트림]JAVA8, IntStream, of, range, rangeClosed, filter 자바8에 추가된 IntStream은 원시데이터형 int를 스트림으로 다룰수 있도록 해주는데 java.util.stream 패키지에는 스트림관련 API들이..

blog.daum.net

 

https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html

 

IntStream (Java Platform SE 8 )

Returns an infinite sequential ordered IntStream produced by iterative application of a function f to an initial element seed, producing a Stream consisting of seed, f(seed), f(f(seed)), etc. The first element (position 0) in the IntStream will be the prov

docs.oracle.com

 

** Javascript

 

javascript 로도 풀어보았다.

 

(원래도 이랬는지 모르겠는데 저장되어있는 풀이가 이렇게 되어있다.)

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    for (var i = 0; i < b; i++) {
        var answer = "";
        for (var j = 0; j < a; j++) {
            answer += "*";
        }
        console.log(answer);
    }
});

 

위와 같이 작성하였다.

 

추천을 많이 받은 다른 사람의 풀이를 보면 신박한 것을 볼 수 있는데

 

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    const row = '*'.repeat(a)
    for(let i =0; i < b; i++){
        console.log(row)
    }

});

 

repeat()이란 함수를 사용한 것이다.

 

 

 

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

 

String.prototype.repeat() - JavaScript | MDN

repeat() 메서드는 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환합니다.

developer.mozilla.org

 

 

해설을 보면 python 에서 문자열 * 숫자 처럼 사용할 수 있다.

 

 

 

** Python

 

a, b = map(int, input().strip().split(' '))
for i in range(b):
    print(a * "*")

 

 

문자열에 숫자를 곱하여 출력할 수 있는 파이썬의 특징상 이렇게도 쓸 수 있다.

(추천수가 가장 높은 풀이다.)

 

a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)
반응형
반응형

https://programmers.co.kr/learn/courses/30/lessons/76501

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

[숫자들], [Boolean들] 을 받았을 때 Boolean 배열이 true 이면 더하고 false이면 빼는 제목 그대로 음양 더하기이다.

 

reduce를 사용할까 했는데 그냥 for문을 돌렸다.

 

 

function solution(absolutes, signs) {
    let answer = 0;
    for (const index in signs) {
        if (!signs[index]) {
            absolutes[index] = absolutes[index] * -1;
        }
        answer += absolutes[index]
    }
    return answer;
}

 

 

역시나 가장 높은 추천수를 받은 답안은 reduce를 썼다.

 

function solution(absolutes, signs) {

    return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}
반응형
반응형

https://programmers.co.kr/learn/courses/30/lessons/70129

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

문제를 보면

 

1. 2진법으로 변환된 숫자가 String으로 제시된다.

2. 제시된 String에서 "0"을 제거한다.

3. "0"을 제거하고 남은 String의 길이를 2진법으로 변환된 String으로 바꿔준다.

4. 2진법 변환된 수가 "1" 보다 크면 계속 반복한다.

5. 0이 제거된 횟수와 제거된 0의 개수를 [횟수, 갯수] 형태로 return 한다.

 

 

내 식은 이렇다.

 

function solution(s) {
    let count = 0;
    let zeros = 0;
    while (s !== "1") {
        zeros += (s.match(/0/g) || []).length;
        s = s.replace(/0/g, "").length.toString(2);
        count++;
    }
    return [count, zeros];
}

 

아직 쌈박한 답안은 안 올라온 것 같다.

반응형
반응형

https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수

programmers.co.kr

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

문제는 이렇다.

 

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

 

 

 

내 식은 이랬다.

 

function solution(n) {
    let ternary = [];
    let answer = 0;
    while (n >= 1) {
        if (n > 1) {
            ternary.push(n % 3);
        } else {
            ternary.push(n);
        }
        n = parseInt(n / 3);
    }
    for (let i = 0; i < ternary.length; i++) {
        answer += ternary[i] * Math.pow(3, ternary.length - 1 - i);
    }
    return answer;
}

 

 

 

근데 다른 사람의 풀이를 보니 한 줄로 끝나더라.

 

 

 

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}

 

 

 

toString으로 3진법 수 만들어준 뒤 한글자씩 풀어서 리스트 만들고 뒤집어서 String으로 만든 뒤 다시 10진법으로..

도른자덜,,,,,,

 

 

 

 

 

 

반응형
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

** Javascript

 

3진법이라는 알았는데 for문으로 접근했다가 시간을 너무 오래 잡아먹었다.

 

결국 구글링해서 답을 알아냈는데 생각보다 더 간단했다.

 

while 을 사용하면 이렇고

 

function solution(n) {
    const availableNumber = [ 4, 1, 2 ];
    let answer = '';
    while (n) {
        answer = availableNumber[n % 3] + answer;
        n = n % 3 ? Math.floor(n / 3) : n / 3 - 1;
    }
    return answer;
}

 

 

더 줄이면 이렇게 된다.

 

추천 가장 많이 받은 식인데 재귀함수 방법을 썼다.

n===0 조건 부분을 편집해서 길이를 더 줄여봤다.

 

function solution(n) {
  return n ?  solution(parseInt((n - 1) / 3)) + [1, 2, 4][(n - 1) % 3] : '';
}

 

 

 

(2022-04-28 추가)

** Python

 

def solution(n):
    answer = ''
    일이사 = '124'
    if n < 1: return answer
    while(n) :
        n -= 1
        answer = 일이사[(n) % 3] + answer
        n = n // 3
    return answer;
반응형
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

일단 피보나치 수에서 내가 쓴 함수는 이렇다.

 

 

** Javascript

 

function solution(n) {
    let a1 = 0, a2 = 1;
    let answer = [a1, a2];
    for (var i = 2; i <= n; i++) {
        answer.push((answer[i - 1] + answer[i - 2]) % 1234567);
    }
    // return answer[n] ?? 0;
    return answer[n] ? answer[n] : 0;
}

 

처음에 null 병합 연산자 이용해서 return 했는데 프로그래머스에서는 ES6가 안되는지 에러났었다.

 

그래서 answer[n] ? answer[n] : 0 으로 변경

 

 

 

** Python (2021.11.23)

 

def solution(n):
    a1 = 0
    a2 = 1
    answer = 0
    for i in range(n - 1):
        answer = a1 + a2
        a1 = a2
        a2 = answer
    return answer % 1234567

 

 

 

 

2 x n 타일링도 결국 피보나치 함수 물어보는 것이기에 이렇게 했다.

위 코드와 거의 같다.

 

function solution(n) {
    let arr = [1, 2];
    for (var i = 2; i <= n; i++) {
        arr.push((arr[i-1] + arr[i-2]) % 1000000007);
    }
    return arr[n-1] ? arr[n-1] : 0;
}

 

 

 

 

아래 식들을 이용하여 해봤는데 시간초과, 런타임에러 떠서 다 실패함.

 

 

 

 

썼던 함수들은 나중에 꺼내보려고 잠시 기록해둔다.

 

 

이건 for문 사용해서 만든 함수

function fibonacciGeneral(number) {
    let result = 0;
    let a1 = 0, a2 = 1;
    if (number <= 0) return a1;
    if (number === 1) return a2;
    for (var i = 0; i < number; i++) {
        result = a1 + a2;
        a1 = a2;
        a2 = result;
    }
    return result;
}

 

 

재귀함수 호출한 것은 이것

 

function fibonacciRecursion(n) {
    return n <= 1 ? n : fibonacciRecursion(n - 1) + fibonacciRecursion(n - 2);
}

 

 

위의 경우 77과 같은 큰 수를 넣었을 때 답이 나오지만 아래의 경우 큰 수는 계산이 오래 걸려서 답이 안 나올 수도 있음

반응형

+ Recent posts