[코드트리] 행복한 수열의 개수

2024. 9. 29. 23:18·PS

 

 


 

문제

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

 

개념

구현, 격자 안에서 완전탐색 

 

 

실행 결과

 

 

 

 

 

구현 코드(c++)

#include <iostream>
using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, m;
  cin >> n >> m;
  int arr[100][100];

  // 격자 입력 받기
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> arr[i][j];
    }
  }

  int happy = 0;

  // 행 검사
  for (int i = 0; i < n; i++) {
    int cnt = 1;
    for (int j = 1; j < n; j++) { // j는 1부터
      if (arr[i][j] == arr[i][j - 1]) {
        cnt++;
      } else {
        cnt = 1;
      }
      if (cnt >= m) {
        happy++;
        break;  // 중복 검사 방지용 건너뛰기
      }
    }
  }

  // 열 검사
  for (int j = 0; j < n; j++) {
    int cnt = 1;
    for (int i = 1; i < n; i++) {
      if (arr[i][j] == arr[i - 1][j]) {
        cnt++;
      } else {
        cnt = 1;
      }
      if (cnt >= m) {
        happy++;
        break;
      }
    }
  }

  if (n == 1 && m ==1)
    cout << 2;
  else
      cout << happy;
  
  return 0;
}

 

 

 

 

코드 설명

행복한 수열은 연속하여 m개 이상의 동일한 원소가 나오는 순간이 존재하는 수열이다.

그리고 아래에서 행과 열마다 총 2*n개의 수열이라고 생각하라고 말하고 있다.

따라서 행복한 수열의 개수를 셀 때도, 행과 열을 나누어 생각해야 한다.

 

행 검사

for (int i = 0; i < n; i++) {
    int cnt = 1;
    for (int j = 1; j < n; j++) {
        if (arr[i][j] == arr[i][j - 1]) {
            cnt++;
        } else {
            cnt = 1;
        }
        if (cnt >= m) {
            happy++;
            break;
        }
    }
}

 

먼저 arr[0][0]을 기준으로 arr[0][1].. arr[0][n-1]까지 검사하면서

해당 행(가로줄)에서 연속된 숫자가 나올때마다 cnt를 증가시킨다.

만약 연속된 수가 나오지 않으면 바로 1로 바꾸면서 초기화한다.

m이상이면 행복한 수열이므로 행복한 수열의 개수인 happy를 증가시킨다.

 

 

열 검사

for (int j = 0; j < n; j++) {
    int cnt = 1;
    for (int i = 1; i < n; i++) {
        if (arr[i][j] == arr[i - 1][j]) {
            cnt++;
        } else {
            cnt = 1;
        }
        if (cnt >= m) {
            happy++;
            break;
        }
    }
}

 

행 검사와 동일한 방식이지만 i를 이전 값과 비교할 때 상하로 움직이며 검사한다.

 

 

예외 처리 ⚠️

  if (n == 1 && m == 1)
    cout << 2;
  else
      cout << happy;

 

사실 이 부분 때문에 틀렸는데.. n과 m이 1인 경우

행으로 돌리나 열로 돌리나 똑같이 1씩 증가하여 happy가 2가 된다.

만약 테스트케이스가 없었다면 알아차리지 못할 예외였기 때문에 꼭 기억해두자.

 

 


 

 

저작자표시 (새창열림)

'PS' 카테고리의 다른 글

[백준] 10830번: 행렬 제곱  (0) 2024.10.08
[백준] 2178번: 미로 탐색  (5) 2024.10.01
[백준] 1260번: DFS와 BFS  (0) 2024.09.29
[백준] 1475번: 방 번호  (0) 2024.09.25
[백준] 5585번: 거스름돈  (0) 2024.09.24
'PS' 카테고리의 다른 글
  • [백준] 10830번: 행렬 제곱
  • [백준] 2178번: 미로 탐색
  • [백준] 1260번: DFS와 BFS
  • [백준] 1475번: 방 번호
abyss-s
abyss-s
프론트엔드 개발합니다!
  • abyss-s
    abyss-s의 블로그입니다.
    abyss-s
  • 전체
    오늘
    어제
    • 분류 전체보기 (192)
      • Web (16)
        • JavaScript (6)
        • TypeScript (1)
        • React (5)
        • Vue (0)
        • Storybook (1)
        • Next.js (1)
      • Backend & Infra (8)
        • Database (3)
        • Node.js (2)
        • SpringBoot (1)
      • PS (71)
      • CS (30)
        • OS (13)
        • Structure & Algorithm (5)
        • Network (10)
        • 정보처리기사 (2)
      • Language (18)
        • OOP (1)
        • JAVA (13)
        • C++ (4)
      • Activities (16)
        • 멋쟁이 사자처럼 (2)
        • OSSCA (3)
        • LG U+ URECA (5)
        • Project (2)
        • Conference (1)
      • IT (3)
      • AI (0)
      • Git & Github (5)
      • Notion (1)
      • Statistics (11)
      • Book (5)
      • Diary (1)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 백준
    • 트위터
  • 공지사항

    • abyss-s의 티스토리에 오신 것을 환영합니다.
  • 인기 글

  • 태그

    백준
    github
    C++
    코드트리
    그리디
    Python
    파이썬
    JavaScript
    생활코딩
    BAEKJOON
    운영체제
    네트워크
    DP
    통계학
    OS
    React
    자바스크립트
    자바기반응용프로그래밍
    BFS
    Java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
abyss-s
[코드트리] 행복한 수열의 개수
상단으로

티스토리툴바