プログラマーLv.1 (7)


21.01.17 ~ 21.01.19

📌 自然数配列の反転



イニシャルコード

class Solution {
    public int[] solution(long n) {
        int[] answer = {};
        
        return answer;
    }
}

私が書いたコード

class Solution {
    public int[] solution(long n) {
       
        String str = Long.toString(n);
        int[] answer = new int[str.length()];
        //str to integer, 반복해서 하나씩 넣기
        for (int i = 0; i < str.length(); i++) {
            answer[i] = Integer.parseInt(String.valueOf(str.charAt(str.length() - 1 - i))); //(1)
        }
       
        return answer;
    }
}
long->string->integerを通らなければなりません.(1)からParseIntまでは前回書いたのを覚えていますがstringの1文字だけをintに変える方法が思いつかず検索してみました.str.charat(index)でcharフォーマットの1文字だけを求め、String.valueOf(一字)でその字の形をstrに変換します.これでstrを整数に表現できます.
配列の一番前に数字の最後の数字があるので、インデックスはstr.length()-1-iです.

他人の解答

class Solution {
  public int[] solution(long n) {
      int length = Long.toString(n).length();
        int[] answer = new int[length];

        for (int i = 0; i < length; i++) {
            answer[i] = (int) (n % 10);
            n /= 10;
        }

        return answer;
  }
}
ここではいっそ長さという変数を宣言しました.そしてnを順番に10,残りの12345のうちの5に分ける.また,n/=10であれば,1234.5でシェアのみを表すと1234となる.この過程を繰り返すと123,12,1でnのビット数が減少し,答えには1のビット数から格納される.形を変えるのではなく、数字の特性を考慮した草もあったのか.

📌 文字列降順



イニシャルコード

class Solution {
    public String solution(String s) {
        String answer = "";
        return answer;
    }
}

私が書いたコード

import java.util.Arrays;
import java.util.Collections;
class Solution {
    public String solution(String s) {
        String answer = "";
        String[] temp = new String[s.length()];
        for (int i = 0; i < s.length(); i++) {
            temp[i] = Character.toString(s.charAt(i));
        }
        Arrays.sort(temp,Collections.reverseOrder());
        for (String ch : temp ) {
            answer += ch;
        }
        return answer;
    }
}
上記のように、charatでその場にいる字を取り出し、文字列に変換して配列に置きます.配列にはsort機能があるので、それを使うために配列に入れなければなりません.

他の人の答え(Python)

def solution(s):
    return ''.join(sorted(s, reverse=True))
pythonを使用すると、フォーマット変換を行わずに文字列をソートできます.
だから文字列の問題が発生したら、Pythonを勉強しなければならないと思います.

📌 紛失金額の計算



イニシャルコード

class Solution {
    public long solution(int price, int money, int count) {
        long answer = -1;
        return answer;
    }
}

私が書いたコード

class Solution {
    public long solution(int price, int money, int count) {
        long answer = -1;
        long sum = 0; //(1)
        for (int i = 1; i <= count; i++) {
            sum += price * i;
        }
        
        answer = (money < sum) ? sum - money : 0;
        return answer;
    }
}
もともと(1)ではsum変数がintとして宣言されていた.どうせpriceもiもint型だから大丈夫だと思って書いたけど採点はある場合間違ってるアルゴリズム自体は間違っていないと思い、検索してみると、私のようにして変数を成長させた結果、すべてのテストケースで合格しました.そこでsolution関数自体がlongタイプを返すのを見たかもしれないので、いくつかのテストケースでは、値が誇張されている可能性があります.intよりlongの方が幅が広いので、次回もタイプを考えてみましょう.

📌 2つの整数の合計



イニシャルコード

class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        return answer;
    }
}

私が書いたコード

class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        if (a == b) {
            answer = a;
        }
        else {
            int min = Math.min(a,b);
            int max = Math.max(a,b);
            for (int i = min; i <= max; i++ ) {
                answer += i;
            }
        }
        return answer;
    }
}
aとbは同じことを考慮してifゲートで検査しなければならないと考えた.結果は採点に間違いはなかったが、他人の解を見てMathであることに気づいた.minとMath.maxを使うと2つの数が同じ場合を考慮する必要はありませんだから直して

私が修正したコード

