Giter VIP home page Giter VIP logo

challenges-of-the-week's Introduction

🤜 알고리즘 고수가 되는 순간까지 🤛


아래의 규칙을 지켜주세요!

  1. 일주일에 최소 자유 3문제 + 지정 4문제 혹은 자유 4문제 + 지정 3문제 택1 , 총 7문제를 완료해야하며
    미 제출시 한 문제당 천원의 벌금이 부과됩니다 (월요일 0시 기준으로 정산됩니다)
  2. 사용언어는 규정하지 않습니다. 각자 편한 언어를 사용해주세요
  3. 풀이에 실패하면 답을 보지 마시고 팀원들에게 알려주세요!

문제 해설

문제 해설은 도전과제가 끝난 다음주에 올라옵니다.

금주의 도전과제

화차 내부에 각자 폴더를 만든 후, 자신의 폴더에 자신있는 언어로 작성할 것.

회차 > 아이디 > 제목.코드

코드 상단에 문제 링크 주소 넣어주셈.

// 두 개 뽑아서 더하기
// https://programmers.co.kr/learn/courses/30/lessons/68644

질문은 Issues 에 올릴 것.

Score

이름 게으름 지수
푸딩 0
5,000 (의문의 2000)
뿌요 13,000
혜성 15,000
점박 14,000
읔동웹땔깜 28,000
? 28,000

2021년 아홉번째주 - 2021W09

제목 난이도(or 정답비율)
콜라츠 추측 맹맛
H-Index 순한맛
주식가격 순한맛
멀리 뛰기 보통맛

2021년 여덟째주 - 2021W08

제목 난이도(or 정답비율)
이상한문자만들기 맹맛
타겟넘버 순한맛
예상대진표 순한맛
가사검색 매운맛 ( new! )

2021년 일곱째주 - 2021W07

제목 난이도(or 정답비율)
비밀지도 맹맛
단체사진 찍기 순한맛
괄호 변환 순한맛
불량 사용자 중간맛

2021년 다섯째주 - 2021W05

제목 난이도(or 정답비율)
신규 아이디 추천 맹맛
메뉴 리뉴얼 순한맛
순위 검색 순한맛
카드 짝 맞추기 중간맛
  • 이번주차 부터 자유 3문제 + 지정 4문제 혹은 자유 4문제 + 지정 3문제 택1

문제 해설

2021년 넷째주 - 2021W04

제목 난이도(or 정답비율)
실패율 맹맛
후보키 순한맛
순위 중간맛

문제 해설

2021년 셋째주 - 2021W03

제목 난이도(or 정답비율)
프린터 순한맛 (Lv_2)
오픈채팅방 순한맛 (Lv_2)
베스트앨범 중간맛 (Lv_3)

문제 해설

2021년 둘째주 - 2021W02

제목 난이도(or 정답비율)
가장 큰 정사각형 찾기 순한맛
파일명 정렬 순한맛
기지국 설치 중간맛

문제 해설

2021년 첫주 - 2021W01

제목 난이도(or 정답비율)
조이스틱 순한맛
삼각 달팽이 순한맛
외벽 점검 중간맛

문제 해설

2020년 마지막 주 - 2020W53

제목 난이도(or 정답비율)
두 개 뽑아서 더하기 맹맛
스킬트리 순한맛
위장 순한맛

문제 해설

challenges-of-the-week's People

Contributors

fienestar avatar leec0m3t avatar minnim6 avatar mrquestion avatar naldal avatar pursue503 avatar soo941226 avatar yurihan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

naldal

challenges-of-the-week's Issues

무한루프 돕니다 .. 헬프..ㅠ

테스트 케이스는 잘되는데 몇몇 케이스에서 무한루프를 돕니다 . ㅠㅠ
이번주 문제 조이스틱입니다 !

문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

조이스틱을 각 방향으로 움직이면 아래와 같습니다.

▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.

  • 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
  • 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
  • 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
    따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
    만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