class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        int min = Math.min(a,b);
        int max = Math.max(a,b);
        for (int i = min; i <= max; i++ ) {
            answer += i;
        }
        return answer;
    }
}
次回もMath関数を使用する場合は、同じ関数を比較すると、どちらかが自分で出力されることを考慮してください.

📌 ダーツゲーム



イニシャルコード

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        return answer;
    }
}

他人の解答

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int idx = 0;
        Matcher matcher = Pattern.compile("([0-9]0?)([SDT])([*#]?)").matcher(dartResult); //(1)
        ArrayList<Integer> scores = new ArrayList<>();
        
        while (matcher.find()) {
            int type = matcher.group(2).equals("S")? 1 : matcher.group(2).equals("D")? 2: 3;
            int option = matcher.group(3).equals("*")? 2 : matcher.group(3).equals("#")? -1: 1;
            int score = (int)Math.pow(Integer.parseInt(matcher.group(1)),type) * option;
            
            scores.add(idx,score);
            
            if (idx > 0 && option == 2) {
                scores.set(idx - 1, scores.get(idx - 1) * option);
            }
            idx++;
        }
        for (int score : scores) {
            answer += score;
        }
        return answer;
    }
}
どう考えても、if文やelse if文をたくさん使うことしか考えられないので、良いコードを勉強したつもりで、すぐに検索することにしました.
(1)正規表現を使用する場合に使用できるMatcherとPatternを用いた.
▼▼▼正規表現を使う
importの場合は他のクラスと少し違います真ん中にregexが必要です.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
Patternパターン名=Pattern.compile(「正規表現を入力」);
->正規表現の宣言
Matcher Matcher Name=パターン名.matcher(「チェックする文字列」);
->正規表現と一致するかどうかを確認する文字列を保存
match.find();
->正規表現に一致する値がtrueの場合falseを返します
match.group();
->正規表現に対する文字列の一致値を返します
正規の儀式で書かれた数字、大文字小文字、選択事項などを暗記していて、忘れたことの多さを改めて実感しました.
重複文は、一致値がtrueの場合に重複します.
2番目の要素分類をtypeに格納し、3番目の要素分類をoptionに格納します.これに基づいて、scoreにラウンドの最終点数を格納します.この場合,いずれにしても状況の数は3つで決まるので,3つの演算子でも完全に簡潔に表すことができる.
その点数を点数表に入れる.
第1ラウンド&&オプションがDoubleでなければ、スコア配列では前のラウンドのスコアも2倍に処理されます.
各ラウンドのスコアをwhileで求めた後、そのスコアを答えに蓄積し、総スコアを返します.

他の人の答え(Python)

def solution(dartResult):
    point = []
    answer = []
    dartResult = dartResult.replace('10','k') #(1)
    point = ['10' if i == 'k' else i for i in dartResult]
    
    i = -1 #(2)
    sdt = ['S', 'D', 'T']
    for j in point:
        if j in sdt : #몇 제곱 되는지 검사
            answer[i] = answer[i] ** (sdt.index(j)+1)
        elif j == '*' : # 스타상이면 두배
            answer[i] = answer[i] * 2                
            if i != 0 : #첫 라운드 점수가 아니면(=앞 라운드 점수가 있으면)
                answer[i - 1] = answer[i - 1] * 2
        elif j == '#' : #아차상이면 -1배
            answer[i] = answer[i] * (-1)
        else: #j가 숫자면 answer에 포인트 삽입, 후에 if 조건에 따라 값 변화
            answer.append(int(j))
            i += 1
    return sum(answer)
(1)与えられた配列は要素を区別しない.10に分けず、1、0に分けられないので、先に10をkに置き換える方法を使いました.
(2)ここで宣言したiは,応答配列中の要素を読み込むインデックスとして用いられる.次の文を繰り返すelse文では、まず純粋なペアのスコアを挿入し、点配列で適切な二乗または倍数をループするため、初期化値が-1である理由を考慮した.最初の反復では、jはもちろん数値(点)であるため、else文に乗ってresponse[0]に最初のラウンドスコアを挿入する.次の反復では,jは['S','D','T'の1つであるので,二乗計算を行う.iは0であるため、response[0]は第1ラウンドのスコアを表し、それに応じてスコアを修正する.まず点数を挿入するのではなく、ボーナスやオプションを使った最終点数であれば、iを-1にする必要はありません.