class Main {
   public static int solution(String name) {
       int answer = 0;
       int i = 0;
       char [] arr = new char[name.length()];
       boolean [] mm = new boolean[name.length()];

       for(int n =0;n<name.length();n++){ arr[n]='A'; }
       for(int n =0;n<name.length();n++){ mm[n]=true; }

      while (true){
           int n = name.charAt(i); // 뽑아온 문자
           int a = 65; // 기본적 문자는 모두 A
           int z = 90;
           if(n!=a&&n-a<z-n) {
               answer+=(n-a);
               arr[i]= name.charAt(i);
               mm[i] = false;
           } // A가 아니고 z보다 가까울 커서로 문자 변경
           if(n!=a&&n-a>z-n) {
               answer+=(z-n+1);
               arr[i]= name.charAt(i);
               mm[i] = false;
           } // A가 아니고 z에게 가까울 커서로 문자 변경
           int right = 0;
           int left = 0;
           for(int j=i;j<name.length()-1;j++){
               if(mm[j]==false){continue;}
               if(right==name.length()-1){
                   right=0;
                   break;
               }
               if(a!=name.charAt(j+1)){
                   right+=1;
                   break;
               }
               else{ right+=1; }
           }
           for(int j=name.length()-1;j>i;j--){
               if(mm[j]==false){continue;}
               if(left==name.length()-1){
                   left=0;
                   break;
               }
               if(a!=name.charAt(j)){
                   left+=1;
                   break;
               }
               else{ left+=1; }
           } // 지금 애는 2인데 5번움직여서 뒤에서 두번째 가고싶어
          // 오른쪽으로 가는거보다 왼쪽으로 가는게 더 가까우면 ?


            if(right!=0&&right<left){
               i += right;
               answer+=right;
           }else if(right>left){
               i = name.length()-left;
               answer+=left;
           }else if(right==left){
               i +=right;
               answer+=right;
           }
           String str =new String(arr);
          System.out.println(arr);
           if(name.equals(str)){ break; } // 종료조건
       }
       return answer;
   }

   public static void main(String[] args) {
       String name = "CANAAAAANAN"; //테스트 케이스 , 현재 CANAAAAAAAN  에서 무한루프입니다..ㅠ
       System.out.println(solution(name));
   }
}```

도움!!! 백준 1157번

Link : https://www.acmicpc.net/problem/1157
Input : 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
Output : 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString();
const txt = input.toUpperCase();
const set = [...new Set(txt)];
let result = "?";
let compareNumber = 0;
for(let i=0; i<set.length; i++){
    const char = set[i];

    let num = 0;

    for(let j=0; j<txt.length; j++){
        if(txt[j] === char)num++;
    }

    if(num>compareNumber){
        result = char;
        compareNumber = num;
    }
    else if(num===compareNumber){
        result = "?";
    }

}
console.log(result);

이게 보통 백준에서 틀리면 100프로 되기 전에 브레이크 걸리면서 틀렸습니다가 나오는데
100프로 됐는데 틀렸다고 나오는데 반례가 생각이 안남
도와주세요...

스크린샷 2021-01-02 오후 10 52 46

스킬트리 넘 어려움

테스트 케이스는 맞는데 실패가 너무많이 뜬다 이겁니다...

class Solution {
    public int solution(String skill, String[] skill_trees) {
        String first_skill = String.valueOf(skill.charAt(0));
        int result = 0;

        for(String leaf : skill_trees) {
            boolean correctFlag = true;
            if(skill.contains(first_skill) && !leaf.contains(first_skill)) {continue;}

            for (int i = 0; i<leaf.length(); i++) {
                // 스킬에 없는 문자라면 다음 문자로
                if(!skill.contains(String.valueOf(leaf.charAt(i)))) {continue;}

                // skill 의 첫번째 문자열에 해당하는 leaf 의 인덱스 저장
                int remember = leaf.indexOf(String.valueOf(skill.charAt(0)));
                boolean single = isSingleSkill(skill);

                // skill 이 두개 이상일 때
                if (!single) {
                    for (int j = 1; j < skill.length(); j++) {
                        int match = leaf.indexOf(String.valueOf(skill.charAt(j)));

                        // leaf 에서 스킬을 찾을 수 없다면 break;
                        if (match == -1) {
                            break;
                        }
                        // 선행 스킬 인덱스보다 현재 검사하고 있는 스킬 인덱스가 작다면 correctFlag 를 False 로
                        if (remember >= match) {
                            correctFlag = false;
                            break;
                        } else {
                            remember = match;
                        }
                    }
                    if (!correctFlag) {
                        break;
                    }
                }
            }
            if (correctFlag) {
                ++result;
            }
        }

        return result;
    }

    private boolean isSingleSkill(String skill) {
        return skill.length() == 1;
    }

}

멘탈 와장창
이거 머가 잘못된걸까...

브3도 못푸는 수준

직각삼각형을 구하랍니다!

https://www.acmicpc.net/problem/4153

image

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        while(true) {
            String[] arr = br.readLine().trim().split(" ");

            double x = Integer.parseInt(arr[0]);
            double y = Integer.parseInt(arr[1]);
            double z = Integer.parseInt(arr[2]);

            if (x == 0 && y == 0 && z ==0){
                break;
            }

            if (((int)Math.pow(x, 2) + (int)Math.pow(y, 2)) == (int)Math.pow(z, 2)) {
                bw.write("right" + "\n");
            } else {
                bw.write("wrong" + "\n");
            }
            bw.flush();

        }

        bw.close();
        br.close();
    }
}

이게 왜틀림?!!

무식하게 푼 문제가 하나 있는데 유식하게 풀 수 있는 방법이 있을까?

https://www.acmicpc.net/problem/2231

정수 N이 주어졌을 때 N과 N의 각 자리수들의 합을 분해합이라고 하는데 (분해해서->합한다)

이 분해합을 만들 수 있는 정수 N을 분해합의 생성자라고 한다고 함.

예를 들어 ( 123 => 123+1+2+3 => 129 ) 에서 123은 129의 생성자이고 129는 123의 분해합임.

그리고 어떤 분해합에 대해 여러개의 생성자가 있을 수 있는데

문제는 어떤 분해합의 최소 생성자를 찾는 것

const NtoM = (N:number) : number=>{
    const num : number = N;
    const arr:number[] = N.toString().split("").map(elem=>+elem);

    let M = 0;
    for(let i=0; i<arr.length; i++){
       M += arr[i];
    }

    return M+num;
}

const MtoN = (M:number) : number => {
    let NArr:number[] = M.toString().split("").map(elem=>+elem);
    let firstValue;

    if ( NArr[0]-1 > 0 )
        firstValue = (NArr[0]-1) * Math.pow(10, NArr.length-1);
    else
        firstValue = 9 * Math.pow(10, NArr.length-2);

    let N = 0;
    for(let n=firstValue; n<M; n++){
        const Nv=NtoM(n)
        if(Nv === M){
            N = n;
            break;
        }
    }

    return N;
}

이런 식으로 해서 어떤 분해합이 주어졌을 때 분해합의 가장 큰 자리의 값을 -1만큼 빼서(100이면 90, 200이면 100)
거기서부터 반복문 돌려서 찾게 했는데
정답은 처리가 됐는데 더 좋은 아이디어가 있을까 싶어서...
백준은 효율성 이런 건 점수를 안쳐주다보니 여쭤봅니다

브론즈5 1271번

입력
첫째 줄에는 최백준 조교가 가진 돈 n과 돈을 받으러 온 생명체의 수 m이 주어진다. (1 ≤ m ≤ n ≤ 101000, m과 n은 10진수 정수)

출력
첫째 줄에 생명체 하나에게 돌아가는 돈의 양을 출력한다. 그리고 두 번째 줄에는 1원씩 분배할 수 없는 남는 돈을 출력한다.

이하 소스 코드
사용 언어 node.js

const fs = require('fs'); // 파일시스템 모듈
const arr = fs.readFileSync('/dev/stdin').toString().split(' '); //백준 인풋 파일 설정
const max = Math.floor(+arr[0] / +arr[1]);
const extra = +arr[0] % +max; // 나머지값
console.log(max + '\n' + extra); // 출력

////

첨엔 스위프트로 해보려다가 문법이 많이 낯설어서 쓰기 쉬운 js로 넘어왔는데

브론즈5라고 얕봤는데 졸면서 하다가 이것조차도 못푸는 게 화딱지가 나서 고양이 찍는 문제 풀었음.

스크린샷 2020-12-29 오전 12 39 28

빠르게 풀수 있는 방법이 있을까요 ?

https://www.acmicpc.net/problem/10816

**문제**
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 
상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 
이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
**입력**
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 
둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 
숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 
넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 
이 수는 공백으로 구분되어져 있다.
 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다
**출력**
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 
각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> list = new ArrayList<>();

        int n = sc.nextInt();

        for (int i = 0; i < n; i++) {
            int num = sc.nextInt();
            list.add(num);
        } // 숫자 입력받기 .

        int num = sc.nextInt();
        int[] arr = new int[num];

        for (int j = 0; j < num; j++) {
            int number = sc.nextInt();
            for (int i = 0; i < n; i++) {
                if (list.get(i) == number) {
                    arr[j] += 1;
                }
            }
        }
        for(int i=0;i<num;i++){
            System.out.print(arr[i]);
            if(i<num-1){
                System.out.print(" ");
            }
        }
    }
} ```

테스트 해본 모든 케이스는 정상으로 출력되지만 시간초과로 채점이 안됩니다 . 
혹시 더빠르게 풀수 있는 방법이 뭐 있을까요 .. 문제일까요..

+ BufferedWriter는 출력시 알수없는 문자로 출력이 되고 ,
BufferedReader 는 런타입 오류 뿜습니다 ..! 

백준 10809 반례찾기좀 도와주세요

https://www.acmicpc.net/problem/10809

스크린샷 2021-01-02 오후 3 36 40

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        String context = br.readLine().trim();
        int[] alpha = new int[26];
        Arrays.fill(alpha, -1);
        int cnt = 0;
        int[] context_arr = new int[context.length()];
        int tmp = -1;
        for(int i=0; i<context.length(); i++) {
            context_arr[i] = context.charAt(i)-97;
            if (context_arr[i] == tmp) {
                alpha[context_arr[i]] = alpha[context_arr[i]];
            } else {
                alpha[context_arr[i]] = cnt;
            }
            tmp = context_arr[i];
            cnt ++;
        }
        for (int n : alpha) {
            sb.append(n+" ");
        }
        bw.write(sb.toString().trim());
        bw.flush();
        bw.close();
        br.close();
    }
}

스크린샷 2021-01-02 오후 3 37 31

스크린샷 2021-01-02 오후 3 38 03

스크린샷 2021-01-02 오후 3 38 25

분명히 잘 푼거같은데 계속 틀렸다고 나오네요;;;

뭐가문제일까요..

이번주 조이스틱 ..

1~ 8까지 전부 해봤는데 잘되는데 100은 안댐.. 도대체 왜그러는지 모르겠삼.. 흑흑 살려주세요ㅕ...
주석은 무시 해주세요 ..

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {


    public static int[] solution(int number) {
        int[] answer = {};
        int n = number;
        int num = 0;
        for (int i = 1; i <= number; i++) {
            num += i;
        }
        int[] arr = new int[num];  //배열 길이 설정 완료 :)
        //i , i+1,
        if (number < 2) {
            arr[0] = 1;
        } else {
            arr[0] = 1;
            arr[1] = 2;
        }
        int index = 3; // 인덱스 가쥬앙
        for (int i = 2; i < n; i++) {
            //피라미드 처음에 내려오는거 .
            arr[index] = i + 1;
            index += i + 1;

        }
        index -= n;

        for (int i = index + 1; i < num; i++) {
            //갑니다 인덱스 부터 ~~
            n += 1;
            arr[i] = n;

        }  // 밑에 하단 완료!
        index = num - 1; // 현재 인덱스는 배열끝임
        //거꾸로 올라가자
        for (int i = number; i > 2; i--) {
            index -= i;
            n += 1;
            arr[index] = n;
        }
        index += 2;
        //   System.out.println("현재인덱스" + index);
        //    System.out.println(n);// 한바퀴후 인덱스
        int b = 3;
        int d = number-1;

        if(number>3) {
            while (true) {
                //   System.out.println("현재인덱스" + index);
                //현재 인덱스는 4;
                n += 1;
                arr[index] = n;
                if (arr[index + b] != 0) {
                    if (arr[index + 1] == 0) {
                        index += 1;
                    } else if (arr[index + 1] != 0) {
                        //13 884
                        if(arr[index-d]!=0){
                            index+=d;
                            d+=1;
                        }else {
                            index -= d;
                            d--;
                        }
                    }

                } else {
                    index += b;
                    b += 1;
                }
                if (n == num) { 
                    break;
                }
            }
        }

        answer = Arrays.stream(arr).toArray();

        System.out.print("[ ");
        for (int i = 0; i < answer.length; i++) {
            System.out.print(answer[i] + ",");
        }
        System.out.print(" ] ");


        return answer;
    }

    public static void main(String[] args) {

        solution(8); 
    }

} ```

StringIndexOutOfBounds 도움좀 주십쇼 ㅠ

//https://www.acmicpc.net/problem/1259

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다.
 'radar', 'sees'는 팰린드롬이다.
수도 팰린드롬으로 취급할 수 있다. 
수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 
123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 
앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 
특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

**입력**
입력은 여러 개의 테스트 케이스로 이루어져 있으며, 
각 줄마다 1 이상 99999 이하의 정수가 주어진다. 
입력의 마지막 줄에는 0이 주어지며, 
이 줄은 문제에 포함되지 않는다.

**출력**
각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);


        ArrayList list = new ArrayList();

        while (true){
        //    System.out.println("입력");
            String str = sc.nextLine();
            String str2 = "";
            String str1 = "";
            if(str.equals("0")){
                break;
            }
            if(str.length()>4){
                if ((str.length()+1)% 2 == 0) {
                    str1= str.substring(0,(str.length()+1)/2);
                    str2 = str.substring((str.length()-1)/2, str.length());
                } else {
                    str1= str.substring(0,(str.length()+1)/2);
                    str2 = str.substring((str.length()+1)/2, str.length());
                }
            }else {
                if((str.length()+1)%2==0){
                    str1= String.valueOf(str.charAt(0));
                    str2=String.valueOf(str.charAt(2));
                }else {
                    str1= str.substring(0,(str.length()+1)/2);
                    str2=str.substring((str.length()+1)/2,str.length());
                }
            }
        //    System.out.println(str1);
        //    System.out.println(str2);
            if(str1.equals(new StringBuffer(str2).reverse().toString())){
                list.add("YES");
            }else {
                list.add("NO");
            }
        }
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i));
            if(i< list.size()-1){
                System.out.println();
            }
        }

    }
}

제가 할수 있는 모든 테스트를 해보았는데 오류가 전혀안뜨는데 백준에서만 오류가뜹니다 ㅠ
10분넘게 계속 반복중.. 헬프미 ㅠ

지정문제 순위검색 푸신 분??

정확성은 넘어갔는데 효율성에서 떨어지네

효율성도 시간초과가 나오는 거 보면

인포를 미리 어떻게 잘게 쪼개놓고 쿼리에 맞춰서 바로바로 접근해야할 거 같은데

어떤 아이디어가 필요할까 흠..

function solution(info, query) {
    const table = info.map( string=>{
        const eachInformation = string.split(" ");
        return {
            lang : eachInformation[0],
            area : eachInformation[1],
            level: eachInformation[2],
            food : eachInformation[3],
            score: eachInformation[4]
        };
    });

    const queryString = query.map(
        elem => {
            const array = elem.split(" ").filter(string=>string != "and");
            return {
                lang : array[0],
                area : array[1],
                level: array[2],
                food : array[3],
                score: array[4]
            }
        }
    )

    let ret = [];
    for (const finder of queryString) {
        let count = 0;

        for(const row of table){
            
            if( ( finder.lang === "-" || finder.lang === row.lang )
            &&  ( finder.area === "-" || finder.area === row.area )
            &&  ( finder.level=== "-" || finder.level=== row.level )
            &&  ( finder.food === "-" || finder.food === row.food )
            &&  ( finder.score=== "-" || +finder.score <= +row.score )
            ) count++;
        }

        ret.push(count);
    }
    return ret;
}

스터디 횐님덜.... 도와주세요...

https://www.acmicpc.net/problem/1018

8*8의 체스판을 만들어야 하는 문제

일단 무식하게라도 풀고 싶어서
원본 행렬을 각 지점에서 8*8만큼 순회하면서
처음 지점의 좌표의 합이 짝수면 앞으로의 짝수지점은 전부 처음 지점의 값과 같아야 한다 라는 생각으로 함수를 만들었음.

예를 들어 원본 행렬이 아래와 같다고 하고
WBWBWB
WBWBWB
WBWBWB
WBWBWB
WBWBWB
간소화한 예를 들기 위해 4*4의 체스판을 만든다고 할때 [0,0]에서 순회를 시작하면
[0,0]에서 0+0 %2 => 0 이므로 앞으로 x+y가 짝수인 애들은 전부 W이어야함. 또 x+y가 홀수인 애들은 B이어야함.
[0,1]에서 0+1 %2 => 1 이므로 앞으로 x+y가 홀수인 애들은 전부 B이어야함. 또 x+y가 짝수인 애들은 W이어야함.

이런 함수를 하나 짰음

다바꾼다쳐도 8*8을 만들때는 최댓값이 64이므로 기본값으로 65를 줬음

자꾸 오답뜨는데 원인을 못찾겟음...

이하 소스코드

import fs = require("fs");
const input:string[] =  fs.readFileSync("/dev/stdin").toString().trim().split("\n").map(elem=>elem.trim());
const getWrongCntFrom = (y:number, x:number) => {
    const startValue = board[y][x];
    const isOdd = (y+x)%2;

    let cnt = 0;

    for(let i=y; i<y+8; i++){

        for(let j=x; j<x+8; j++){

            if( (i+j)%2 === isOdd){
                if(board[i][j] !== startValue) cnt++;
            }
            else{
                if(board[i][j] === startValue) cnt++;
            }
        }

    }

    return cnt;
}

const [yLength, xLength] : number[] = input.shift().split(" ").map(elem=>+elem);
const board : string[][] = input.map( elem=>elem.split(""));

let minCnt:number = 65;

for(let y=0; y<yLength-7; y++){
    for(let x=0; x<xLength-7; x++){
        let wrongCountNow = getWrongCntFrom(y,x);
        minCnt = Math.min(minCnt, wrongCountNow);
    }
}

console.log(minCnt);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.